32blogby Studio Mitsu

FFmpegでSNS縦動画を作る方法【9:16変換ガイド】

FFmpegで16:9動画を9:16縦動画に変換する方法。YouTube Shorts・Instagram Reels・TikTok・X対応のクロップ・パディング・ブラー背景、字幕焼き込み、一括変換まで解説。

by omitsu19 min read
目次

横長の動画をSNS用に縦にしたい——この作業、GUIの動画編集ソフトでプラットフォームごとに書き出すのは正直面倒だ。「ffmpeg 縦動画 変換」「ffmpeg 9:16」で検索してここにたどり着いた人も多いだろう。

実は 主要なショート動画プラットフォームはすべて同じ基本仕様 を受け付ける——1080×1920、H.264、AAC、MP4。FFmpegのコマンド1つで YouTube Shorts、Instagram Reels、TikTok、X、Facebook Reels のすべてをカバーできる。違うのは尺の上限とビットレートの最適値くらいだ。

このガイドでは、あらゆる動画を縦フォーマットに変換し、テキストや字幕を追加し、フォルダ丸ごと一括処理する方法を解説する。

この記事でわかること

  • Shorts・Reels・TikTok・X・Facebook Reels の動画仕様
  • 全プラットフォーム対応の万能FFmpegコマンド
  • 16:9→9:16 の3つの変換手法(クロップ・パディング・ブラー背景)
  • テキストオーバーレイと字幕の焼き込み
  • プラットフォーム別のエンコード調整
  • シェルスクリプトによる一括変換

プラットフォーム別の動画仕様

各プラットフォームのヘルプページを確認すると、核心部分は驚くほど共通していることがわかる。

プラットフォームアスペクト比最大解像度コーデック最大尺ファイルサイズ上限
YouTube Shorts9:161080×1920H.264 + AAC3分256 GB
Instagram Reels9:161080×1920H.264 + AAC20分(90秒推奨)4 GB
TikTok9:161080×1920H.264 + AAC録画10分 / アップロード60分72〜500 MB
X(Twitter)9:16, 16:9, 1:11920×1080H.264 + AAC2分20秒(無料)/ 4時間(Premium)512 MB(無料)/ 16 GB(Premium)
Facebook Reels9:161080×1920H.264 + AAC制限なし(90秒以内推奨)4 GB

パターンは明確: 1080×1920、H.264、AAC、MP4 。これが全プラットフォーム共通のターゲットだ。各プラットフォームの仕様は頻繁に変わるので、大量アップロードの前にはリンク先の公式ページで最新の上限を確認しよう。

推奨ビットレート

ビットレートは画質とファイルサイズのトレードオフ。プラットフォーム側で再エンコードされるため、上げすぎても帯域の無駄になる。

プラットフォーム映像ビットレート音声ビットレート備考
YouTube Shorts5〜10 Mbps128 kbpsYouTube公式は1080pで8 Mbps以上推奨
Instagram Reels3.5〜5 Mbps128 kbpsMetaは強力に再エンコードする
TikTok2〜4 Mbps128 kbpsファイルサイズ最適化向き
X2.5〜5 Mbps128 kbps1080pで5 Mbps、720pで2.5 Mbps
Facebook Reels4〜6 Mbps128 kbpsテキスト多めの動画はやや高めに

万能FFmpegプリセット

このコマンド1つで、上記すべてのプラットフォームに対応したファイルが作れる。

bash
ffmpeg -i input.mp4 \
  -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black,setsar=1" \
  -c:v libx264 -crf 20 -preset slow -profile:v high -level 4.2 \
  -pix_fmt yuv420p -r 30 \
  -c:a aac -b:a 128k -ar 44100 -ac 2 \
  -movflags +faststart \
  -y output_vertical.mp4

各フラグの役割:

