結論
Adobe Media Encoder はめっちゃ使いやすいので安心して使って大丈夫!
Adobe Media Encoder おすすめの設定:
- VBR, 2 パス
- 最大ビットレートを Max まで上げる
- ターゲットビットレートを動画内容に応じて変更する
- キーフレーム間隔は長め
というのは半分冗談として……
ffmpeg を試す機会があった
H.264 (mp4) の圧縮のために Adobe Media Encoder 以外のエンコーダーを試したいという機会があり、その理由自体はこの記事とはあんまり関係ないのだけれど、試してみたら色々な学びがあったので自分用にメモしておく。
ffmpeg の第一の難関:色が変になる
愚直に ffmpeg を呼び出してみたところ、さっそく色がおかしくなってしまった。これは色空間がおかしいんだろうなと思いつつ、足をつっこみたくないなという気持ちになった。
← 正 | 誤 →
対処法:色空間を指定する
それで、最終的に以下のようなコードになった。yuv420p と bt709 と out_range=tv を指定したけど、全部は指定しなくてもなんとかなると思う。
#!/bin/bash # -crf で動画の品質の悪さを指定(クオリティによる指定、デフォルトで 23) Q=23 # キーフレーム間隔(フレーム単位)、デフォルトで 8 秒 KF=120 # エンコード速度 SPD=veryslow # -y オプションを付けているため、必ず出力ファイルが上書きされる点に注意 # 解像度はそのまま(明示のため iw:ih を指定。省略時しても差異はなし)。 # scale は色だけの変換(RGB→YUV、フル→limited)。yuv420p は -pix_fmt(必要なら内部で変換)。 # -vf の行はフルレンジからリミテッドレンジ (tv) への変換のために必要らしい。 IN_AVI="D:\videos\_input.avi" OUT_NAME="_output.mp4" ./ffmpeg.exe -y -i "$IN_AVI" -vcodec libx264 -preset "$SPD" -crf "$Q" -g "$KF" -an \ -vf "scale=iw:ih:in_color_matrix=bt709:out_color_matrix=bt709:in_range=pc:out_range=tv" \ -pix_fmt yuv420p \ -colorspace bt709 -color_primaries bt709 -color_trc bt709 \ -movflags +faststart \ "$OUT_NAME"
こんな長いコードを書かなきゃいけないと思うと、 Adobe Media Encoder はすごく使いやすかったんだなと思う。
パラメータざっくり解説(分かりやすさ重視)
BT.709(Rec.709)
だいたい sRGB と同じような意味だが、mp4 圧縮の文脈で使われる。
sRGB の動画を mp4 に圧縮する行為のことだと思っておけばよい。(まあ、その言い方はあんまり正しくはないんだけど)
この 生の RGB 値をどう解釈するかという指定が間違っていると、色が変になる原因になる(多分)。
YUV 4:2:0
YUV のうち U と V を間引く方式の指定。mp4 ではふつう RGB 色空間のデータが YUV 色空間のデータに変換されて保存されているが、U と V はあんまり重要じゃないのでめっちゃ情報量を減らすという意味。
動画再生の互換性がアップし、 Windows エクスプローラー (explorer.exe) などでもサムネイルが表示できるようになる。
ただし、間引き方の指定なので、色がおかしくなる原因とはあんまり関係なさそう。
out_range=tv
出力データをフルレンジ (pc) ではなくリミテッドレンジ (tv) にする。
YUV の Y=16 を黒とするという意味で、動画再生の互換性がアップする。色合いに影響するかどうかはわからない。
-an
オーディオ出力なしという意味。
iw:ih
出力の解像度(ピクセル数)を入力に合わせる。
予想外のメリット(本題):圧縮率が高い
ffmpeg でエンコードしたところ、予想外のメリットがあって、ファイルサイズが爆裂に小さくなった。その理由が、
理由1. 設定を 2パス VBR ではなく 1パス VBR にしていたため、無駄があった
まず、設定を 1パス VBR にしていたため、ビットレートの無駄が生じてしまっていた。
動画内にシンプルなモーショングラフィックスパートと複雑な 3DCG パートがあって、それらの間で適切にビットレートの振り分けがされていなかった。
理由2. クオリティ指定ではないため、無駄に高いビットレートを指定してしまっていた。
2 パスにすると、安定した品質にできるものの、動画の内容の複雑さや、解像度 (ピクセル数) に応じたビットレートを指定しなければならなかった。ここが適切ではなかったため、無駄に巨大なファイルが出来てしまっていた。
クオリティ指定ができれば、このような問題は発生しない。(ただし、最初は勘所を掴むために、何度かエンコードを繰り返す必要があるかもしれない。)
理由3. キーフレームと B フレームを指定していなかった
ffmpeg では、前後のフレームを参照して圧縮率を上げる設定がデフォルトで有効なので、特に何も設定しなくても高い圧縮率を達成することができる。 -g オプションでキーフレームの間隔を指定できる。BMS では動画をシークする必要性があまり無いので、キーフレーム間隔は長めで良いと思う。
Adobe Media Encoder でもキーフレームを設定することはできるようなので、これは設定していなかった自分が悪いっぽい。
理由4. 圧縮率重視でエンコードできる
-preset veryslow を指定すると、圧縮率重視でエンコードできるので、BMS のようなインターネットでの配布に適した形式で出力することができる。
出力比較
設定を 2 パス VBR にしたら、同じくらいのクオリティで同じくらいのファイルサイズにはなりそうだった。ただ、僅差で ffmpeg の方がブロックノイズが少ないような気がした(以下の画像参照)。
まとめ
ただ、それでもオレンジ色がくすんでしまう問題は解決できなかった。
もうダメです助けてください。





