YouTube の推奨するショート動画 9:16 を ffmpeg で作成する

「縦長で60秒以内」だけで、アップロードして公開できますが、YouTube の推奨する「アスペクト比 9:16」で見やすい画面で公開したいですよね。



ffmpeg で「動画ファイルのアスペクト比の変更」をやってみます。

動画に写ってる映像のアスペクト比はそのままで保持します。

「余白の追加 (pad)」と「切り抜き (crop) 」することで動画ファイルのアスペクト比を 9:16 にする、という話です。

少しやってみたので書いてみます。

以下は、参考になるエントリーです。

👉 Resizing videos with ffmpeg/avconv to fit into static sized player - Super User hatena-bookmark
👉 video - FFmpeg - scale and pad - Super User hatena-bookmark
👉 リサイズする scale | ニコラボ hatena-bookmark

 

🎞️ 考えられる基本パターン

出来上がりのアスペクト比は、9:16 です。

元動画が縦長であれば、

以下のどちらか。

横長であれば、

以下のどちらか。

というかんじで、

「余白の追加 (pad)」や「切り抜き (crop) 」

をします。

 

🎞️ ffmpeg の video_filter を使う

分かりやすくするために、「縦長」、「横長」といいましたが、実際は、元動画のアスペクト比が「9:16」を超えるか超えないか、が大事になります。

元動画アスペクト比が 9:16 より縦長の場合


ffmpeg -i input -vf "pad=ih*9/16:ih:-1:-1" output


ffmpeg -i input -vf "crop=iw:iw/(9/16)" output

元動画アスペクト比が 9:16 より横長の場合


ffmpeg -i input -vf "pad=iw:iw/(9/16):-1:-1" output


ffmpeg -i input -vf "crop=ih*9/16:ih" output

pad / crop 共に、中心に合わせています。

 

🎞️ もう少し便利に

元画像のアスペクト比は ffmpeg は認識できるので、そこを判別させます。

pad するか、crop するかは、動画内容の目視判断で。


ffmpeg \
  -i input \
  -vf "pad='if(lt(iw/ih,9/16),ih*9/16,iw)':'if(lt(iw/ih,9/16),ih,iw/(9/16))':-1:-1" \
  output


ffmpeg \
  -i input \
  -vf "crop='if(lt(iw/ih,9/16),iw,ih*9/16)':'if(lt(iw/ih,9/16),iw/(9/16),ih)'" \
  output

もし、画像が大きすぎる場合は,",scale=720:1280" など追加して、アスペクト比を保持しながら縮小します。

 

🎞️ まとめ

最初のリンクにあるコードでも意図する 9:16 動画 は作成できたのですが、気持ちが悪いので基本的なとこだけ調べてみました。

video filter を以下の形にまとめておけば、出来上がりの width x height を考慮したスクリプトが自在に書けそうです。


-vf "pad='max(iw,ih*(720/1280))':ow/(720/1280):-1:-1,scale=720:1280"


-vf "crop='min(iw,ih*(720/1280))':ow/(720/1280),scale=720:1280"

今後も、公式マニュアルを見ながら、あれこれやってみたいと思います。

👉 pad - Video Filters - FFmpeg Filters Documentation hatena-bookmark
👉 crop - Video Filters - FFmpeg Filters Documentation hatena-bookmark
👉 scale - Video Filters - FFmpeg Filters Documentation hatena-bookmark
👉 Expression Evaluation - FFmpeg Utilities Documentation hatena-bookmark



👉 YouTubeに縦長動画をどうアップするべきか? hatena-bookmark


Twitter の代替は Jake Wharton さんの Mastodon が最強じゃね?


👉 「Tweetbot」のTapbot、マストドンアプリ「Ivory」開発中 - ITmedia NEWS hatena-bookmark

そういえば、こんなの公開されてます。Twitter ではありません。

👉 Jake Wharton (@[email protected]) - Mastodon hatena-bookmark


Singular Solution
Keep your Twitter follower count at zero by blocking and then quickly unblocking any new followers.

Available as a binary and Docker container.

👉 JakeWharton/singular-solution: Keep your Twitter follower count at zero by blocking and then quickly unblocking any new followers hatena-bookmark

docker + mastodon で Twitter クローン的なものを動かしてるのか、何なのか。

よく分かりませんが。

そういえば tweetbot 使ってましたね、Jake さんも。


Twitter 動画をツイートできず - 公式「YUV 4:2:0 ピクセルフォーマット にのみ対応しています」

YouTube ではアップロードして公開できました。



しかし、Twitter で動画アップロード時、完了できてるのに、ダイアログがグレーアウトしたまま。

ツイートができない。戻るとエラーの表示。

エラー
長い動画はアップロードされるまで時間がかかります。アップロードが中断されないように、ブラウザのタブは開いたままにしてください

アップロードはできてるのに。

なんでかな。

 

🎞️ ffmpeg で .mov → .mp4 に変換するときの注意点

ffmpeg では、以下のようにすれば Twitter でもいけます。

画質は -crf で設定するだけです。0 はロスなし、18 は実際はロスしていますが見た目では問題ありません。

もし、FFmpeg以外のプレイヤーで再生できるようにしたい場合は、-vf format=yuv420p を追加してください。

色の再現性が若干低下することがありますが、広い互換性のために必要です。


ffmpeg -i input.mov -crf 18 -vf format=yuv420p output.mp4

YouTubeにアップロードする場合は、-vf format=yuv420p を省略することができます。

👉 video - ffmpeg convert mov to mp4 without reduction of bit rate - Stack Overflow hatena-bookmark

それぞれのコマンドオプションで作成された output.mp4 を ffprobe で確認。


# -vf format=yuv420p なし
ffmpeg -i input.mov -crf 18 output.mp4 

Stream #0:0[0x1](und): Video: h264 (High 4:2:2) (avc1 / 0x31637661), yuv422p10le(tv, bt709, progressive), 720x1280 [SAR 1:1 DAR 9:16], 216 kb/s, 59.94 fps, 59.94 tbr, 60k tbn (default)


ffmpeg -i input.mov -crf 18 -vf format=yuv420p output.mp4

Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 720x1280 [SAR 1:1 DAR 9:16], 212 kb/s, 59.94 fps, 59.94 tbr, 60k tbn (default)

となり、ピクセルフォーマットが


yuv422p10le

  ↓

yuv420p

と変化していることが分かります。

この話、Twitter 公式にもきちんと書いてました。

YUV 4:2:0 ピクセルフォーマットにのみ対応しています。

👉 メディアのベストプラクティス | Docs | Twitter Developer Platform hatena-bookmark

その他、分かったことメモ。

※ ffmpeg で .mov → .mp4 にすれば コーデックは H.264 になる。

※ mov のコーデックは ProRes も H.264 も存在する。

動画ファイルって、いろんなきまりがあるんですね!

 

🎞️ まとめ

ffmpeg で、広く互換性を優先して、.mov.mp4 に変換する。


# .mov → .mp4
ffmpeg -i input.mov -crf 18 -vf format=yuv420p output.mp4

👉 Encode/H.264 – FFmpeg hatena-bookmark
👉 Encode/VP9 – FFmpeg hatena-bookmark

👉 YouTubeに縦長動画をどうアップするべきか? hatena-bookmark
👉 【Google フォト対策】ffmpeg で動画軽量化 hatena-bookmark