ffmpegに入門した

# 1. インストール


公式サイトからビルド済みバイナリをダウンロードしてきます
https://ffmpeg.org/download.html
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/4b34d399-8a3c-bb11-38b0-ccecca54f757.png" width=30%>
落としてきた圧縮ファイルを適当なフォルダに展開して、binフォルダにPATHを通せばインストール完了です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277233/34f968b2-b473-32d4-b0a7-9ff5298d1cfc.png)
PATHが通ってれば以下のようにterminalから呼べるようになっている筈です

```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: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
```


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


```terminal:対応ファイル形式を表示する
ffmpeg -formats
```


```terminal:対応コーデックを表示する
ffmpeg -codecs
```


```terminal:使えるプロトコルを表示する
ffmpeg -protocols
```


# 3. 動画情報を取得する


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


```terminal: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のオプション一覧の方が分かりやすいかも
<a href="https://ja.wikipedia.org/wiki/FFmpeg#FFmpeg%E3%82%92%E5%88%A9%E7%94%A8%E3%83%BB%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">https://ja.wikipedia.org/</a>


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


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


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


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


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


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


```terminal:ビデオコーデックをx264に指定する
ffmpeg -i input.mp4 -vcodec libx264 output.mp4
```


```terminal:音声コーデックをaacに指定する
ffmpeg -i input.mp4 -acodec libfaac output.mp4
```


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


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


```terminal:
ffmpeg -i input.mp4 -vcodec copy -acodec copy output.mp4
```


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


```terminal:ビデオビットレートを340kbpsに指定する
ffmpeg -i input.mp4 -vb 340k output.mp4
```


```terminal:音声ビットレートを64kbpsに指定する
ffmpeg -i input.mp4 -ab 64k output.mp4
```


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


```terminal: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でビデオ書き出しを無効にすれば音声のみ書き出すことが出来ます


```terminal: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. 連番画像で書き出す


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


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


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


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


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


```terminal: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
```