LoginSignup
6
3

More than 3 years have passed since last update.

ffmpegに入門した

Posted at

1. インストール

公式サイトからビルド済みバイナリをダウンロードしてきます
https://ffmpeg.org/download.html

落としてきた圧縮ファイルを適当なフォルダに展開して、binフォルダにPATHを通せばインストール完了です
image.png
PATHが通ってれば以下のようにterminalから呼べるようになっている筈です

terminal
> ffmpeg

ffmpeg version 2021-03-07-git-a7f841718f-full_build-www.gyan.dev Copyright (c) 2000-2021 the FFmpeg developers
  built with gcc 10.2.0 (Rev6, Built by MSYS2 project)

2. helpを表示する

オプションを忘れたときには-hで確認できます

terminal
> ffmpeg -h

Getting help:
    -h      -- print basic options
    -h long -- print more options
    -h full -- print all options (including all format and codec specific options, very long)
    -h type=name -- print all options for the named decoder/encoder/demuxer/muxer/filter/bsf/protocol
    See man ffmpeg for detailed description of the options.

Print help / information / capabilities:
-L                  show license
-h topic            show help
-? topic            show help
-help topic         show help
--help topic        show help
-version            show version
-buildconf          show build configuration
-formats            show available formats
-muxers             show available muxers
-demuxers           show available demuxers
-devices            show available devices
-codecs             show available codecs
-decoders           show available decoders
-encoders           show available encoders

対応しているファイル形式やコーデックを確認することも出来ます

対応ファイル形式を表示する
ffmpeg -formats
対応コーデックを表示する
ffmpeg -codecs
使えるプロトコルを表示する
ffmpeg -protocols

3. 動画情報を取得する

ffprobeにファイルを渡すとファイルの情報を教えてくれます。-iが入力の指示で、その後にファイルパスを渡しています。

terminal
> ffprobe -i ファイルパス

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '2021-03-09_20-20-21.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:18:37.67, start: 0.000000, bitrate: 5492 kb/s
  Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 4997 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 161 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
  Stream #0:2(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 161 kb/s
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
  Stream #0:3(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 160 kb/s
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]

18分37秒の動画でbitrateが5492 kb/s、h264フォーマットのビデオトラックと、aacフォーマット48000Hzのオーディオトラックが3つ入っているようです。

4. 動画を加工して保存する

指定できるオプションは公式ドキュメントに一覧されています
https://ffmpeg.org/ffmpeg.html

公式ドキュメントは情報量が多すぎるので、初めて使う人はwikipediaのオプション一覧の方が分かりやすいかも
https://ja.wikipedia.org/

4-1. フォーマットを変更して保存する

-fでフォーマットを指定できます

aviフォーマットに変更する
ffmpeg -i input.mp4 -f avi output.avi

-fを省略した場合はファイル名の拡張子で推定して変換してくれます

aviフォーマットに変更する
ffmpeg -i input.mp4 output.avi

4-2. コーデックを変更する

ビデオコーデックをx264に指定する
ffmpeg -i input.mp4 -vcodec libx264 output.mp4
音声コーデックをaacに指定する
ffmpeg -i input.mp4 -acodec libfaac output.mp4

4-3. 再エンコードしない

codecにcopyを指定すると再エンコードしなくなるようです

ffmpeg -i input.mp4 -vcodec copy -acodec copy output.mp4

4-4. ビットレートを変更する

ビデオビットレートを340kbpsに指定する
ffmpeg -i input.mp4 -vb 340k output.mp4
音声ビットレートを64kbpsに指定する
ffmpeg -i input.mp4 -ab 64k output.mp4

4-5. フレームレートを変更する

120fpsに変更する
ffmpeg -i input.mp4 -r 120 output.mp4

4-6. リサイズする

1920x1080書き出す
ffmpeg -i input.mp4 -s 1920x1080 output.mp4

4-7. 時間範囲を指定して切り出す

10秒目から20秒間分を書き出す
ffmpeg -i input.mp4 -ss 10 -t 20 output.mp4

4-8. DVD-videoで書き出す

アスペクト比16/9、NTSC-dvd形式で書き出す
ffmpeg -i input.mp4 -target ntsc-dvd -aspect 16:9 output.mpg

4-9. 既にファイルがある場合も上書きする

書き出し先のファイルが既にある場合に上書きするかどうか聞かれますが、確認せずに上書き保存したい場合は-yを付けます

ffmpeg -i input.mp4 -y output.mp4

4-10. いろいろまとめて変更する

連ねて書いていけばまとめて適用してくれます

いろいろ変更して保存する
ffmpeg -i input.mp4 -vcodec libx265 -vb 340k -r 120 -s 1920x1080 -y output.mp4

5. 音声ファイルを書き出す

5-1. 音声のみ書き出す

-vnでビデオ書き出しを無効にすれば音声のみ書き出すことが出来ます

128kbpsのaacフォーマットで書き出す
ffmpeg -i input.mp4 -f aac -vn -acodec libfaac -ab 128k output.aac

-vnを省いても音声フォーマットで書き出す場合はビデオの書き出しが無効なのは自明なのでそれでも良いようです

mp3に変換して書き出す
ffmpeg -i input.mp4 output.mp3

5-2. 指定した音声トラックのみ書き出す

ffprobeでトラック情報を取得すると、いくつ音声トラックが入っているか分かります。以下の場合はビデオトラックの0:0と0:1~0:3の3つの音声トラックが入っています。

ffprobeで取得したトラック情報
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 161 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
  Stream #0:2(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 161 kb/s
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
  Stream #0:3(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 160 kb/s
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]

-mapで音声トラックを指定すれば、そのトラックに対して処理を行うことが出来ます

2番目の音声トラックを書き出す
ffmpeg -i input.mp4 -map 0:2 -vn -acodec copy output.aac

6. 画像ファイルを書き出す

6-1. 連番画像で書き出す

1秒あたり5枚の静止画像を書き出す
ffmpeg -i input.mp4 -r 5 image%03d.png

6-2. gif画像で書き出す

1秒あたり5枚の静止画像を20秒目から10秒間分書き出す
ffmpeg -i input.mp4 output.gif

7. バッチファイルで処理する

ファイルパスをいちいち書きたくない場合はバッチファイルを使ってドラッグ&ドロップで出来るようにすると良いかもしれません

separate_audio.bat
ffmpeg -i %~nx1 -map 0:1 -vn -acodec pcm_s16le 1.wav -map 0:2 -vn -acodec pcm_s16le 2.wav -map 0:3 -vn -acodec pcm_s16le 3.wav
6
3
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
6
3