フラグ役割
scale=1080:1920:force_original_aspect_ratio=decrease1080×1920に収まるようにスケーリング(アスペクト比維持)
pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black余白を黒帯で埋める
setsar=1正方形ピクセルを保証(引き伸ばし防止)
-crf 20品質レベル——低いほど高画質・大容量。18〜23が実用的な範囲
-preset slowエンコード時間を犠牲に圧縮効率を向上
-profile:v high -level 4.2H.264の最大互換性
-pix_fmt yuv420p幅広いプレイヤーとの互換性に必須
-movflags +faststartmoovアトムを先頭に移動——Web再生に必須

プラットフォーム別のCRF調整

-crf の値で品質とサイズのバランスを調整できる。

bash
# YouTube Shorts — 高品質(YouTubeが再エンコードするので綺麗な素材を渡す)
-crf 18

# Instagram Reels / TikTok — バランス型(どうせ圧縮される)
-crf 22

# X — ファイルサイズ優先(512 MB制限対策)
-crf 23

16:9 → 9:16 変換の3つの手法

万能プリセットはパディング(黒帯)方式だが、それがベストとは限らない。被写体をクロップで切り出すこともあれば、ブラー背景でプロっぽく仕上げたいこともある。3つの方法を使い分けよう。

方法1: パディング(黒帯)

向いている場面: チュートリアル、画面録画、内容をすべて見せたい動画。

bash
ffmpeg -i input_16x9.mp4 \
  -vf "scale=1080:-2:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black" \
  -c:v libx264 -crf 20 -preset slow -pix_fmt yuv420p \
  -c:a aac -b:a 128k -movflags +faststart \
  output_padded.mp4

映像が中央に配置され、上下に黒帯が入る。シンプルだが、16:9ソースだと画面の約43%が黒帯で無駄になる。

方法2: クロップ(中央切り抜き)

向いている場面: アクション中心の映像、被写体が中央にある動画。

bash
ffmpeg -i input_16x9.mp4 \
  -vf "scale=-2:1920,crop=1080:1920" \
  -c:v libx264 -crf 20 -preset slow -pix_fmt yuv420p \
  -c:a aac -b:a 128k -movflags +faststart \
  output_cropped.mp4

高さを1920にスケーリングし、中央から幅1080をクロップする。左右の約43%が失われる。

特定の位置からクロップしたい場合:

bash
# 左寄りの被写体 → 左端からクロップ
-vf "scale=-2:1920,crop=1080:1920:0:0"

# 右寄りの被写体 → 右端からクロップ
-vf "scale=-2:1920,crop=1080:1920:iw-1080:0"

方法3: ブラー背景(プロっぽい仕上がり)

向いている場面: YouTubeの横動画をShorts/Reelsに転用するとき。多くのクリエイターが使う定番テクニック——元の映像を中央に配置し、背景をぼかしたズーム版で埋める。

bash
ffmpeg -i input_16x9.mp4 -filter_complex \
  "[0:v]scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,boxblur=20:5[bg]; \
   [0:v]scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:color=0x00000000[fg]; \
   [bg][fg]overlay=0:0,format=yuv420p" \
  -c:v libx264 -crf 20 -preset slow \
  -c:a aac -b:a 128k -movflags +faststart \
  output_blur_bg.mp4

フィルタチェーンの仕組み:

  1. [bg]: 入力を1080×1920を ** 覆う** ようにスケーリング→クロップ→ボックスブラー適用
  2. [fg]: 入力を1080×1920に ** 収まる** ようにスケーリング→透明パディング
  3. overlay: ぼかした背景の上にシャープな前景を重ねる

どの方法を選ぶべきか?

方法メリットデメリット向いている用途
パディング内容の欠損なし、高速画面が狭い、地味チュートリアル、画面録画
クロップ画面いっぱいに表示左右の映像が失われるアクション、中央の被写体
ブラー背景プロっぽい仕上がり、内容の欠損なしエンコードが遅い、ファイルが大きいYouTube動画の転用

テキストオーバーレイと字幕の焼き込み

SNS向けの縦動画にはテキストがほぼ必須——タイトル、CTA、フルキャプション。FFmpegなら静的テキストも字幕も焼き込める。

drawtextで静的テキストを重ねる

