0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ffmpegで16:9動画を9:16にレターボックス変換する(切り抜きなし)

0
Posted at

横長(16:9)の動画を、ショート動画向けの縦長(9:16)で投稿したい場面はよくあります。左右を切り抜けば画面いっぱいになりますが、登場人物が画面の端にいる動画では、大事な部分が切れてしまいます。

この記事では、ffmpeg を使って 切り抜きなしで 16:9 動画を 9:16 キャンバスに収める方法を、黒帯版とぼかし背景版の2通りで説明します。最後に、複数ファイルをまとめて処理するスクリプトと、確認用のコマンドも載せます。

前提

  • ffmpeg 6 以降(scale、pad、boxblur、overlay フィルタを使います)
  • 入力:1280×720、16:9、30fps 前後の MP4
  • 出力:1080×1920、9:16、H.264 + AAC

例として、AI 生成の 15 秒・16:9・720p のクリップを使います。

左に 1280×720(16:9)のAI生成フレーム、右に上下を黒帯で埋めた 1080×1920 キャンバスを並べたレターボックス変換の図
構成図:1280×720(16:9)のAI生成フレームを、切り抜かずに 1080×1920 キャンバスの中央へ置き、上下を黒帯で埋める。

計算:16:9 を幅 1080 に合わせると

9:16 の幅 1080px に 16:9 の映像を合わせると、高さは次のようになります。

1080 / 16 * 9 = 607.5 → 偶数に丸めて 608

H.264 では幅・高さを偶数にする必要があるので、scale=1080:-2 と書くと ffmpeg が自動で偶数(608)に丸めてくれます。上下の余白は (1920 - 608) / 2 = 656 px ずつです。

元が 1280×720 なので、幅 1080 に合わせると少し縮小になります。拡大しないので、画質が粗くなる心配はありません。

方法1:黒帯で埋める

いちばん単純な方法です。

ffmpeg -i input.mp4 \
  -vf "scale=1080:-2,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black,setsar=1" \
  -c:v libx264 -crf 18 -preset medium -pix_fmt yuv420p \
  -c:a copy output_black.mp4

フィルタの意味は次のとおりです。

  • scale=1080:-2:幅を 1080 にし、高さは縦横比を保って偶数に丸める。
  • pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black:1080×1920 のキャンバスの中央に置き、余白を黒で埋める。
  • setsar=1:サンプルアスペクト比を 1:1 に固定する。一部のプレイヤーで縦横比がずれるのを防ぎます。

音声は再エンコード不要なので -c:a copy にしています。入力に音声がない場合も、このままでエラーにはなりません。

方法2:ぼかした映像で埋める

黒帯が寂しい場合は、同じ映像を拡大してぼかし、背景に敷く方法があります。

ffmpeg -i input.mp4 -filter_complex "\
[0:v]split=2[bg][fg];\
[bg]scale=1080:1920:force_original_aspect_ratio=increase,\
crop=1080:1920,boxblur=luma_radius=40:luma_power=2[bgb];\
[fg]scale=1080:-2[fgs];\
[bgb][fgs]overlay=(W-w)/2:(H-h)/2,setsar=1[v]" \
  -map "[v]" -map 0:a? \
  -c:v libx264 -crf 18 -preset medium -pix_fmt yuv420p \
  -c:a aac -b:a 192k -ar 48000 output_blur.mp4

ポイントは次のとおりです。

  • split=2 で映像を背景用(bg)と前景用(fg)に分ける。
  • 背景は force_original_aspect_ratio=increase で 1080×1920 を覆うまで拡大し、crop ではみ出しを切る。背景なので切れても問題ありません。
  • boxblur で強くぼかす。luma_radius を大きくするほど背景が目立たなくなります。
  • 前景は方法1と同じく幅 1080 に合わせ、overlay で中央に重ねる。
  • -map 0:a? の ? は「音声があれば使う」という意味で、音声なしの入力でも失敗しません。

背景は拡大していますが、ぼかすので粗さは目立ちません。前景(本編)は縮小だけなので、画質は保たれます。

方法3:単色+少し上寄せ

ショート動画アプリでは、画面下部にキャプションやボタンが重なります。本編を少し上に寄せると、重なりを避けやすくなります。

ffmpeg -i input.mp4 \
  -vf "scale=1080:-2,pad=1080:1920:0:(oh-ih)/2-160:0x111111,setsar=1" \
  -c:v libx264 -crf 18 -pix_fmt yuv420p -c:a copy output_up.mp4

(oh-ih)/2-160 で、中央より 160px 上に配置しています。値はプラットフォームの UI に合わせて調整してください。目安として、下から 20%、右から 15% 程度は UI と重なりやすい領域です。

複数ファイルをまとめて処理する

フォルダ内の MP4 をすべて黒帯版に変換するシェルスクリプトです。

#!/usr/bin/env bash
set -euo pipefail
mkdir -p out
for f in *.mp4; do
  ffmpeg -nostdin -y -i "$f" \
    -vf "scale=1080:-2,pad=1080:1920:(ow-iw)/2:(oh-ih)/2,setsar=1" \
    -c:v libx264 -crf 18 -pix_fmt yuv420p \
    -c:a copy "out/${f%.mp4}_9x16.mp4"
done

-nostdin を付けておくと、ループ内で ffmpeg が標準入力を読み込んでしまう問題を防げます。

結果を確認する

変換後は、解像度・長さ・音声の有無を ffprobe で確認します。

ffprobe -v error -select_streams v:0 \
  -show_entries stream=width,height,sample_aspect_ratio \
  -show_entries format=duration -of compact output_black.mp4

width=1080|height=1920|sample_aspect_ratio=1:1 と表示され、長さが元の動画と同じなら成功です。音声の有無は次のコマンドで分かります。

ffprobe -v error -select_streams a \
  -show_entries stream=codec_name -of csv=p=0 output_black.mp4

何も表示されなければ、音声トラックはありません。

よくあるつまずき

  • height not divisible by 2 エラー:scale=1080:-1 と書くと奇数になることがあります。-2 を使います。
  • 縦横比がずれて見える:setsar=1 を付け忘れていないか確認します。
  • ぼかし版が重い:boxblur の半径を下げるか、背景だけ先に縮小してからぼかすと速くなります。
  • 色が変わる:-pix_fmt yuv420p を指定すると、多くのプレイヤーで同じ色に見えます。

まとめ

  • 16:9 → 9:16 は、切り抜かずに scale + pad で中央に置くのが安全です。
  • 黒帯が気になるなら、split + boxblur + overlay でぼかし背景にできます。
  • UI と重なる場合は、pad の y 座標で本編を少し上に寄せます。

参考

※ 例に使ったクリップは AI 生成です。「Crazy Frog AI」は MixVio のテンプレートエフェクト名で、ページの FAQ には "No. This is an independent highway-chase effect for two consenting adults. There are no weapons, no blood, and no crash, and it is not a frog character." とあります。本記事は MixVio チームが書きました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?