最近、ビデオのキャプチャを伴うプロジェクトがいくつか舞い込んできました。1つは3Dイメージング プロジェクトで、5つの1080pビデオ フィードを使用して、プラットフォーム上のアイテムの1分間の回転をキャプチャし、画像認識ソフトウェアをトレーニングするための膨大な量のデータを取得します。
もう1つのプロジェクトは、私たちの研究室に特別なゲストが来るので、とてもエキサイティングです。私たちが構築しようとしているもののいくつかにコミュニティを参加させる方法を模索していました。私たちが取り組んでいることを人々に見てもらい、交流してもらうために、ラボ全体をYouTubeチャンネルでライブ配信してみませんか?
Raspberry Pi USBビデオキャプチャ
これらはどちらも楽しいプロジェクトです。手元にたくさんの Raspberry Pi 3 があったので、そのうちの1つを使って、ビデオ フィードをキャプチャしたり、効果的なストリーミング デバイスに変えたりできるかどうか試してみることにしました。そうすれば、ビデオ担当者のより強力なラップトップを盗用する必要がなくなります。この小さなシングルボードコンピュータでこれらのタスクを実行できれば、より強力なマシンを実際に解放できるし、クールなデモにもなるのですが、ボードにそれを実現するだけのパワーが本当にあるのかどうか疑問でした。
当初、私はビデオ キャプチャに関してできる限りのことを調べ、手元にあったUSBウェブカメラLogitech C920を使用するとともに、 Fridge Defenderプロジェクト で使用した NoIR Piカメラを実装してみることにしました。Raspberry PiにはStreamerのようなビデオをキャプチャするためのソフトウェアが組み込まれていますが、私は別の道を進み、幅広いコミュニティの支持があり、さまざまなエンコーダーのオプションが多数あるFFmpegを活用することにしました。これにより、柔軟性が得られ、開始するための例が大量に得られます。
FFMPEGを使用したビデオのキャプチャ
最初の結果は期待できるものではありませんでした。ffmpegを使用してUSBウェブカメラからビデオをAVIファイルにキャプチャすると、結果は芳しくありませんでした。Raspberry PiのCPU使用率が約50% に達し、1080pビデオを30フレーム/秒という妥当な速度でキャプチャすることは不可能でした。結果を確認したところ、1秒あたり約6.6フレームしか取得できず、ラボのストリーミングや3Dオブジェクトの作成には途切れ途切れで使用できないビデオになっていました。720pにスケールダウンしたところ、14フレーム/秒に改善されましたが、それでもまだ価値はありませんでした。WVGA形式 (854x480) に移行して、ようやく私が求めていた1秒あたり30フレームの安定した画質が得られましたが、ビデオ品質にはまだまだ改善の余地があり、画像認識にはピクセル数が多いほど良いという結果になりました。私は自分の小さな働き者のPiに失望しましたが、完全に諦めるつもりはありませんでした。
Raspberry Pi 3用にFFMPEGを再コンパイルする
この時点で、より強力な別のコンピューターに移行するか、さらに深く掘り下げるかを選択できます。私は挑戦が好きで、Piならもっと多くのことができると思ったので、「さらに深く掘り下げる」を選択しました。テストのために、オーディオとビデオ用の異なるコーデックを使用してffmpegを再コンパイルし始めました。Raspberry Piでffmpegをコンパイルするのは、コードのコンパイルに多くの作業が必要になるため、通常は推奨されていませんが、私の経験と、Raspberry Piの4コアプロセッサを考慮すると、 ラズベリーパイ3、多くのオプションを使用してffmpegをローカルでコンパイルすることは確かに合理的です。ローカルでコンパイルすることを選択した場合、何時間もかかることはありませんが、コーヒーを飲みながら誰かとチャットするには十分な時間です。Piの4つのコアを最大限に活用するには、必ず「make -j4」コマンドを使用してください。そうしないと、かなり長く待つことになります。
C920 Raspberry Piソリューション
私にとっての「ひらめき」の瞬間は、木曜日の夜遅く、カフェインと良い音楽に刺激されてやってきました。Piで私が抱えていた最大の問題は、受信したビデオ ストリームを、より使いやすい形式にトランスコードするために使えるパワーが限られていることでした。カメラは生のビデオフィードを出力し、Piはそれをより一般的なmpeg4に変換していました。このトランスコーディングは、プロセッサのパワーと、ストレージおよびメモリの帯域幅に負担をかけていました。C920では、生の入力の問題を回避する方法があります。C920には、h.264エンコード ストリームを出力できる専用のエンコーダーがオンボードで搭載されています。H.264はもう1つの一般的なビデオ形式です。この形式を使用すると、希望どおりのビデオにかなり近づきますが、トランスコーディングによって1秒あたりのビデオ フレーム数が依然として減少します。
カメラが余分な作業なしでh.264を提供してくれることがわかった後、ラボ ストリームでは、YouTubeが事前に操作しなくてもh.264ストリームを取り込むことができることもわかりました。オーディオを少し変更する必要がありましたが、Piに負担はかかりませんでした。h.264ストリームを通過できた後、YouTubeで1080pで30フレーム/秒の安定した映像を見て、私は大喜びしました。
あなた自身の冒険の出発点となるようにffmpegに設定した最終的なsetコマンドを以下に示します。
Ffmpeg -ar 44100 -ac 2 -f alsa -i hw:1,0 -f v4l2 -codec:v h264 -framerate 30 -video_size 1920x1080 -itsoffset 0.5 -i /dev/video0 -copyinkf -codec:v copy -codec:a aac -ab 128k -g 10 -f flv rtmp://a.rtmp.youtube.com/live2/(ここにストリームキーを入力してください)
上記のコマンドを実行すると、USBウェブカメラからYouTubeに1080p 30fpsのオーディオ付きストリームが送信されます。YouTubeではキーフレームが正しくないとまだ苦情が出ているので、完璧にするにはまだ多くの改良が必要ですが、結果に異論を唱えることは難しく、うまく機能しています。
Raspberry Piカメラ ストリーム: HD 1080pビデオ キャプチャ
1080p 30fpsビデオを効果的にキャプチャできるようになったので、少なくとも3Dイメージング プロジェクトに必要なフィードをいくつか取得できると思います。h.264ビデオは、Pi上のMP4Boxを使用してキャプチャされた後、MPEG4に変換できるため、分析ソフトウェアで個々のフレームに分解して分析できるようになります。
つまり、 Raspberry Pi 3 には、高解像度のビデオをYouTubeに効果的にストリーミングするのに十分な処理能力があります。使用するカメラがエンコードされたストリームを提供することを確認するだけです。Piには1080pビデオをリアルタイムでトランスコードするために必要なものがすべて揃っていませんが、適切な選択と少しの調査で、多くのことを実現できます。皆さんがこれらの洞察をまとめたものを見るのを楽しみにしています。また、私たちが次のクールなプロジェクトを作成するときに、特別ゲストとのラボ ストリームを皆さんが視聴できることを願っています。