2017-03-28 8 views
0

このバッチファイルはffmpegを使用してビデオにロゴを追加してからイントロを追加しますが、透かしを入れなければならない人の数に応じて10時間から1日はかかります。ビデオの解像度が異なることがあるので、1280 * 720サイズへの変換を取り除くことはできません。ffmpegを使って透かし入れして動画を一括してより効率的に利用できる方法はありますか?

for %%I in ("C:\Users\Administrator\Desktop\work\*.mp4") do ffmpeg.exe -y -i "%%I" -i white.png -filter_complex "[0:v]scale=iw:ih[v0];[1:v][v0]scale2ref=iw/6:ih/18[logo][0v];[0v][logo]overlay=W-w-3:H-h-1[v]" -map "[v]" -map 0:a -codec:v libx264 -preset ultrafast -crf 23 -codec:a copy "C:\Users\Administrator\Desktop\Complete-videos\%%~nI.mp4" 

for %%I in ("C:\Users\Administrator\Desktop\work\*.mp4") do ffmpeg -y -i %%I -c copy -vbsf h264_mp4toannexb -f mpegts -s 1280*720 %%I.ts && ffmpeg -y -i "concat:out1.ts|%%I.ts|out1.ts" -c:v libx264 -strict experimental -bsf:a aac_adtstoasc -ar 48000 -r 20 "C:\Users\Administrator\Desktop\Complete-videos\%%~nI.mp4" 
pause 
+2

[コードレビュー](http://codereview.stackexchange.com/)ですでに動作しているコードの改善に関する質問があります。 – Mofi

+0

最初のコマンドで、なぜ最初のスケールフィルタですか? 2番目のコマンドでは、ストリームをコピーするときにsizeオプションは効果がありません。 1つのコマンドでこれをすべて実行し、1つのビデオエンコードステップをスキップできます。最終的なエンコードステップでは、高速プリセットを使用できます。品質に大きな違いはありません。 – Mulvya

+0

最初のコマンドの結果が2番目のコマンドの結果に上書きされませんか? – Magoo

答えて

1

シングルコマンド:

ffmpeg -i main.mp4 -i white.png -i out1.ts -filter_complex 
    "[1][0]scale2ref=iw/6:ih/18[logo][0v];[0v][logo]overlay=W-w-3:H-h-1,scale=hd720[vid]; 
    [2][2:a][vid][0:a][2][2:a]concat=n=3:v=1:a=1[v][a]" 
-map "[v]" -map "[a]" -r 20 -preset fast -ar 48000 out.mp4 
1
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
:: make a tempdir 
:maketemp 
SET "tempdir=%temp%\%random%" 
IF EXIST "%tempdir%\" (GOTO maketemp) ELSE (MD "%tempdir%") 

:: read each filename from source and process 

for %%I in ("%sourcedir%\*.txt") DO (
    TITLE Processing %%I 
    START "%%I" q43060025s "%%I" 
    CALL :wait 10 
) 
CALL :wait 1 
RD "%tempdir%" 

GOTO :EOF 

:: monitor number of files in temp directory and return if fewer than %1 
:wait 
:: wait 1 second 
timeout /t 1 >NUL 
FOR /f %%c IN ('dir /b /a-d "%tempdir%\*" 2^>nul ^| find /c /v "" ') DO IF %%c geq %1 GOTO wait 
GOTO :eof 

あなたは、あなたの状況に合わせてsourcedirの設定を変更する必要があります。私はいくつかのダミーファイル.txtを使ってテストしました。

時間要件は、ファイルをシリアル処理しているために発生している可能性があります。解決策は、最新のPCの複数のコアのパワーを使用して、ファイルを並行して処理することです。

ここでの考え方は、サブプロシージャはそうtempdirが確立され、呼び出し元の手続きの環境を継承します(q43060025s.bat

その後、サブプロシージャのバッチを使用して各ファイルを処理、制御ファイルを格納するための一時ディレクトリを作ることです。

@ECHO OFF 
SETLOCAL 
:: do some operation on the filename passed as %1 
title processing %~1 
ECHO %time%>"%tempdir%\%~n1" 
:: 4 to 21-second delay 
SET /a delay=%RANDOM% %% 18 + 4 
timeout /t %delay% >NUL 
DEL "%tempdir%\%~n1" 
CLS 
exit 

ここでのサブプロシージャは、デモ用のダミーです。 tempdirを使用して、そのディレクトリに、処理するファイルの名前がの何かを含むファイルを作成します。 - 私はちょうど時間を使いました。

私のサブプロシージャは単純に4から21秒間遅延し、可変処理時間でいくつかのプロセスをシミュレートします。

次に、作成したファイルを削除して終了します。

一方、主な手順は、実行中のサブプロセスの数である一時ディレクトリ内のファイル数を監視することです。ファイル数を数えるだけで、カウントが渡されたパラメータ以上であれば、1秒待ってからやり直してください。

サブプロシージャがそのジョブを終了すると、カウントが減少し、:waitルーチンが終了します。次のファイルが選択され、サブプロセスに送信され、再び待機します。

最後のファイルが送信されたら、一時ディレクトリを削除できるときに、サブプロセスの数がゼロ(つまり1未満)になるまで待機します。

遅延ルーチンの代わりにq43060025sに処理を組み立て、ファイル名を%1として渡すと、問題は解決されるはずです。

+0

優秀な回答!私はそれを並行して実装することはできませんでしたが、私のコードをこのように動作させることができるかどうかがわかります。 –

関連する問題