2017-10-28 14 views
0

私は、ffprobeクエリの出力を処理するバッチファイルを持っています。いくつかのffmpegディレクティブを決定するために使用するいくつかのデータビットを取得します。特に、ビデオフレームの高さが720以上の場合、h264ビデオをh265に変換しています。私もオーディオストリームをaacに変換します。まだ128kbps以上であれば128に変換します。標準出力からカンマ区切り値を設定する方法は?

ffprobeを何度も呼び出すことで、私のffmpegコマンドが何になるかを決めるステートメント。

バッチファイルをより効率的にしたいので、1つ(おそらく2つ)のffprobeクエリの出力を取り、その出力を/ fトークン=ループを作成すると、各ffprobeデータポイントを変数に設定して、変数をチェックしてffmpegコマンドの結果を決定することができます。

ここでは、ビデオストリームがhevcであるかどうかを簡単に確認する方法を示します。そうでなければ、ffmpegはビデオをhevcに変換し、オーディオをaacにコピーします。

for %%a in ("*.*") do (
ffprobe -v quiet -show_entries stream=index,codec_name,height -of csv "%%a" 2>&1 | findstr "hevc" 
if errorlevel 1 (
    ffmpeg.exe -hwaccel cuvid -i "%%a" -pix_fmt p010le -c:v hevc_nvenc -preset slow -rc vbr_hq -b:v 4M -maxrate:v 10M -c:a aac "%%~na.h265-convert.mp4" 
)) 

ffprobeクエリ出力は次のように見えること:

stream,0,h264,480 

私のようなもので、その出力をトークン化することができれば、私は考えていた:私は入れているかわからない

for /f "tokens=1,2,3,4 delims= " %%a in ("______") do set codec=%%b&set fheight=%%d 

私が_______を持っている場所で。私は本当にそれが唯一のオプションでない限り、一時ファイルを作成したくありません。

1)これは私がやろうとしていることを達成するための効率的な方法ですか?

2)私のforループで使用するffprobeクエリの出力を呼び出すために、________の上に空白行がある場合は何を使用しますか?

+0

について1)、あなたがすでに認識しているように、バッチは文字列解析のためのお尻に加えてffprobe出力を解析するのが難しいです。私はhttps:// stackoverflowに言及したように、mediainfoを置き換えてお勧めします。com/questions/32344947/ffmpeg-batch-extraction-media-duration-and-a-text-file – Harry

+0

それは考えです。私は何かのためにMediaInfo CLIを使います。私はそれを考えなかった。 – gregm

答えて

0
for /f "tokens=1,2,3,4 delims= " %%a in (
'ffprobe -v quiet -show_entries stream=index,codec_name,height -of csv "%%a" 2^>^&1 ^| findstr "hevc"' 
) do set codec=%%b&set fheight=%%d 

あなたはfor文内で指定したffprobeコマンドを実行する必要があります。

,もまた、キャレット^でエスケープする必要がある可能性があります。

キャレットは、forではなく、実行するコマンドの一部として受け入れられるように、リダイレクタ文字をエスケープします。

、コマンドを実行しますが、お勧めの出力を考えると'single quotes'

でそれを囲んで、私はそれがhevcを含んでいないので、それはhevcためfindstrフィルタを介して取得することになるでない方法を見ることはできません。 SOにここに例の千 - また、ヨーヨーの言及は、カンマ区切りで出力するので、delimsオプションがはないスペース

は、ドキュメントのプロンプトからfor /?を参照してくださいする必要があります。

+0

私はそれを少しでもやってみる必要がありますが、うまくいくようです。 findstrビットは、hevcが見つからない場合、ffmpegがどこで処理しているのかを調べています。この方法でfindstrを使う必要はありません。 – gregm

+0

'findstr'の'/v'スイッチは、ターゲット文字列が見つからない行を検出して報告します。 – Magoo

+0

ここに私が持っているものがありますが、何らかの理由で変数が設定されていません。私が以下を実行すると、変数が設定されていない/空でない場合に得られる出力の「犬」が得られます。 'for %% a in(" *。* ")do( \t/f "tokens = * delims =、" %% a in( 'ffprobe -v quiet -select_streams v:0 -show_entriesストリーム^ =インデックス^、codec_name ^、csvの高さ "%% a" 2 ^> ^&1 「)( \t \t金魚 \t) エコー)コーデック= %% C&fheight設定= %% D \t場合/私は "%コーデック%" == ""( \t \tは犬 \tエコー)それ以外を設定します' – gregm

関連する問題