カテゴリー別アーカイブ: FFmpeg

ffmpeg 3.3 リリース

2017年5月15日に 3.3.1 がリリースされた。アップデート内容は修正ばかりで新しいフィルタは入ってない。

Changelog: update release version 3.3.1 – ffmpeg.git/commitdiff

2017年4月13日、ffmpeg 3.3 Hilbert(ヒルベルト)がリリースされた。3.3 は 3.2 からのメジャーアップデートでこれまでに取り込まれたコミットのすべてが入っている。

前回更新記事:ffmpeg 3.2 リリース

git.ffmpeg.org Git – ffmpeg.git/blob – RELEASE_NOTES
git.videolan.org Git – ffmpeg.git/blob – Changelog
続きを読む ffmpeg 3.3 リリース

APNG をループ出力する

Using ffmpeg to create looping apng – Stack Overflow より、アニメGIF なら loop でループできるのに APNG ではこのオプションではループできないので plays オプションを使う。このオプションはループ回数を指定する。ただし -1 を指定して無限ループは出来ないので大きい値を指定する。

ss で開始秒、t で動画時間を指定する
ffmpeg -ss 10 -i input.mp4 -plays 10 -t 1 -vf setpts=PTS-STARTPTS output.apng

【APNG】ブロマガのサムネイルを動かす方法
ffmpeg で アニメーションWebP(Animated WebP)を作る
ffmpeg で 256色を最適化する

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 を指定し、それ以外は lanczosbicubic(無指定ならこれ) を指定する。
scale=576:432:flags=neighbor,fifo,pad=800:450:112:9:black

余白の色の指定方法
FFmpeg Utilities Documentation : Color

Windows の ffmpeg で生放送する方法 : scale
Windows の ffmpeg で生放送する方法 : pad

生放送をNLEなどの外部ツールで高画質配信する | ニコニコヘルプ

ffmpeg で先頭と後ろを一度にカットする

Cut video with ffmpeg. – Stack Overflow より、再エンコードなしに1行のコマンドで先頭と後ろをカットする方法。

開始10秒と後ろ10秒をカットしてその間をコピー出力する
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, nut を知る必要がある
  • -shortest は2入力以上に対応していないので、1入力のトラックの中から一番短いファイル時間でカットされる
  • 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 は 640×360 30000/1001 fps の動画である。それに伴って。color ソースもそれに統一する。シーンチェンジは input1.mp4 から input2.mp4 の順番に切り替わるのがドラクエの戦闘シーンチェンジエフェクトになる。
続きを読む ドラクエの戦闘シーンチェンジエフェクトを作る

白と黒を使ったフェード効果

白や黒にフェードインする効果と、白や黒から入力した映像にフェードアウトする効果の解説。入力した映像が YUV、または RGB で処理が異なる。効果は2秒から4秒に掛けての2秒間で行う。適宜効果の時間は設定を変える。

関連記事
数式で線や円、模様が描ける geq
特定の区間だけフィルタを当てるタイムライン編集について
続きを読む 白と黒を使ったフェード効果

数式で線や円、模様が描ける geq

ffmpeg のフィルタの中でおそらく最も使い方が難解な geq(generic equation) フィルタの使い方。YUV と RGB、A のそれぞれを設定により色を変えたり、回転・反転させたり、グラデーションや線、円や矩形も描ける。さらにマスクも作れるのでトランジションへの応用もできるが処理速度はかなり遅い。その書き方はすべて縦横の座標とその値を 評価式 で計算する。
続きを読む 数式で線や円、模様が描ける geq