ffmpeg チートシート（Linux版）

主に RaspberryPi3 で動く Raspbian か、NanoPi NEO2 で動く Armbian で試している。

macOS版はこちら -> https://qiita.com/miminashi/items/e10e5ce2032184ee6070

# フォーマット一覧を表示する

```shell-session
$ ffmpeg -formats
```

# エンコーダ一覧を表示する

```
ffmpeg -encoders
```

# ピクセルフォーマットの一覧を表示する

```sh
ffmpeg -pix_fmts
```

# RTMPで使えるオプション

```
```

# h264_omx で使えるオプション

```
$ ffmpeg --help encoder=h264_omx
ffmpeg version N-85599-g0b8c159 Copyright (c) 2000-2017 the FFmpeg developers
  built with gcc 4.9.2 (Raspbian 4.9.2-10)
  configuration: --enable-gpl --enable-nonfree --enable-mmal --enable-omx-rpi --enable-omx --extra-cflags=-I/home/pi/ffmpeg/include --extra-ldflags=-L/home/pi/ffmpeg/lib --extra-libs=-ldl
  libavutil      55. 61.100 / 55. 61.100
  libavcodec     57. 93.100 / 57. 93.100
  libavformat    57. 72.101 / 57. 72.101
  libavdevice    57.  7.100 / 57.  7.100
  libavfilter     6. 85.100 /  6. 85.100
  libswscale      4.  7.101 /  4.  7.101
  libswresample   2.  8.100 /  2.  8.100
  libpostproc    54.  6.100 / 54.  6.100
Encoder h264_omx [OpenMAX IL H.264 video encoder]:
    General capabilities: delay 
    Threading capabilities: none
    Supported pixel formats: yuv420p
h264_omx AVOptions:
  -omx_libname       <string>     ED.V.... OpenMAX library name
  -omx_libprefix     <string>     ED.V.... OpenMAX library prefix
  -zerocopy          <int>        E..V.... Try to avoid copying input frames if possible (from 0 to 1) (default 0)
  -profile           <int>        E..V.... Set the encoding profile (from -99 to 100) (default -99)
     baseline                     E..V.... 
     main                         E..V.... 
     high                         E..V.... 
```

# MJPEG on RTP で配信する

[ffmpeg で MJPEG on RTP](https://qiita.com/miminashi/items/1dadfd273b56b6088f6c)


# ファイルの情報を見る

```shell-session
$ ffprobe ファイル名
```

# 接続されているカメラで利用できるフォーマット一覧を表示する

```sh
ffmpeg -f video4linux2 -list_formats all -i /dev/video0 
```

# テストソース

```sh
ffmpeg \
-re \
-f lavfi \
-i 'testsrc=duration=600:size=1280x720:rate=30' \
-vcodec libx264 \
-profile:v baseline \
-preset ultrafast \
-tune zerolatency \
-pix_fmt yuv420p \
-s 1280x720 \
-f flv \
-an \
${URL}
```

# `-re` オプションをつけたら遅延が大きくなったときは

`-analyzeduration`を指定する。
このオプションは解析時間の上限を指定する。
12fpsの場合は`-analyzeduration 100`でokだった。

```sh:例
rtmpdump -m 1 -vr "rtmp://0.0.0.0:1935/live1/live" |
ffmpeg \
  -re \
  -analyzeduration 100 \
  -f live_flv \
  -i pipe:0 \
  -c:v libx264 \
  -profile:v baseline \
  -preset ultrafast \
  -tune zerolatency \
  -an \
  -f rtp \
  rtp://0.0.0.0:8021
```
https://stackoverflow.com/questions/50871057/ffmpeg-with-high-delay-in-first-input-stream
http://fftest33.blog.fc2.com/blog-entry-109.html




# 動画をgifアニメに変換する

```sh
ffmpeg -i sample.mov -s 1680x1050 -pix_fmt rgb24 -r 8 -f gif sample.gif
```

# Webカメラの映像を毎フレーム同じファイルに記録し続ける

要するに最新の静止画がほしい。

```sh:Linux
ffmpeg -y -f video4linux2 -video_size 1920x1080 -framerate 5 -i /dev/video2 -f image2 -threads 3 -update 1 0.jpg
```

好きなタイミングで`0.jpg`を読んでもファイル壊れたりしてなかった。
別のファイルに書き出してからmvするような実装になってるんだろうか。（要確認）


# v4l2loopbackで仮想カメラをつくる

```shell-session
$ sudo apt-get -y install linux-image-4.19.0-6-amd64-unsigned linux-headers-4.19.0-6-amd64 v4l2loopback-dkms
$ sudo modprobe v4l2loopback devices=8
$ ls -1 /dev/video*
/dev/video0
/dev/video1
/dev/video2
/dev/video3
/dev/video4
/dev/video5
/dev/video6
/dev/video7
```

`4.19.0-5`の状態だと`modprobe: ERROR: could not insert 'v4l2loopback': Exec format error`といわれてしまってmodprobeできなかった。

参考: https://www.virtualbox.org/ticket/18904

**作成した仮想カメラに映像を流し込む**

```shell-session
$ ffmpeg -re -f lavfi -i testsrc=size=640x480:rate=10 -pix_fmt yuv420p -f v4l2 /dev/video0
```

**仮想カメラから映像を読み込む**

```shell-session
$ ffmpeg -loglevel error -f v4l2 -i /dev/video0 -vcodec libx264 -pix_fmt yuv420p -profile:v baseline -f flv -an "rtmp://192.0.2.0:3001/live/live1"
```