横長の動画を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 Shorts | 9:16 | 1080×1920 | H.264 + AAC | 3分 | 256 GB |
| Instagram Reels | 9:16 | 1080×1920 | H.264 + AAC | 20分(90秒推奨) | 4 GB |
| TikTok | 9:16 | 1080×1920 | H.264 + AAC | 録画10分 / アップロード60分 | 72〜500 MB |
| X(Twitter) | 9:16, 16:9, 1:1 | 1920×1080 | H.264 + AAC | 2分20秒(無料)/ 4時間(Premium) | 512 MB(無料)/ 16 GB(Premium) |
| Facebook Reels | 9:16 | 1080×1920 | H.264 + AAC | 制限なし(90秒以内推奨) | 4 GB |
パターンは明確: 1080×1920、H.264、AAC、MP4 。これが全プラットフォーム共通のターゲットだ。各プラットフォームの仕様は頻繁に変わるので、大量アップロードの前にはリンク先の公式ページで最新の上限を確認しよう。
推奨ビットレート
ビットレートは画質とファイルサイズのトレードオフ。プラットフォーム側で再エンコードされるため、上げすぎても帯域の無駄になる。
| プラットフォーム | 映像ビットレート | 音声ビットレート | 備考 |
|---|---|---|---|
| YouTube Shorts | 5〜10 Mbps | 128 kbps | YouTube公式は1080pで8 Mbps以上推奨 |
| Instagram Reels | 3.5〜5 Mbps | 128 kbps | Metaは強力に再エンコードする |
| TikTok | 2〜4 Mbps | 128 kbps | ファイルサイズ最適化向き |
| X | 2.5〜5 Mbps | 128 kbps | 1080pで5 Mbps、720pで2.5 Mbps |
| Facebook Reels | 4〜6 Mbps | 128 kbps | テキスト多めの動画はやや高めに |
万能FFmpegプリセット
このコマンド1つで、上記すべてのプラットフォームに対応したファイルが作れる。
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=decrease | 1080×1920に収まるようにスケーリング(アスペクト比維持) |
pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black | 余白を黒帯で埋める |
setsar=1 | 正方形ピクセルを保証(引き伸ばし防止) |
-crf 20 | 品質レベル——低いほど高画質・大容量。18〜23が実用的な範囲 |
-preset slow | エンコード時間を犠牲に圧縮効率を向上 |
-profile:v high -level 4.2 | H.264の最大互換性 |
-pix_fmt yuv420p | 幅広いプレイヤーとの互換性に必須 |
-movflags +faststart | moovアトムを先頭に移動——Web再生に必須 |
プラットフォーム別のCRF調整
-crf の値で品質とサイズのバランスを調整できる。
# YouTube Shorts — 高品質(YouTubeが再エンコードするので綺麗な素材を渡す)
-crf 18
# Instagram Reels / TikTok — バランス型(どうせ圧縮される)
-crf 22
# X — ファイルサイズ優先(512 MB制限対策)
-crf 23
16:9 → 9:16 変換の3つの手法
万能プリセットはパディング(黒帯)方式だが、それがベストとは限らない。被写体をクロップで切り出すこともあれば、ブラー背景でプロっぽく仕上げたいこともある。3つの方法を使い分けよう。
方法1: パディング(黒帯)
向いている場面: チュートリアル、画面録画、内容をすべて見せたい動画。
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: クロップ(中央切り抜き)
向いている場面: アクション中心の映像、被写体が中央にある動画。
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%が失われる。
特定の位置からクロップしたい場合:
# 左寄りの被写体 → 左端からクロップ
-vf "scale=-2:1920,crop=1080:1920:0:0"
# 右寄りの被写体 → 右端からクロップ
-vf "scale=-2:1920,crop=1080:1920:iw-1080:0"
方法3: ブラー背景(プロっぽい仕上がり)
向いている場面: YouTubeの横動画をShorts/Reelsに転用するとき。多くのクリエイターが使う定番テクニック——元の映像を中央に配置し、背景をぼかしたズーム版で埋める。
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
フィルタチェーンの仕組み:
[bg]: 入力を1080×1920を ** 覆う** ようにスケーリング→クロップ→ボックスブラー適用[fg]: 入力を1080×1920に ** 収まる** ようにスケーリング→透明パディングoverlay: ぼかした背景の上にシャープな前景を重ねる
どの方法を選ぶべきか?
| 方法 | メリット | デメリット | 向いている用途 |
|---|---|---|---|
| パディング | 内容の欠損なし、高速 | 画面が狭い、地味 | チュートリアル、画面録画 |
| クロップ | 画面いっぱいに表示 | 左右の映像が失われる | アクション、中央の被写体 |
| ブラー背景 | プロっぽい仕上がり、内容の欠損なし | エンコードが遅い、ファイルが大きい | YouTube動画の転用 |
テキストオーバーレイと字幕の焼き込み
SNS向けの縦動画にはテキストがほぼ必須——タイトル、CTA、フルキャプション。FFmpegなら静的テキストも字幕も焼き込める。
drawtextで静的テキストを重ねる
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 | テキスト色(white、yellow、#FF5733) |
x, y | 位置——(w-text_w)/2 で水平中央揃え |
fontfile | フォントファイルのパス。日本語は必ず日本語対応フォントを指定 |
box=1 | 背景ボックスを有効化 |
boxcolor=black@0.6 | 半透明の黒背景 |
enable='between(t,2,8)' | 2〜8秒の間だけ表示 |
SRT字幕を焼き込む
ハードサブ(焼き込み字幕)はSNS動画の定番——ほとんどの視聴者がミュートで見ている。プラットフォームの自動字幕は誤認識が多いので、自前の字幕を焼き込む方が確実だ。
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形式を使う。
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は高ビットレートでアップロードすると 複数の画質ティア をより長く保持する。
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 180— Shortsの最大尺 3分でカット
Instagram Reels
Metaのサーバーは強力に再エンコードするので、巨大なファイルを送る意味はない。小さく綺麗なソースを目指す。
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秒の動画を好む傾向がある。ファイルサイズは小さめに。
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秒)が最も厳しい。
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超えを回避
一括変換(バッチ処理)
大量の動画を変換するなら、シェルスクリプトで自動化しよう。
フォルダ内の全動画を変換
#!/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"
使い方:
chmod +x batch-vertical.sh
./batch-vertical.sh ./raw_videos ./vertical_output pad
./batch-vertical.sh ./raw_videos ./vertical_output blur
並列処理で高速化
上のスクリプトは1本ずつ処理する。大量のファイルを扱うなら、xargsで並列化すると速い。
# 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と同じアプローチ——パディング、クロップ、ブラー背景のいずれか:
# 正方形→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(終了時間)を使う:
# 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 をハードウェアエンコーダに置き換えるだけ:
# 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 Shorts | 30〜60秒 | 3分 |
| Instagram Reels | 15〜30秒 | 20分 |
| TikTok | 21〜34秒 | 60分(アップロード) |
| X | 15〜45秒 | 2分20秒(無料)/ 4時間(Premium) |
| Facebook Reels | 15〜30秒 | 制限なし(90秒以内推奨) |
まとめ
FFmpegでSNS向けの動画変換は3つのポイントに集約される: 正しい解像度(1080×1920)、正しいコーデック(H.264 + AAC / MP4)、そしてコンテンツに合った変換方法(クロップ・パディング・ブラー背景)。
記事冒頭の 万能プリセット でほとんどの場面をカバーできる。大量処理が必要なら バッチスクリプト で数百本まとめて変換できる。音声正規化や字幕生成も組み合わせるなら、loudnormガイド と Whisper字幕ガイド を参照してほしい。
FFmpegコマンドの全体像は FFmpegの使い方 完全ガイド にまとまっている。