集計期間は週間のニコ生統計の1ヶ月分である。2015年の1月の2週目から取得漏れの R-18 放送を含めて Vita API で取得し始めたのでそれ以前と比べて取得放送数が増えている。
VP9(libvpx-vp9)のエンコード設定について
次世代エンコーダVP9(webm、mp4)のエンコード設定についてffmpegで使う設定をまとめた。libvpx-vp9は外部ライブラリなので別途インストールする必要がある。さらに音声のエンコーダで使われるlibopusも外部ライブラリなのでこれもインストールする必要がある。
設定内容は多くあるがほとんどの設定は何も変えず、ビットレートの設定と品質・速度のトレードオフで考える。VP9は処理が遅いとよく言われるが、-threadsを設定することで速くなる。libx264のように自動設定してくれないので一番下の方にある解像度に併せて設定する。
libvpx-1.7.0から 10、12ビット深度に対応した。
ハードウェアのデコード、エンコード対応表:wiki – SoCs Supporting VP8/VP9
- webmproject/libvpx: github.com
- libvpx/CHANGELOG at master · webmproject/libvpx
- The WebM Open Media Project Blog: Inside WebM Technology: The VP8 Alternate Reference Frame
- Encode/VP9 – FFmpeg
- VP9 Encoding Guide – wiki
- Recommended Settings for VOD | Google Developers
- The WebM Project | VP9 Coding Profiles
- The WebM Project | VP9 Levels and Decoder Testing
- The WebM Project | VP8 Encode Parameter Guide
ffmpeg 3.3 リリース
2017年9月12日に 3.3.4 がリリースされた。アップデート内容は修正ばかりで新しいフィルタは入ってない。
Changelog: update release version 3.3.4 – ffmpeg.git/commitdiff
2017年7月30日に 3.3.3 がリリースされた。アップデート内容は修正ばかりで新しいフィルタは入ってない。
Changelog: update release version 3.3.3 – ffmpeg.git/commitdiff
2017年6月7日に 3.3.2 がリリースされた。アップデート内容は修正ばかりで新しいフィルタは入ってない。
Changelog: update release version 3.3.2 – ffmpeg.git/commitdiff
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 リリース
github.com – RELEASE_NOTES
git.videolan.org Git – ffmpeg.git/blob – Changelog
2017年4月のニコ生統計
集計期間は週間のニコ生統計の4月分である。2015年の1月の2週目から取得漏れの R-18 放送を含めて Vita API で取得し始めたのでそれ以前と比べて取得放送数が増えている。
分割画面の効果を作る
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で不要なトラックを–で除外して出力している