ラズパイzero で音声つき動画撮影
Raspberry Piで音声付き動画を撮影する
Raspberry PIとffmpegとWebカメラ、USBマイクを利用して動画を取得
を参考に実践
raspivid コマンド
motion コマンド
ともに実行しても音声は入っていないため
カメラから画像を取得
マイクから音声を取得
これらをエンコードして保存
という流れになる
MKV もしくは MP4 で保存しているが
違いについては
【5分で分かる】mkvとmp4の違いは?変換する方法は?
に載っている
高品質なら mkv
いろいろなデバイスで再生させたいなら mp4
というかんじ
参考サイトをみながらコマンドのオプションを調べてみた
1 2 3 | raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test .h264 | \ arecord -D hw:1,0 -f S16_LE -r 16000 -d 0 test .wav; ffmpeg -y -i test .wav -r 30 -i test .h264 -vcodec copy test .mkv |
で
撮影と録音を同時に行いそれぞれをファイルに保存して、後から結合する
1 2 | raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -o - | \ ffmpeg -y -ac 2 -f alsa -ar 16000 -i plughw:1 -r 30 -i pipe:0 -vcodec copy test .mkv |
で
映像、音声を取得しながらエンコードする
これらは室内なので
raspividのawbオプションで光源の設定している
動画のエンコーディングにはffmpegを使用
20 November 2016 raspivid コマンド表
に
raspivid コマンドのオプションが載っているので
これを参考に
-t キャプチャする時間をミリ秒で指定
-t 0 なら0秒
-w で動画幅
デフォルトは 1920
-h 動画の高さ
デフォルトは 1080
-b ビットレート
10MBits/secは-b 10000000
-fps は記録するフレーム数
今回は30
-awb でAWBモードを設定
fluorescent で蛍光
-o - で出力ファイル名
今回はパイプで指定
次にffmpeg のオプション
最新ffmpegのオプションまとめ †
を参考に
-y で確認なしでファイル上書き
-ac で音声チャンネル数を指定
今回は2
-f 指定したフォーマットで出力
-i 入力ファイルのパス
-i plughw:1 でマイクを指定
-r でフレームレートの指定
フレームレートは動画の滑らかさの設定
フレームレート(FPS)って何?どのくらいの値にすればいいの?
に詳細が載っている
動画の撮影なら30でOK
-vcodec
でコーデック指定
copy を指定すれば直接コピーになる
copy test.mkv
とすれば test.mkv となる
1 2 | raspivid -t 10000 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -o - | \ ffmpeg -y -ac 2 -f alsa -ar 16000 -i plughw:1 -r 30 -i pipe:0 -vcodec copy test .mkv |
もうひとつは
1 2 3 4 5 | ffmpeg -f alsa -thread_queue_size 8192 -i hw:2,0 \ -f v4l2 -thread_queue_size 8192 -s 640x480 -i /dev/video0 \ -c: v h264_omx -b: v 768k \ -c:a aac \ output.mp4 |
録画の終了はqキー
オプションは
-f で
ファイルフォーマット
マイクやカメラから取得するなら必須
今回はマイクが alsa ビデオが v412
-thread_queue_size データを読むときのキュー
高フレームレートの動画ストリームとかだと
処理が追い付かずに捨てられてしまうデータがあったりするのだが
キューサイズを大きくすると、それを防げる
今回は 8192
-s は動画サイズ
640×480 にしている
-i で入力デバイスの指定
今回はマイクとUSBカメラのパスを指定
-c でエンコードのコーデック指定
-c:v h264_omx
でビデオ v がビデオの意味
-c:a aac
でa がオーディオコーデック
-b:v 768k
でビデオのビットレート
大きくすれば画質がきれいになる
実行したときに終了時間の指定ができなかったので
timeout コマンドを使うことにした
このコマンドに関しては
timeout コマンド
を参考に
1 | timeout 15 raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test .h264 | arecord -D hw:1,0 -f S16_LE -r 44100 -d 0 test .wav;ffmpeg -y -i test .wav -r 30 -i test .h264 -vcodec copy test .mkv |
というように
timeout コマンドを使うことで指定の時間で停止させることができる
ここまでできたら
あとは bluetooth などで撮影ボタンを作成する予定