BioErrorLog Tech Blog

試行錯誤の記録

YouTube投稿用動画をffmpegでエンコードする | 公式推奨方法を読む

YouTubeアップロード用動画をffmpegでエンコードする方法を、公式推奨設定を参考に書き出します。

はじめに

最近、ジェネラティブアート作品をYouTubeに投稿し始めました。

しかし、これまではエンコード形式など何も考慮せずに動画をアップロードしていたこともあってか、動きの激しい動画の画質は正直良くありません。

今回は、YouTubeが公式に推奨している設定を参考に、アップロード用動画のffmpegでの推奨エンコード方法をメモします。

作業環境

作業はWindows10上で行いました。

$ ffmpeg -version
ffmpeg version git-2019-12-15-ed9279a Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 9.2.1 (GCC) 20191125

YouTube投稿用動画をffmpegでエンコードする

公式推奨の設定を確認する

まずは、公式推奨の設定をこちらから確認します。

support.google.com

以下、上記サイトの引用です。

アップロードする動画におすすめのエンコード設定

  • コンテナ: MP4
    • 編集リストは含めません(編集リストがあると、動画が正しく処理されないことがあります)
    • ファイルの先頭に moov atom(ムーブアトム)を含めます(ファスト スタート)
  • 音声コーデック: AAC-LC
    • チャンネル: ステレオまたはステレオ + 5.1
    • サンプルレート: 96 khz または 48 khz
  • 動画コーデック: H.264
    • プログレッシブ スキャン(インターレースは不可)
    • ハイ プロファイル
    • 2 連続 B フレーム
    • クローズド GOP(フレームレートが半分の GOP)
    • CABAC
    • 可変ビットレート。ビットレートの上限はありませんが、下記の推奨ビットレートを参考にしてください。
    • クロマ サブサンプリング: 4:2:0
  • フレームレート
    • コンテンツは、記録したときと同じフレームレートでエンコードしてアップロードする必要があります。
    • 一般的なフレームレートは 24、25、30、48、50、60 fps(1 秒あたりのフレーム数)ですが、それ以外のフレームレートも使用できます。
    • インターレース方式のコンテンツは、アップロードする前にインターレースを解除する必要があります。たとえば 1080i60 のコンテンツの場合、アップロードする前にインターレースを解除して 1080p30 に変換する必要があります。つまり、1 秒あたりのフィールド数が 60 のインターレース方式を 1 秒あたりのフレーム数が 30 のプログレッシブ方式に変換します。
  • 解像度とアスペクト比
    • パソコン上での YouTube の標準アスペクト比は 16:9 です。それ以外のアスペクト比(縦向き、正方形など)の動画では、動画のサイズに合わせてプレーヤーのサイズが自動調整され、アスペクト比やデバイスに応じて最適化された視聴体験を提供します。
  • ビットレート
    SDR 動画をアップロードする際におすすめの映像ビットレート
タイプ 映像ビットレート、標準フレームレート(24、25、30) 映像ビットレート、高フレームレート(48、50、60)
2160p(4k) 35~45 Mbps 53~68 Mbps
1440p(2k) 16 Mbps 24 Mbps
1080p 8 Mbps 12 Mbps
720p 5 Mbps 7.5 Mbps
480p 2.5 Mbps 4 Mbps
360p 1 Mbps 1.5 Mbps


HDR 動画をアップロードする際の推奨映像ビットレート

タイプ 映像ビットレート、標準フレームレート(24、25、30) 映像ビットレート、高フレームレート(48、50、60)
2160p(4k) 44〜56 Mbps 66~85 Mbps
1440p(2k) 20 Mbps 30 Mbps
1080p 10 Mbps 15 Mbps
720p 6.5 Mbps 9.5 Mbps
480p サポート対象外 サポート対象外
360p サポート対象外 サポート対象外


アップロードする動画の推奨音声ビットレート

タイプ 音声ビットレート
モノラル 128 kbps
ステレオ 384 kbps
5.1 512 kbps


以上が、公式の推奨するエンコード設定です。

次はffmpegを用いてこれら設定をエンコードする方法を確認していきます。

ffmpegでのエンコード方法を確認する

