ほとんどの部分はこのへんに説明を加えたもの。
基本的には「Webカメラ用フォーマット」なるフォーマット指定(Mac: -f avfoundation
、Win: -f dshow
)ができるので、入力ファイルとしてデバイスの番号を指定(-i "0"
とか-i "1"
とか)して適当なファイルに書き出せばよい。
たとえばMacbookでFaceTimeカメラからmp4ファイルに書き込む場合:
ffmpeg -f avfoundation -framerate 25 -i "0" -target pal-vcd -vf scale=640x480 ./test.mpg
上のコマンドの場合、ffmpegは永遠に書き込みを続けるので、終わりたい時はCtrl-Cを押す。
Windows用のコマンドは更新予定(だけれども時期は未定)。
Webカメラをリストアップする
ターミナルを使用 (Mac)
WebカメラはAV Foundationなるフレームワーク経由で見えるらしい。
-f
オプションでavfoundation
を指定する:
$ ffmpeg -list_devices true -f avfoundation -i dummy
たとえばsed
とか使うことで、インデックスが入っているところだけ取り出すことができる:
ffmpeg -list_devices true -f avfoundation -i dummy 2>&1 \
| sed -n -e "/video devices/,/audio devices/s/\[AV[^]]*\] //gp" \
| sed -e "/video devices/d; /audio devices/d"
ターミナルを使用 (Windows)
Windowsでは、avfoundation
ではなくdshow
(stands for DirectShow)になるので注意。あとはほとんど同じだが、どのように出力からデータをとってくればよいのか…
APIを直接使う
これもやったことない。ここの丸写し:
- 通常通り
AVFormatContext
をつくる -
ffmpeg
に渡すオプションlist_devices
をAVDictionary
に渡す -
av_find_input_format("dshow")
(Windowsの場合)を用いてキャプチャに対応したAVInputFormat
を取得 -
"video=dummy"
なるファイル名を用いてavformat_open_input()
を呼ぶ - ログは(おそらく)
av_log_set_callback()
でコールバック関数を指定することでとってくることができる。
以下も参照:
How to enable ffmpeg logging
APIからWebカメラキャプチャを起動
上の節と同様。コードはこちらのページのほうが詳しい。
ただし情報が最新のものなのか未確認。ffmpegは仕様がよく変わるのでわからない。
- 通常通り
AVFormatContext
を作る。 - 対応する
AVInputFormat
を、av_find_input_format("dshow")
のようにしてとってくる - ファイル名は
"video=<device name or index>"
の形式のC文字列で指定する - 上記の設定を利用して
avformat_open_input()
を呼ぶ - あとは通常のAPI操作と同じ:
-
AVFormatContext
オブジェクトは個々のストリームへのポインタを持っている。そのうちどれかがビデオストリームに対応している:coder_type
メンバーがAVMEDIA_TYPE_VIDEO
になっているかどうかでチェックできる(でよいのか?未確認) - ビデオストリームに対応するデコーダを
avcodec_find_decoder()
で取得 - ビデオフレームを取得するための
AVFrame
オブジェクトを用意して、avpicture_fill()
でバッファと関連づける(これも未確認) - ストリームからデコーダに渡していくための
AVPacket
を用意する - あとは
AVFormatContext
オブジェクトに対してav_read_frame()
を用いてパケットにデータを転送、avcodec_decode_video2()
を呼んで随時AVFrame
を自分の用途に用いていく(未確認) - 最後に
*_free*()
するのを忘れない
-