ffmpegでYouTube Liveストリーミングするために必要なオプションを調べたメモ

公開日: 2020年08月20日最終更新日: 2022年01月28日

以前QiitaにRaspberry Pi Zero Wを使ってライブストリーミングカメラを作る、1時間くらいの作業で。という記事を投稿したときにffmpegのオプション(とraspividのオプション)を調べたのでメモしておきます。

最終的にコマンドは以下のようになりました。

raspivid -w 1920 -h 1080 -fps 30 -o - -t 0 -b 2500000 | \
ffmpeg \
-f alsa -ac 1 -ar 8000 -thread_queue_size 128 -i hw:1 \
-f h264 -r 30 -thread_queue_size 256 -i - \
-c:v copy -c:a aac -ar 8k -b:a 64k -g 60 -s 1920x1080 -threads 2 -f flv rtmp://a.rtmp.youtube.com/live2/[YOUR_STREAM_KEY]

ffmpegのオプション

今回は音声と映像のstreamは以下の1つずつになるのでffmpegが自動的にこの2つを選択して出力してくれます。

  • -i hw:1のオーディオ
  • stdinからの映像

ffmpegはオプションが多く、記載する位置によって意味が変わるなど何回でした。
また、ドキュメントが膨大で目的の情報が書いてある場所を探すのも大変でした。

以下の場所をくまなく探していました。

-re (input) Read input at native frame rate. Mainly used to simulate a grab device, or live input stream (e.g. when reading from a file). Should not be used with actual grab devices or live input streams (where it can cause packet loss). By default ffmpeg attempts to read the input(s) as fast as possible. This option will slow down the reading of the input(s) to the native frame rate of the input(s). It is useful for real-time output (e.g. live streaming).

ネイティブのフレームレートで読み込みます。
音声と合わせるときにフレームレートが出なくなってしまったので途中から外してしまいました。

-ar[:stream_specifier] freq (input/output,per-stream) Set the audio sampling frequency. For output streams it is set by default to the frequency of the corresponding input stream. For input streams this option only makes sense for audio grabbing devices and raw demuxers and is mapped to the corresponding demuxer options.

音声のサンプリング周波数です。 よく見るサンプリング周波数は、電話の8000Hz、音楽の44100Hz、映像の48000Hzですね。

-ac[:stream_specifier] channels (input/output,per-stream) Set the number of audio channels. For output streams it is set by default to the number of input audio channels. For input streams this option only makes sense for audio grabbing devices and raw demuxers and is mapped to the corresponding demuxer options.

チャンネル数。-ac 2が2chでステレオ。-ac 1でモノラルになります。

-acodec codec (input/output) Set the audio codec. This is an alias for -codec:a.

オーディオコーデックを指定します。デフォルトはpcm_s16le。
https://trac.ffmpeg.org/wiki/audio%20types

-r[:stream_specifier] fps (input/output,per-stream) Set frame rate (Hz value, fraction or abbreviation).

As an input option, ignore any timestamps stored in the file and instead generate timestamps assuming constant frame rate fps. This is not the same as the -framerate option used for some input formats like image2 or v4l2 (it used to be the same in older versions of FFmpeg). If in doubt use -framerate instead of the input option -r.

As an output option, duplicate or drop input frames to achieve constant output frame rate fps.

フレームレートです。

-f fmt (input/output) Force input or output file format. The format is normally auto detected for input files and guessed from the file extension for output files, so this option is not needed in most cases.

音声/映像の入出力フォーマットです。音声のデフォルトはpcm_s16le。

-i url (input) input file url

-i /dev/zeroとすることで無音を入力したり、-i -とすることでパイプで標準入力を受け取ったりすることができます。

-vcodec codec (output) Set the video codec. This is an alias for -codec:v.

An empty stream specifier matches all streams. For example, -codec copy or -codec: copy would copy all the streams without reencoding.

codecにcopyを指定することでエンコードせずにストリームをコピーする。コピーは処理が軽いです。
https://ffmpeg.org/ffmpeg.html#toc-Stream-copy

-acodec codec (input/output) Set the audio codec. This is an alias for -codec:a.

オーディオコーデックの指定。今回はAACを使いました。

-ab bitrate audio bitrate (please use -b:a)

オーディオのビットレート。ffmpeg -helpで出てきます。なかなか見つかりませんでした。

-g 50

-g <int> E..V..... set the group of picture (GOP) size (from INT_MIN to INT_MAX) (default 12)

GOPのサイズ。MPEG動画のIフレームからなるフレーム群です。 -g 50で50枚に1枚基準となるフレームをおいて、あとは差分情報とすることで動画を圧縮します。
http://www.xucker.jpn.org/keyword/gop.html

-strict experimental

実験的実装を使う場合のオプション。AACがそうでしたが今は違います、-c:a aacでいいです。

-s[:stream_specifier] size (input/output,per-stream) Set frame size.

As an input option, this is a shortcut for the video_size private option, recognized by some demuxers for which the frame size is either not stored in the file or is configurable – e.g. raw video or video grabbers.

As an output option, this inserts the scale video filter to the end of the corresponding filtergraph. Please use the scale filter directly to insert it at the beginning or some other place.

The format is ‘wxh’ (default - same as source).

解像度を指定します。

-f fmt (input/output) Force input or output file format. The format is normally auto detected for input files and guessed from the file extension for output files, so this option is not needed in most cases.

2度めですが、映像フォーマットはflvフォーマットに詰め込んで配信します。outputにはyoutubeのURLを指定。

raspividのオプション

-o -で標準出力に映像を渡せるのが学びでした。
https://www.raspberrypi.org/documentation/raspbian/applications/camera.md

--output, -o Output filename <filename>
Specify the output filename. If not specified, no file is saved. If the filename is '-', then all output is sent to stdout.

オプションのまとめ:

  • -o -のオプション指定によって、raspividの出力を標準出力経由でffmpegに渡しています。
  • -t 0 撮影時間指定無しの連続撮影
  • -fps 30 30フレーム/秒
  • -b 2500000 ビットレートは2.5Mbpsです。

他に使ってないけど調べたもの:

  • -rot 180 画像の回転
  • -vf 垂直反転
  • -hf 水平反転

使ったもの

Amazonで安いUSBオーディオアダプターを買って、USB microB-A変換ケーブルで接続して試しました。動作確認には十分でしたが、レビュー通りノイズが乗っていたのが残念…。
カメラは安い互換品を使いました。だいぶ安くなりましたね。