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

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

リサイズする scale
映像に余白を追加する pad

生放送を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 の順番に切り替わるのがドラクエの戦闘シーンチェンジエフェクトになる。

動画は削除されたが素材は削除されずダウンロードできる。パスワードは検索すると見つかる。

Continue reading “ドラクエの戦闘シーンチェンジエフェクトを作る”

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

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

フェード単体のフィルタもある。
フェードイン、フェードアウトの設定ができる fade

ffmpeg 4.3 から手軽にトランジションできるフィルタが追加される予定。
映像のトランジションの設定ができる xfade

関連記事
数式で線や円、模様が描ける geq
特定の時間だけフィルタを当てるタイムライン編集について

Continue reading “白と黒を使ったフェード効果”

2017年3月のニコ生統計

集計期間は週間のニコ生統計の3月分である。2015年の1月の2週目から取得漏れの R-18 放送を含めて Vita API で取得し始めたのでそれ以前と比べて取得放送数が増えている。

Continue reading “2017年3月のニコ生統計”

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

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

ffmpeg で使える評価式

Continue reading “数式で線や円、模様が描ける geq”

モノクロで点滅する効果を作る

YUVの映像なら彩度を0にするか、UVを128にする方法で、RGBの映像ならRGB各値をそれぞれ一定倍率を掛け合わせる方法をとり、点滅するフレーム間隔を指定するのにタイムライン編集を行う。

特定の時間だけフィルタを当てるタイムライン編集について

Continue reading “モノクロで点滅する効果を作る”