web-dev-qa-db-ja.com

単一の画像のファイル名をFFmpeg出力ビデオに書き込む

私はFFmpegを使用して、一連の単一の画像を読み取り、それらをビデオとして出力しています。
結果は、1分間隔でのWebサイトのスクリーンショットのタイムラプスです。

ここで、drawtextコマンドを使用して、各画像の元のキャプチャ時間を結果のビデオに焼き付けたいと思います。キャプチャ時間は、各画像のファイル名で確認できます。しかし、入力画像のファイル名にアクセスするためのdrawtextのオプションを見つけることができません。

別の方法は、drawtext内から各画像の作成日にアクセスすることです(これを行う方法も見つかりません)。しかし、私は間違いなくファイル名にアクセスしたいと思います。これにより、テキストをフォーマットするためのより多くのオプションが得られるからです。

これを行う方法はありますか?
提案されたソリューションがWindowsでも機能するのは素晴らしいことです。

6
Jpsy

ffmpegのドローテキストフィルターはそれほど高度ではないため、1行でそれを行うことはできません。

スクリプトを使用して、事前に画像を前処理する必要があります。

単純なbashスクリプトのようなもの:

for i in *.png; do 
    time = $(echo $i | cut -d . -f 1)
    ffmpeg -i $i -vf "drawtext=text=$time" mod-$time.png
done

次に、mod * .pngファイルを使用してビデオを作成できます。

2
Znuff

Znuffの答えは素晴らしく(受け入れられ、賛成され)、私自身の解決策への道を開いた。これはUnix固有であり、Winで作業する必要があったため、Windows7以降のソリューションは次のとおりです。

2つのバッチファイル(Master.cmdとSlave.cmd)を使用して、すべての画像をループし、ファイル名をそれらに書き込みました。

Master.cmd:

forfiles /p "MyImagesSubPath" /m "2014-02-15*.png" /c "cmd /c ..\Slave.cmd @file @fname

Slave.cmd:

ffmpeg -i "%~1" -vf "crop=1072:1192:24:101, drawtext=text=%~2: fontcolor=white: fontsize=60: box=1: [email protected]: x=50:y=50: fontfile=c\\:\\\\Windows\\\\Fonts\\\\myfont.ttf" "mod_%~1"

説明:

複数の理由で2つのバッチを使用する必要があります。
1。 forfilesの/ cパラメーターは、制限された長さ(253文字)のコマンドラインのみを受け入れます。
2。 FFmpegコマンドをforfiles/cパラメーターにネストするには、非常識なレベルの文字のエスケープが必要になります。

Master.cmdのファイル名フィルター "2014 -.... png"は、ループが無限ループで自身の出力( "mod _.... png"という名前)を再処理するのを防ぐために使用されます。ソース画像に一致するようにそのフィルター文字列を調整する必要があります。

スレーブバッチは、バッチディレクトリの下のサブディレクトリ「MyImagesSubPath」内から実行されます(これは、ソースイメージを配置する必要がある場所です)。 Slave.cmdは、拡張子のあるファイル名とないファイル名(.png)を2つのパラメーターとして受け取ります。

拡張子のないfilenameパラメータは、画像に書き込まれるテキストとして使用されます。結果の画像は、元の画像と同じパスにプレフィックス「mod_」を付けて保存されます。ファイル名には空白が含まれる場合があります。

2
Jpsy