ffmpegとにかく多機能で全部入り感あってすごいなと思いました。(小並感
動画とか音声に関する事なら何でも出来そう。
要件
- 売りモノの動画から、サンプル動画として冒頭1分だけ切り出したい。
- 転送量やストレージ使用増を考えて、サンプル動画の画質、音質は落とす。
- 1分で無理矢理ぶった切るので、少しでも違和感なく再生が終わる感じにフェードアウトしたい。
- サンプル動画には、「この動画はサンプルです」、的な注意書きを表示したい。
使いかた
まず今回辿り着いたコマンドはこちら。こんなの絶対覚えてられない。明日には忘れる。
input.mp4から、要件に基づいた処理を行ってoutput.mp4を出力。なおinput.mp4は消えたりしないので安心。
ffmpeg -i input.mp4 -t 60 \
-b:v 512k -b:a 32k \
-vf "movie=its_sample.png [watermark];[in][watermark] overlay=main_w-overlay_w-40:main_h-overlay_h-40 [out],[out]fade=out:1740:60" \
-af afade=t=out:st=58:d=2 \
output.mp4
- -iは元ファイルの指定。
- -tは切り出したい秒数。今回は開始から60秒。 -ssオプションで、開始位置の指定も可能。
-t 60 -ss 30
だと開始30秒目から、60秒を切り出す。-ssの指定が無い場合は最初から。 - -b:vはビデオのビットレート指定。今回は512k。ファイルサイズと質のトレードオフなので、何パターンかやってみて調整。
- -b:aはオーディオのビットレート指定。今回は32k。こちらも要調整。
- -vfはビデオフィルタ。ffmpeg激ヤバポイント。サンプルですよテキスト(画像)を埋め込んだ後、開始から1740フレーム目から60フレームかけてフェードアウトしますよ。
- -afはオーディオフィルタ。開始から58秒目から2秒かけてフェードアウトしますよ。
所感
-
フィルタすごい、やばい。
-
ビデオフィルタもオーディオフィルタみたいに秒で指定できればいいのに。
ffmpeg -i input.mp4
で、フレームレート調べて30fps、60秒だから1800フレーム、最後2秒でフェードアウトしたいから1740:60ね、と計算するのが面倒だった。もしくは、-1:60みたいに指定できればいいのに。 -
オプションの指定順序によって動作が異なる?気をつけよう。
-
フェードアウトするにあたって、もしフレームレートの違う動画が混在してたら困るから固定しといたろ、ついでにフレームレート落として更にファイルサイズ減らそう!と思って安易に
-r 10
を指定したら、動画と音声がずれてしまった。調べたらwikipediaでこんなの出てきた。
参考
http://takuya-1st.hatenablog.jp/entry/2014/01/14/104752
http://fftest33.blog.fc2.com/blog-entry-80.html
http://d.hatena.ne.jp/zariganitosh/20150619/understand_ffmpeg
http://www.84kure.com/blog/2014/10/14/ffmpeg-%E5%8B%95%E7%94%BB%E3%81%AB%E9%80%8F%E3%81%8B%E3%81%97%E7%94%BB%E5%83%8F%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B%E3%81%AB%E3%81%AF/