上に列挙した各エンコード設定に対応するffmpegコマンドのオプションを確認していきます。

ffmpegオプションについては、こちらの記事を参考にさせて頂きました。

ffmpeg コマンドオプション 設定
[outputファイル名].mp4 コンテナ: MP4
-movflags +faststart ファストスタート
-c:a aac -profile:a aac_low 音声コーデック: AAC-LC
-ac 2 チャンネル: ステレオまたはステレオ + 5.1
-ar 96000 または -ar 48000 サンプルレート: 96 khz または 48 khz
-c:v libx264 動画コーデック: H.264
-vf yadif=0:-1:1 プログレッシブスキャン
-profile:v high ハイプロファイル
-bf 2 2連続Bフレーム
-g 30 (例: 60fps) クローズドGOP (値はフレームレートの半分)
-coder 1 CABAC
-b:v 15M (例: 1080pHDR動画) 映像ビットレート
-b:a 384k (例: ステレオ) 音声ビットレート
-pix_fmt yuv420p クロマサブサンプリング: 4:2:0

以上を踏まえ、実際にffmpegでエンコードするコマンドを見ていきます。

ffmpegコマンド例

ffmpegコマンド基本構成

ffmpegコマンドの基本的な構成を次に示します。

 ffmpeg [入力オプション] -i [入力ファイルパス]... [出力オプション] [出力ファイルパス]

この構成に合わせて、上で挙げたオプションを用途に応じて組み合わせていきます。

以下、いくつか私が使いそうな例を挙げます。


音声あり動画をエンコードする

音声あり動画input.mp4output.mp4にエンコードします。

ffmpeg -i input.mp4 -movflags +faststart -c:a aac -profile:a aac_low -ac 2 -ar 96000 -c:v libx264 -vf yadif=0:-1:1 -profile:v high  -bf 2 -g 30 -coder 1 -b:v 15M -b:a 384k -pix_fmt yuv420p output.mp4


音声なし動画をエンコードする

音声なし動画input.mp4output.mp4にエンコードします。

ffmpeg -i input.mp4 -movflags +faststart -c:v libx264 -vf yadif=0:-1:1 -profile:v high  -bf 2 -g 30 -coder 1 -b:v 15M -pix_fmt yuv420p output.mp4


連番画像を動画にエンコードする

連番画像image_%05d.pngを動画output.mp4にエンコードします。

image_%05d.pngは、ファイル名image_00001.pngimage_00002.png・・・の連番を意味します。

ffmpeg -r 30 -i image_%05d.png -movflags +faststart -c:v libx264 -vf yadif=0:-1:1 -profile:v high  -bf 2 -g 30 -coder 1 -b:v 15M -pix_fmt yuv420p -r 60 output.mp4

入力オプション-r 30は画像を30 fpsで入力することを意味し、
出力オプション-r 60は動画を60 fpsで出力することを意味します。


連番画像から解像度を変更して動画にエンコードする

連番画像image_%05d.pngから、解像度を変更して動画output.mp4にエンコードします。

ffmpeg -r 30 -i image_%05d.png -movflags +faststart -c:v libx264 -vf yadif=0:-1:1 -profile:v high  -bf 2 -g 30 -coder 1 -b:v 15M -pix_fmt yuv420p -r 60 -s 1920x1080 output.mp4

出力オプション-s 1920x1080で、解像度を1920x1080に指定しています。

おわりに

以上、YouTube投稿用の動画をffmpegでエンコードする方法を記しました。

この方法でエンコードした例では、例えば以下のようなものがあります:

(そこまで画質が綺麗か?と言われると正直あまり自信はない)

エンコード方法を調べようと思ったきっかけは、投稿した動画に有難くも以下のコメントを頂いたからでした。

A shame that the YouTube encoding reduces the quality so dramatically... Nice visual!

"YouTubeのエンコードのせいでかなり画質が落ちちゃってるけど...いい感じだね!"

なるほど、エンコードで画質が落ちるのか...ということで、エンコード設定を調べたという次第です。

この先、より良いやり方が見つかり次第、更新していきたいと思ってます。

[関連記事]

www.bioerrorlog.work

参考