2017-07-13 10 views
0

は保存されません。CMDバッチ変数は、私がWEBMへのMP4動画のフォルダを変換しますCMDのバッチスクリプトを持ってFFprobe出力

次のものが必要です。

  • FFmpeg/FFprobeがインストールされ、CMDから実行のための環境変数に設定してください。
  • mp4 for FFprobeが解析されるフォルダ。

それを容易にする、これはVideo Bitrate変数を示す、スクリプトの最初の部分だけです。

完全なスクリプトですが、パスを置き換えてください。スクリプトのしくみ
https://pastebin.com/raw/3ng77Exz

  • ループのすべての動画を通じてフォルダ
  • にFFprobeは、ビデオのビットレートを解析し、%V%vBitrate%に保存します持っています。
  • FFmpegは%Vです。 -b:v %Vなどは、解析された値 -b:v 9401kになります。
  • 私は変数に保存するFFprobeの出力を得ることができない問題


解析されたビットレートを使用してWEBMにMP4から各ビデオを変換します。私は回避策を考え出しました。最初にビットレートの値をtemp fileに保存してから、それを%vBitrate%変数にインポートします。

例:(%V > tmp_vBitrate) & SET /p vBitrate= < tmp_vBitrate


作品


cd "C:\Users\Matt\Videos\" && for %f in (*.mp4) do ffprobe -i "C:\Users\Matt\Desktop\Test\%~f" -select_streams v:0 -show_entries stream=bit_rate -v quiet -of csv="p=0" & for /f "tokens=*" %V in ("ffprobe -i "%~f" -select_streams v:0 -show_entries stream=bit_rate -v quiet -of csv=p=0") do (echo) & (%V > tmp_vBitrate) & SET /p vBitrate= < tmp_vBitrate & del tmp_vBitrate & for /F %V in ('echo %vBitrate%') do (echo %V) 
が機能しない一時ファイルの変数

メモリ変数

cd "C:\Users\Matt\Videos\" && for %f in (*.mp4) do ffprobe -i "C:\Users\Matt\Desktop\Test\%~f" -select_streams v:0 -show_entries stream=bit_rate -v quiet -of csv="p=0" & for /f "tokens=*" %V in ("ffprobe -i "%~f" -select_streams v:0 -show_entries stream=bit_rate -v quiet -of csv=p=0") do (echo) & SET vBitrate=%V & for /F %V in ('echo %vBitrate%') do (echo %V) 

テストそれ

最初のコマンドを実行します。完了したら、CMDにecho %vBitrate%と入力し、Enterキーを押します。最後に解析されたmp4ファイルのビットレートが表示されます。

2番目のコマンドでも同じ操作を行い、動作しないことがわかります。


ソリューション

私は Temp File Variableを取り除くと、2番目のコマンドが動作するためにゲットしたいと思います。

(%V > tmp_vBitrate) & SET /p vBitrate= < tmp_vBitrateからSET vBitrate=%Vまでです。

多分、この全体を簡略化することはできますか?私は間違った変数を使用していますか?

+0

[遅れ拡張](http://ss64.com/nt/delayedexpansion.html)を見てみましょう...そして、何 '%のV> tmp_vBitrate'を行うことになっていますか? '%'は反復されたファイルであると理解しています... 'for'ループ変数の場合、バッチファイル(' %% V 'のような)の '%' -signsを二倍にする必要があることに注意してください... – aschipfl

+0

a [mcve]は腎臓の部位を参照しないでください。コマンドの出力を解析するには 'for/f'を使います。http://ss64.com/nt/for_cmd.htmlを見てください。[Frequent ffmpeg Q&A](https://stackoverflow.com/questions/tagged/ffmpeg? – LotPings

+2

私は 'ffprobe'に慣れていませんが、' ffmpeg'がファイル解析をstderrにダンプすることがわかりました。あなたの 'probe'コマンドに' 2 ^> ^&1'を追加してみてください。 – rojo

答えて

1

私は2^>^&1で異なるFFmpegコマンドを使用してこれを解決したと思います。

これで、一時ファイルを使用して変数を設定することがなくなりました。

ビデオビットレート

for /F "delims=" %V in ('@ffprobe -v error -select_streams v:0 -show_entries stream^=bit_rate -of default^=noprint_wrappers^=1:nokey^=1 "%~f" 2^>^&1') do (SET vBitrate=%V) & for /F %V in ('echo %vBitrate%') do (echo %V) 

オーディオビットレート

for /F "delims=" %A in ('@ffprobe -v error -select_streams a:0 -show_entries stream=bit_rate -of default^=noprint_wrappers^=1:nokey^=1 "%~f" 2^>^&1') do (SET aBitrate=%A) & for /F %A in ('echo %aBitrate%') do (echo %A) 

全スクリプトここ

mp4を変換するフルbatch scriptですを入力し、video birate = (((size * 8)/1000)/duration) * 1000を使用して自動的にビットレートを計算して一致させます。

cd "C:\Users\Matt\Videos\" && for %f in (*.mp4) do (for /F "delims=" %S in ('@ffprobe -v error -select_streams v:0 -show_entries format^=size -of default^=noprint_wrappers^=1:nokey^=1 "%~f" 2^>^&1') do (SET size=%S) & for /F %S in ('echo %size%') do (echo %S) & for /F "delims=" %D in ('@ffprobe -v error -select_streams v:0 -show_entries format^=duration -of default^=noprint_wrappers^=1:nokey^=1 "%~f" 2^>^&1') do (SET duration=%D) & for /F "tokens=1 delims=." %R in ('echo %duration%') do (SET duration=%R) & for /F %D in ('echo %duration%') do (echo %D) & for /F "delims=" %V in ('@ffprobe -v error -select_streams v:0 -show_entries stream^=bit_rate -of default^=noprint_wrappers^=1:nokey^=1 "%~f" 2^>^&1') do (SET vBitrate=%V) & for /F %V in ('echo %vBitrate%') do (echo %V) & (if %V EQU N/A (SET /a vBitrate=%S*8/1000/%D*1000) ELSE (echo Video Bitrate Detected)) & for /F %V in ('echo %vBitrate%') do (echo %V) & for /F "delims=" %A in ('@ffprobe -v error -select_streams a:0 -show_entries stream=bit_rate -of default^=noprint_wrappers^=1:nokey^=1 "%~f" 2^>^&1') do (echo) & SET aBitrate=%A & for /F %A in ('echo %aBitrate%') do (echo %A) & (IF %A EQU N/A (SET aBitrate=320000)) & for /F %A in ('echo %aBitrate%') do (echo %A) & (IF %A gtr 500000 (SET aBitrate=500000) ELSE (echo Bitrate within Vorbis Limit of 500k)) & for /F %A in ('echo %aBitrate%') do (echo %A) && ffmpeg -y -i "C:\Users\Matt\Videos\%~f" -vcodec libvpx -quality good -cpu-used 0 -b:v %V -pass 1 -acodec libvorbis -b:a %A -map 0:v:0? -map 0:a:0? -sn -map_metadata 0 -threads 8 "C:\Users\Matt\Videos\%~nf.webm" && ffmpeg -y -i "C:\Users\Matt\Videos\%~f" -vcodec libvpx -quality good -cpu-used 0 -b:v %V -pass 2 -acodec libvorbis -b:a %A -map 0:v:0? -map 0:a:0? -sn -map_metadata 0 -threads 8 "C:\Users\Matt\Videos\%~nf.webm") 
関連する問題