bash
ffmpeg -i input.mp4 \
  -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black, \
       drawtext=text='チャンネル登録よろしく':fontsize=48:fontcolor=white:x=(w-text_w)/2:y=h-100: \
       fontfile=/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc: \
       box=1:boxcolor=black@0.6:boxborderw=10" \
  -c:v libx264 -crf 20 -preset slow -pix_fmt yuv420p \
  -c:a aac -b:a 128k -movflags +faststart \
  output_text.mp4

drawtext の主なパラメータ:

パラメータ説明
text表示するテキスト
fontsizeフォントサイズ(ピクセル)。1080p縦動画なら48〜72が読みやすい
fontcolorテキスト色(whiteyellow#FF5733
x, y位置——(w-text_w)/2 で水平中央揃え
fontfileフォントファイルのパス。日本語は必ず日本語対応フォントを指定
box=1背景ボックスを有効化
boxcolor=black@0.6半透明の黒背景
enable='between(t,2,8)'2〜8秒の間だけ表示

SRT字幕を焼き込む

ハードサブ(焼き込み字幕)はSNS動画の定番——ほとんどの視聴者がミュートで見ている。プラットフォームの自動字幕は誤認識が多いので、自前の字幕を焼き込む方が確実だ。

bash
ffmpeg -i input.mp4 \
  -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black, \
       subtitles=captions.srt:force_style='FontSize=20,FontName=Noto Sans CJK JP,PrimaryColour=&H00FFFFFF,OutlineColour=&H00000000,Outline=2,MarginV=60'" \
  -c:v libx264 -crf 20 -preset slow -pix_fmt yuv420p \
  -c:a aac -b:a 128k -movflags +faststart \
  output_subtitled.mp4

force_style はASSスタイル構文を使う。主なオプション:

  • FontSize=20 — ASSの座標系でのサイズ(drawtextのピクセル指定とは異なる)
  • PrimaryColour=&H00FFFFFF — 白テキスト(書式: &HAABBGGRR
  • OutlineColour=&H00000000 — 黒アウトライン
  • Outline=2 — アウトラインの太さ
  • MarginV=60 — 下端からのマージン(プラットフォームのUIに被らないように)

ASS字幕で高度なスタイリング

ワード単位のハイライト(カラオケ風)や精密な配置が必要なら、ASS形式を使う。

bash
ffmpeg -i input.mp4 \
  -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black, \
       ass=styled_captions.ass" \
  -c:v libx264 -crf 20 -preset slow -pix_fmt yuv420p \
  -c:a aac -b:a 128k -movflags +faststart \
  output_ass.mp4

音声から自動で字幕を生成するなら、FFmpeg + Whisper 自動字幕生成ガイド を参照。

プラットフォーム別の微調整

万能プリセットで90%のケースはカバーできるが、特定のプラットフォームに最適化したい場合もある。

YouTube Shorts

YouTubeは高ビットレートでアップロードすると 複数の画質ティア をより長く保持する。

bash
ffmpeg -i input.mp4 \
  -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black,setsar=1" \
  -c:v libx264 -crf 18 -preset slow -profile:v high -level 4.2 \
  -pix_fmt yuv420p -r 60 \
  -c:a aac -b:a 192k -ar 48000 -ac 2 \
  -movflags +faststart \
  -t 180 \
  output_shorts.mp4

万能プリセットとの違い:

  • -crf 18 — 高品質(YouTubeが再エンコードするので綺麗な素材を渡す)
  • -r 60 — 60 fpsで滑らかな再生
  • -b:a 192k -ar 48000 — 高音質
  • -t 180Shortsの最大尺 3分でカット

Instagram Reels

Metaのサーバーは強力に再エンコードするので、巨大なファイルを送る意味はない。小さく綺麗なソースを目指す。

bash
ffmpeg -i input.mp4 \
  -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black,setsar=1" \
  -c:v libx264 -crf 22 -preset slow -profile:v high -level 4.0 \
  -pix_fmt yuv420p -r 30 \
  -c:a aac -b:a 128k -ar 44100 -ac 2 \
  -movflags +faststart \
  -t 90 \
  output_reels.mp4
  • -crf 22 — やや圧縮を強めに(Metaが再エンコードするので)
  • -t 90 — Instagramはリーチ最適化のため90秒以内を推奨

TikTok

TikTokのアルゴリズムは21〜34秒の動画を好む傾向がある。ファイルサイズは小さめに。

bash
ffmpeg -i input.mp4 \
  -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black,setsar=1" \
  -c:v libx264 -crf 23 -preset slow -profile:v high -level 4.0 \
  -maxrate 4M -bufsize 8M \
  -pix_fmt yuv420p -r 30 \
  -c:a aac -b:a 128k -ar 44100 -ac 2 \
  -movflags +faststart \
  output_tiktok.mp4
  • -maxrate 4M -bufsize 8M — ビットレートの上限を抑えてファイルサイズをコントロール
  • -crf 23 — サイズ重視のバランス

X(Twitter)

Xは無料ユーザーのファイルサイズ制限(512 MB)と尺制限(2分20秒)が最も厳しい。

bash
ffmpeg -i input.mp4 \
  -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black,setsar=1" \
  -c:v libx264 -crf 23 -preset slow -profile:v high -level 4.0 \
  -maxrate 5M -bufsize 10M \
  -pix_fmt yuv420p -r 30 \
  -c:a aac -b:a 128k -ar 44100 -ac 2 \
  -movflags +faststart \
  -t 140 \
  output_x.mp4
  • -t 140 — 2分20秒でハードカット
  • -maxrate 5M — ビットレートの急上昇を防いで512 MB超えを回避

一括変換(バッチ処理)

大量の動画を変換するなら、シェルスクリプトで自動化しよう。

フォルダ内の全動画を変換

bash
#!/bin/bash
# batch-vertical.sh — 全MP4を9:16縦動画に変換
INPUT_DIR="$1"
OUTPUT_DIR="$2"
METHOD="${3:-pad}"  # pad, crop, blur

mkdir -p "$OUTPUT_DIR"

for f in "$INPUT_DIR"/*.mp4; do
  filename=$(basename "$f" .mp4)
  echo "処理中: $filename"

  case "$METHOD" in
    pad)
      VF="scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black,setsar=1"
      ;;
    crop)
      VF="scale=-2:1920,crop=1080:1920,setsar=1"
      ;;
    blur)
      ffmpeg -i "$f" -filter_complex \
        "[0:v]scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,boxblur=20:5[bg]; \
         [0:v]scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:color=0x00000000[fg]; \
         [bg][fg]overlay=0:0,format=yuv420p" \
        -c:v libx264 -crf 20 -preset slow \
        -c:a aac -b:a 128k -movflags +faststart \
        -y "$OUTPUT_DIR/${filename}_vertical.mp4"
      continue
      ;;
  esac

  ffmpeg -i "$f" \
    -vf "$VF" \
    -c:v libx264 -crf 20 -preset slow -pix_fmt yuv420p \
    -c:a aac -b:a 128k -movflags +faststart \
    -y "$OUTPUT_DIR/${filename}_vertical.mp4"
done

echo "完了。出力先: $OUTPUT_DIR"

使い方:

bash
chmod +x batch-vertical.sh
./batch-vertical.sh ./raw_videos ./vertical_output pad
./batch-vertical.sh ./raw_videos ./vertical_output blur

並列処理で高速化

上のスクリプトは1本ずつ処理する。大量のファイルを扱うなら、xargsで並列化すると速い。

bash
# 4本同時にエンコード
ls raw_videos/*.mp4 | xargs -P 4 -I {} bash -c '
  filename=$(basename "{}" .mp4)
  ffmpeg -i "{}" \
    -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black,setsar=1" \
    -c:v libx264 -crf 20 -preset slow -pix_fmt yuv420p \
    -c:a aac -b:a 128k -movflags +faststart \
    -y "vertical_output/${filename}_vertical.mp4"
'

より高度な自動化(Python、進捗表示、エラーハンドリング)は FFmpeg × Python 自動化ガイド を参照。

よくある質問(FAQ)

Shorts・Reels・TikTokのベストなアスペクト比は?

全プラットフォームで 9:16(1080×1920) 。1:1(正方形)も投稿できるが、フルスクリーン縦表示を優先するプラットフォームでは画面占有率が下がり、エンゲージメントも低くなる。

4K(2160×3840)の縦動画をアップロードできる?

YouTube Shortsは4Kに対応している。ただしInstagramとTikTokはサーバー側で1080pに再エンコードされるため、4Kでアップロードしても画質向上にはつながらない。アップロード時間と帯域の無駄なので、1080×1920に統一するのがベスト。

正方形(1:1)の動画を9:16にするには?

16:9と同じアプローチ——パディング、クロップ、ブラー背景のいずれか:

bash
# 正方形→9:16(パディング)
ffmpeg -i square.mp4 \
  -vf "scale=1080:-2:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black" \
  -c:v libx264 -crf 20 -pix_fmt yuv420p -c:a copy \
  output_vertical.mp4

H.264ではなくH.265(HEVC)を使うべき?

SNSへのアップロードにはH.264がベスト。全プラットフォームがH.264のアップロードに対応しており、HEVCだと処理エラーが発生するケースがある。プラットフォーム側は内部的にVP9やAV1に再エンコードするので、入力コーデックで画質に差は出ない。マスター保存用ならH.265やAV1の方が圧縮効率は高い——AV1 vs H.265 vs H.264 比較ガイド を参照。

動画を特定の尺にトリミングしてから変換するには?

-ss(開始時間)と -t(秒数)または -to(終了時間)を使う:

bash
# 1分15秒から30秒間を切り出し
ffmpeg -ss 01:15 -i input.mp4 -t 30 \
  -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black" \
  -c:v libx264 -crf 20 -pix_fmt yuv420p -c:a aac -b:a 128k \
  -movflags +faststart output_clip.mp4

-ss-i に置くと高速シーク(入力シーク)、 に置くとフレーム精度の正確なシーク(低速)になる。詳しくは FFmpegの使い方 完全ガイド を参照。

GPUでエンコードを高速化するには?

libx264 をハードウェアエンコーダに置き換えるだけ:

bash
# NVIDIA NVENC
-c:v h264_nvenc -preset p4 -cq 22

# Intel Quick Sync
-c:v h264_qsv -global_quality 22

# Apple VideoToolbox(macOS)
-c:v h264_videotoolbox -q:v 60

GPUエンコードは3〜10倍高速だが、同じ画質だとファイルサイズがやや大きくなる。セットアップ手順は FFmpeg GPU高速化ガイド を参照。

SNSにアップロードする前に音声の正規化は必要?

強く推奨する。各プラットフォームは独自のラウドネス正規化(おおむね -14 LUFS前後)を適用する。音量が極端に小さいまたは大きいソースだと、プラットフォーム側の処理で音が潰れたり歪んだりすることがある。事前に正規化しておくことで、最終的な音質をコントロールできる。詳しくは FFmpeg音声正規化ガイド を参照。

各プラットフォームに最適な動画の長さは?

コンテンツの種類やオーディエンスによって変わるが、アルゴリズムが好む傾向の目安:

プラットフォーム最適な尺最大尺
YouTube Shorts30〜60秒3分
Instagram Reels15〜30秒20分
TikTok21〜34秒60分(アップロード)
X15〜45秒2分20秒(無料)/ 4時間(Premium)
Facebook Reels15〜30秒制限なし(90秒以内推奨)

まとめ

FFmpegでSNS向けの動画変換は3つのポイントに集約される: 正しい解像度(1080×1920)、正しいコーデック(H.264 + AAC / MP4)、そしてコンテンツに合った変換方法(クロップ・パディング・ブラー背景)。

記事冒頭の 万能プリセット でほとんどの場面をカバーできる。大量処理が必要なら バッチスクリプト で数百本まとめて変換できる。音声正規化や字幕生成も組み合わせるなら、loudnormガイドWhisper字幕ガイド を参照してほしい。

FFmpegコマンドの全体像は FFmpegの使い方 完全ガイド にまとまっている。