🎬

【ffmpeg】超便利なコマンド18選・解説付き

2024/07/15に公開

ffmpegのよく使うコマンド集です。
見つけたコマンド、思い立ったコマンドを随時更新していきます。良かったら見ていってください。
また、解説については既に説明したものは省いているのでご了承ください。

コマンド集

1. 画質を落とす+汎用性の高いエンコードに直す

ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4

【解説】

  • -c:v libx264: H.264コーデックを使用(広くサポートされている)
  • -crf 23: 画質を調整 (18-28が良い範囲、数値が小さいほど高画質)
  • -preset medium: エンコード速度と圧縮率のバランス (faster, slowなども選択可能)
  • -c:a aac: AACオーディオコーデックを使用 (多くのデバイスでサポート)
  • -b:a 128k: オーディオビットレートを128kbpsに設定

2. 解像度を落とす

ffmpeg -i input.mp4 -vf scale=1280:720 -c:v libx264 -c:a aac -b:a 128k output.mp4

【解説】

  • 解像度変更: -vf scale=1280:720 (1280x720に変更)

【ほかの便利なオプション】

  • アスペクト比維持: -vf scale=1280:-2 (-2で自動計算)
  • フレームレート変更: -r 30 (30fpsに変更)

3. 動画結合

方法1: txtファイルにリスト作って結合

list.txtファイルを以下のような内容で保存します

list.txt
file /path/A.mp4
file /path/B.mp4

そして、このようなコマンドを実行します

ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4

【解説】

  • concat: 動画の結合には基本的にこのコマンドを使います
  • -safe 0: これを指定すると、このセキュリティ制約が無効になり、相対パスや絶対パスを含むファイルリストを読み込むことができるようになります。

方法2: コマンド内で完結させる

ffmpeg -i "concat:A.mp4|B.mp4" -c copy output.mp4

【解説】

  • concat:A.mp4|B.mp4: concat:の後に動画ファイルのファイル名、そして|で区切ることで複数のファイルを結合できます。

4. 動画カット

ffmpeg -i input.mp4 -ss 00:01:00 -to 00:02:00 -c copy output.mp4

【解説】

  • -ss: カットの最初のタイム。最初の00が時間(hour)、01が分、最後の00が秒です。秒は小数に対応しており、00:01:00.10と指定することも可能です。
  • -to: カットの最後のタイム。これも小数で指定することができます。

【ほかの便利なオプション】

  • 秒数指定: -t 25 (カットの最初のタイムから秒数でカウントしカット)

5. 動画から音声を抽出

ffmpeg -i input.mp4 -vn -c:a copy output.aac

【解説】

  • -vn: 映像なし
  • -c:a copy: 音声コーデックをコピー

6. 動画の音声調整

ffmpeg -i input.mp4 -af "volume=1.5" output.mp4

【解説】

  • -af: オーディオフィルタ
  • volume=1.5: 音量を1.5倍に

7. 動画から音声削除

ffmpeg -i input.mp4 -an -c:v copy output.mp4

【解説】

  • -an: 音声なし

8. 動画の回転

ffmpeg -i input.mp4 -vf "transpose=1" output.mp4

【解説】

  • transpose=1: 時計回りに90度回転。
  • 0: 反時計回りに回転+上下反転)
  • 2: 反時計回りに90度回転)
  • 3: 時計回りに回転+上下反転)

9. 動画の手振れ補正

ffmpeg -i input.mp4 -vf vidstabdetect -f null -
ffmpeg -i input.mp4 -vf vidstabtransform output.mp4

【解説】

  • vidstabdetectvidstabtransform: 手ぶれ補正

10. 動画の字幕焼き付け

ffmpeg -i input.mp4 -vf subtitles=subtitle.srt output.mp4

【解説】

  • subtitle.srt: 字幕ファイルを指定。ここではSRTファイルを使用。

11. 音量の平均を算出する (デシベル)

ffmpeg -i input.mp4 -vn -af volumedetect -f null /dev/null

【解説】
このコマンドを実行すると、最後の方にこのような出力が得られます。

[Parsed_volumedetect_0 @ xxxxxxxxxxxxxx] mean_volume: -23.5 dB
[Parsed_volumedetect_0 @ xxxxxxxxxxxxxx] max_volume: -5.8 dB

mean_volumeが平均したボリュームで、max_volumeはその名の通りの音量です。
一般的にmax_volume0dbになるくらいに調整するのが好ましいとされています。

  • input.mp4: 音量を測定したい動画ファイルのパスに置き換えてください。
  • -vn: ビデオストリームを無視します。
  • -af volumedetect: 音量検出フィルターを適用します。
  • -f null /dev/null: 出力ファイルをnullデバイスに指定し、ファイルを出力しません。

12. 動画⇒連番画像

1. 動画をすべて連番の画像としてアウトプットする

動画全体を画像として保存する場合、次のようにします:

