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でエンコードする
公式推奨の設定を確認する
まずは、公式推奨の設定をこちらから確認します。
以下、上記サイトの引用です。
アップロードする動画におすすめのエンコード設定
- コンテナ: 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.mp4
をoutput.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.mp4
をoutput.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.png
、image_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のエンコードのせいでかなり画質が落ちちゃってるけど...いい感じだね!"
なるほど、エンコードで画質が落ちるのか...ということで、エンコード設定を調べたという次第です。
この先、より良いやり方が見つかり次第、更新していきたいと思ってます。
[関連記事]