ffmpeg のgeq
フィルタとタイムライン編集を使って複数の分割画面の効果を作る。単純に1度だけ分割画面の効果を作るのならsplit,vstack,split,hstack
フィルタの併用が最も手軽。
APNG をループ出力する
Using ffmpeg to create looping apng – Stack Overflowより、アニメGIFなら-loopでループできるのに APNGではこのオプションではループできないので-playsオプションを使う。このオプションはループ回数を指定する。0を指定すると無限ループになる。
透過処理にバグがある。
#9334 (MP4 to APNG conversion incorrectly has transparent background) – FFmpeg
-ssで開始秒、-tで動画時間を指定する
ffmpeg -ss 10 -i input.mp4 -plays 10 -t 1 -vf setpts=PTS-STARTPTS -f apng output.png
無限ループで出力フレーム数-frames:vを指定する
ffmpeg -ss 10 -i input.mp4 -plays 0 -frames:v 10 -vf setpts=PTS-STARTPTS -f apng output.png
ちなみにフレームレートを変えるならfps
フィルタを使う。
ffmpeg -ss 10 -i input.mp4 -plays 10 -t 1 -vf fps=10,setpts=PTS-STARTPTS -f apng output.png
読み込み時に無限ループして動画に出力。
ffmpeg -ignore_loop 0 -i input.png -t 10 -pix_fmt yuv420p output.mp4
ヘルプコマンド:ffmpeg -h muxer=apng
公式ドキュメント:ffmpeg Documentation : apng
4:3を16:9に、16:9を4:3に余白と透過をつける
前回記事は余白だけをつけたが今回はその余白の部分だけ透過させる。映像の部分的に透過させるにはgeqフィルタを使う。アルファチャンネルをプレビューするにはalphaextract
フィルタを使う。
640×360の16:9映像を上下に白枠と透過を付けて4:3にする。出力解像度は 640×480
ffplay -f lavfi -i color=s=640x360 -vf format=yuva420p,pad=iw:iw*3/4:0:(oh-ih)/2:white,geq='p(X,Y):a=(between(X,0,W)*between(Y,H/8,7*H/8))*255'
640×480の4:3映像を左右に白枠と透過を付けて16:9にする。出力解像度は 852×480
ffplay -f lavfi -i color=s=640x480 -vf format=yuva420p,pad=ih*16/9:ih:(ow-iw)/2:0:white,geq='p(X,Y):a=(between(X,W/8,7*W/8)*between(Y,0,H))*255'
4:3を16:9に、16:9を4:3に余白をつける
ffmpeg にpad
フィルタがあるのでこれを使って4:3を16:9に、16:9を4:3に余白をつける。コマンド例は黒映像に余白は白を足している。
640×360の16:9映像を上下に白枠を付けて4:3にする。出力解像度は 640×480
ffplay -f lavfi -i color=s=640x360 -vf pad=iw:iw*3/4:0:(oh-ih)/2:white
640×480の4:3映像を左右に白枠を付けて16:9にする。出力解像度は 852×480
ffplay -f lavfi -i color=s=640x480 -vf pad=ih*16/9:ih:(ow-iw)/2:0:white
新配信で4:3映像に余白をつけて800×450配信にする
元映像が4:3なら丁度よい解像度にリサイズし余白をつけて推奨解像度の800×450にする。余白の色の既定値は黒で適宜指定できる。配信映像がドット絵ならneighborを指定し、それ以外はlanczosやbicubic(無指定ならこれ)を指定する。
scale=576:432:flags=neighbor,fifo,pad=800:450:112:9:black
余白の色の指定方法
FFmpeg Utilities Documentation : Color
生放送をNLEなどの外部ツールで高画質配信する | ニコニコヘルプ
ビットレートが高く配信が途切れる場合は TCPRelay を使う
Windows の ffmpeg で生放送する方法 : TCPRelayの使い方
ffmpeg で先頭と後ろを一度にカットする
Cut video with ffmpeg. – Stack Overflowより、再エンコードなしに1行のコマンドで先頭と後ろをカットする方法。
コマンドプロンプトでは問題ないが、PowerShellで実行すると標準出力の部分が出力終わるまで入力に渡さないので出力が失敗する。
開始10秒と後ろ10秒をカットしてその間をコピー出力する。同じファイルを2度入力するのでファイル名に注意。
ffmpeg -ss 10 -i video.mp4 -ss 20 -i video.mp4 -c copy -map 1:0 -map 0 -shortest -f nut - | ffmpeg -f nut -i - -map 0 -map -0:0 -c copy out.mp4
- このコマンドの挙動の理解には-shortest、-map、-f nutを知る必要がある
- -shortestは複数入力のトラックの中から一番短いファイル時間でカットされる
- 1番目の-ssで動画の先頭時間の指定、2番目の-ssと1番目の-ssの差し引きが後ろをカットする時間になる
- -map 1:0 -map 0を使ってそれらを1入力扱いにして、そのトラックに中から -shortestで一番時間の短いところで出力時間が決まる
- なぜ-map 1:0を先にするかというと、この映像はカットするための時間を決める動画で最終出力には不要になりかつ、トラックを除外しやすい-map 0:0で標準入力するため
- -f nutはいろいろなコーデックを標準入出力できるので便利
- 標準入力で-map 0しているのは映像と音声、または字幕などのすべてのデータを元に-shortestで後ろをカットするから
- -map –0:0で不要なトラックを–で除外して出力している
ドラクエの戦闘シーンチェンジエフェクトを作る
ニコニコ動画に投稿された「DQエンカウント風AviUtlシーンチェンジ用素材 sm30578410 (自主削除)」を元に ffmpeg でも同じことを実装する。配布されたファイルは 8bit PNG なのでそれを使い、グラデーションマスクを作成し2入力を合わせる方法をとる。サンプルコマンドの出力コーデックは適宜変える。input1.mp4 と input2.mp4 は 640X360 30000/1001 fps の動画である。それに伴って。color ソースもそれに統一する。シーンチェンジは input1.mp4 から input2.mp4 の順番に切り替わるのがドラクエの戦闘シーンチェンジエフェクトになる。
動画は削除されたが素材は削除されずダウンロードできる。パスワードは検索すると見つかる。
白と黒を使ったフェード効果
白や黒にフェードインする効果と、白や黒から入力した映像にフェードアウトする効果の解説。入力した映像が YUV、または RGB で処理が異なる。効果は2秒から4秒に掛けての2秒間で行う。適宜効果の時間は設定を変える。
フェード単体のフィルタもある。
フェードイン、フェードアウトの設定ができる fade
ffmpeg 4.3 から手軽にトランジションできるフィルタが追加される予定。
映像のトランジションの設定ができる xfade
2017年3月のニコ生統計
集計期間は週間のニコ生統計の3月分である。2015年の1月の2週目から取得漏れの R-18 放送を含めて Vita API で取得し始めたのでそれ以前と比べて取得放送数が増えている。
数式で線や円、模様が描ける geq
ffmpeg のフィルタの中でおそらく最も使い方が難解なgeq(generic equation)
フィルタの使い方。YUV と RGB、A のそれぞれを設定により色を変えたり、回転・反転させたり、グラデーションや線、円や矩形も描ける。さらにマスクも作れるのでトランジションへの応用もできるが処理速度はかなり遅い。その書き方はすべて縦横の座標とその値を評価式で計算する。