前回の続き。
このバッチはひとつずつのwavファイルは処理できるけど、複数のwavファイルを一度に放り込んでも、正しく動きません。理由は説明すると長くなるので、まあ単に、前述のスクリプトでは対応できない…ということになるんですが。
それでは、こいつをもっと便利にするために、複数ファイルのD&Dを可能にするには、どうすればいいのか…?
複数ファイルのD&Dに対応するには、以下のような感じにする、と、検索したら出てきました。
というわけでこれをベースに、ffmpegの複数エンコードを可能にするバッチを作ってみます。
これを見ると、「:loop」というサブルーチンで、D&Dされたファイルについてひとつずつ処理を行い、すべて処理を終えたら、「:end」へ行くという流れになっている。
つまりこのプログラムを解釈すると、以下のようになる。
つまり4行目の処理を行う部分に、前回のffmpegエンコード処理を入れてしまえばいいということになる。
単純にねじ込んでしまうと、こんな感じになる。
さあこれでどうだろう?…まあ、動きませんよね。
前回のfilename1に相当する入力パスが、ここでは「%~1」になるので、実は、filename1の変数はもう必要ないのです。なので、
こうなります。
end処理に、pauseで「何かキーを押してください…」と表示させる動きから、処理終了したら自動的にDOS窓を閉じる動きに変更してみました。BASICのノリでendと書きそうですが、ここはendじゃなくてexitなんですね。そうなんだ~。
あとは余談的な話なんですが、単にffmpeg.exe~と記述するのではなく「start ffmpeg.exe~」と書くと、複数ファイルをD&Dしたときになんとffmpegが並列してエンコードするようになります。なんだこれ。
フルパワーで複数ファイルをエンコードするのはいいけど、別にそんなに急ぐ必要もないので、ここでは普通に「ffmpeg.exe~」または「call ffmpeg.exe~」と書いたほうが無難と思われます。
というか昔(十数年ぐらい前)、mp3エンコードしながら他の処理をやってたらエンコードがエラーになって、出来上がったmp3が無音になっていたという、そういう過去があったんですよ。だから、1個ずつ確実にやったほうがいいなーっていう、自分の考えなのでした。
(おわり)
このバッチはひとつずつのwavファイルは処理できるけど、複数のwavファイルを一度に放り込んでも、正しく動きません。理由は説明すると長くなるので、まあ単に、前述のスクリプトでは対応できない…ということになるんですが。
それでは、こいつをもっと便利にするために、複数ファイルのD&Dを可能にするには、どうすればいいのか…?
複数ファイルのD&Dに対応するには、以下のような感じにする、と、検索したら出てきました。
というわけでこれをベースに、ffmpegの複数エンコードを可能にするバッチを作ってみます。
(例6a)
@echo off
:loop
if "%~1" == "" goto end
echo %1
shift
goto loop
:end
pause
@echo off
:loop
if "%~1" == "" goto end
echo %1
shift
goto loop
:end
pause
これを見ると、「:loop」というサブルーチンで、D&Dされたファイルについてひとつずつ処理を行い、すべて処理を終えたら、「:end」へ行くという流れになっている。
つまりこのプログラムを解釈すると、以下のようになる。
(例6b)
@echo off
:loop →(ループ処理)
if "%~1" == "" goto end →(D&Dのファイルが尽きたら、終了フェーズへ)
echo %1 →(D&Dされた内容について処理を行う)
shift →(次のD&Dファイルに進む)
goto loop →(ループの最初に戻る)
:end →(終了フェーズ)
pause
@echo off
:loop →(ループ処理)
if "%~1" == "" goto end →(D&Dのファイルが尽きたら、終了フェーズへ)
echo %1 →(D&Dされた内容について処理を行う)
shift →(次のD&Dファイルに進む)
goto loop →(ループの最初に戻る)
:end →(終了フェーズ)
pause
つまり4行目の処理を行う部分に、前回のffmpegエンコード処理を入れてしまえばいいということになる。
単純にねじ込んでしまうと、こんな感じになる。
(例7)
cd [ffmpeg.exeのある場所]
:loop
if "%~1" == "" goto end
set filename1=%*
set filename2=%~p1%~n1.mp3
ffmpeg.exe -i "%filename1%" -ab 192k "%filename2%"
shift
goto loop
:end
pause
cd [ffmpeg.exeのある場所]
:loop
if "%~1" == "" goto end
set filename1=%*
set filename2=%~p1%~n1.mp3
ffmpeg.exe -i "%filename1%" -ab 192k "%filename2%"
shift
goto loop
:end
pause
さあこれでどうだろう?…まあ、動きませんよね。
前回のfilename1に相当する入力パスが、ここでは「%~1」になるので、実は、filename1の変数はもう必要ないのです。なので、
(例8)
cd [ffmpeg.exeのある場所]
:loop
if "%~1" == "" goto end
set filename2=%~p1%~n1.mp3
ffmpeg.exe -i "%~1" -ab 192k "%filename2%"
shift
goto loop
:end
exit
cd [ffmpeg.exeのある場所]
:loop
if "%~1" == "" goto end
set filename2=%~p1%~n1.mp3
ffmpeg.exe -i "%~1" -ab 192k "%filename2%"
shift
goto loop
:end
exit
こうなります。
end処理に、pauseで「何かキーを押してください…」と表示させる動きから、処理終了したら自動的にDOS窓を閉じる動きに変更してみました。BASICのノリでendと書きそうですが、ここはendじゃなくてexitなんですね。そうなんだ~。
あとは余談的な話なんですが、単にffmpeg.exe~と記述するのではなく「start ffmpeg.exe~」と書くと、複数ファイルをD&Dしたときになんとffmpegが並列してエンコードするようになります。なんだこれ。
フルパワーで複数ファイルをエンコードするのはいいけど、別にそんなに急ぐ必要もないので、ここでは普通に「ffmpeg.exe~」または「call ffmpeg.exe~」と書いたほうが無難と思われます。
というか昔(十数年ぐらい前)、mp3エンコードしながら他の処理をやってたらエンコードがエラーになって、出来上がったmp3が無音になっていたという、そういう過去があったんですよ。だから、1個ずつ確実にやったほうがいいなーっていう、自分の考えなのでした。
(おわり)