ffmpeg -i input_video.mp4 -vf "fps=1" output_%04d.png
  • input_video.mp4 は変換する動画ファイルの名前です。
  • fps=30 は1秒ごとに30枚の画像を出力する設定です。これを変更すると、出力される画像の枚数を調整できます。
  • output_%04d.png は出力する画像の名前で、%04d は連番です(例: output_0001.png, *output_0002.png` など)。

2. 動画の指定した範囲内を連番の画像としてアウトプットする

動画の指定範囲(例えば 00:00:30 から 00:01:00)を連番画像として保存するには、次のようにします:

ffmpeg -i input_video.mp4 -ss 00:00:30 -to 00:01:00 -vf "fps=1" output_%04d.png
  • -ss 00:00:30: 開始時間(30秒)。
  • -to 00:01:00: 終了時間(1分)。

3. 動画の指定した時間の画像をアウトプットする

指定した時間(例: 1分30秒)の画像を1枚だけ抽出する場合、次のコマンドを使います:

ffmpeg -i input_video.mp4 -ss 00:01:30 -vframes 1 output.png

【解説】

  • -vframes 1: 1枚の画像だけ出力する。
  • -ss 00:01:30: 1分30秒の位置から出力。

13. 連番画像⇒動画

ffmpeg -r 25 -f image2 -s 1920x1080 -i image-%04d.jpg output.mp4

【解説】

  • -r 25: 出力動画のフレームレートを25fpsに設定します。
  • -f image2: 入力形式を画像として指定します。

【ほかの便利なオプション】

  • 音声を追加: -i audio.mp3のように音声ファイルを追加することで、動画に音声を付けることができます。

14. 動画の音声を置き換える(無劣化・高音質)

ffmpeg -i input_video.mp4 -i new_audio.wav -c:v copy -c:a copy -map 0:v:0 -map 1:a:0 -shortest output_video.mp4

歌詞動画を作ってるときに思い立ったコマンドです。

【解説】

  • -c:a copy: 音声を再エンコードしないので無劣化のままアウトプットします
  • -shortest: 音声ファイルと動画ファイルの尺が違うときに短い方を優先するオプションです
  • -map 0:v:0: 動画の0番目のビデオストリームを選択します。つまりデフォルトです
  • -map 1:a:0: 音声の1番目のオーディオストリームを選択します。つまりデフォr(ry

15. 無音を生成する

ffmpeg -f lavfi -i anullsrc=r=44100:cl=stereo -t 2 silence.mp3

【解説】

  • -f lavfi -i anullsrc=r=44100:cl=stereo: lavdiフィルターをanullsrcと併用し無音を生成します。r=44100はサンプルレート、cl=stereoはステレオ指定です。

16. 音声ファイルを指定時間ループする

ffmpeg -stream_loop -1 -i input.mp3 -t 10 -c copy output.mp3

【解説】

  • -stream_loop -1: 入力ファイルを無限にループします。
  • -t 10: この場合は出力ファイルの長さを10秒に設定します。

【ほかの便利なオプション】

  • ループ間に無音を挿入:
    さきほどの15. 無音を生成するのコマンドでsilence.mp3を生成し、

    ffmpeg -i input.mp3 -i silence.mp3 -i input.mp3 -filter_complex "[0:a][1:a][2:a]concat=n=3:v=0:a=1[outa]" -map "[outa]" output.mp3
    

    でおkです。

    【解説】

    • [0:a]0は一番目に結合する音声ファイル(a)を表しています。
    • 1:a2:aも二番目、三番目の音声ファイルをあらわしています。
    • n=3は三つ結合することを表しています。
    • v=0はビデオストリームを結合しないことを、a=1でオーディオストリームを結合することを表しています。

17. 2つの音声ファイルを指定した比率の音量で重ね合わせる

ffmpeg -i input.mp3 -i input2.mp3 -filter_complex "[0:a]volume=0.7[a1]; [1:a]volume=0.3[a2]; [a1][a2]amix=inputs=2" output.mp3

【解説】

  • [0:a]volume=0.7[a1]: 最初の音声ストリームの音量を0.7倍に設定し、ラベル[a1]を付ける。
  • [1:a]volume=0.3[a2]: 2番目の音声ストリームの音量を0.3倍に設定し、ラベル[a2]を付ける。
  • [a1][a2]amix=inputs=2: a1とa2の音声ストリームをミックスする。

18. 一枚の画像と音声ファイルを結合する

ffmpeg -loop 1 -i image.jpg -i audio.mp3 -c:v libx264 -tune stillimage -c:a aac -b:a 192k -shortest output.mp4

【解説】

  • -loop 1: 画像をループさせます。このオプションにより、音声が再生されている間、画像が表示され続けます。
  • -tune stillimage: 静止画像用の設定を適用。
  • -shortest: 音声の長さに合わせて出力動画の長さを調整します。

おまけ

mp4を汎用性の高い動画に変換するbatファイルです。
複数ファイルでもドラッグ&ドロップで変換できるようにしました。
保存して使ってください。

@echo off
setlocal enabledelayedexpansion

:loop
if "%~1"=="" goto end

set "infile=%~1"
set "outfile=%~dpn1"

:checkfile
if not exist "%outfile%_1.mp4" (
    set "outfile=%outfile%_1"
) else (
    set /a num=2
    :checkloop
    if exist "%outfile%_%num%.mp4" (
        set /a num+=1
        goto checkloop
    ) else (
        set "outfile=%outfile%_%num%"
    )
)

echo %infile% を %outfile%.mp4 に変換中...
ffmpeg -i "%infile%" -c:v libx264 -c:a aac -b:a 128k "%outfile%.mp4"

shift
goto loop

:end
echo 変換が完了しました。
pause

Discussion