5

私は、あなた方の何人かがこの問題にどのように取り組むかについて、いくつかのアイデアを得たいと思いました。Linuxを実行していて、センサーの1つとしてWebカメラ(v4l2ドライバーを使用)を使用しているロボットがあります。私はgtkmmでコントロールパネルを書きました。サーバーとクライアントはどちらもC++で記述されています。サーバーはロボットであり、クライアントは「コントロールパネル」です。画像分析はロボットで行われています。次の2つの理由から、カメラからコントロールパネルにビデオをストリーミングバックしたいと思います。A)楽しみのためにB)画像分析結果をオーバーレイするため

だから私の質問は、ウェブカメラからコントロールパネルにビデオをストリーミングするだけでなく、それを処理するためにロボットコードを優先するいくつかの良い方法は何ですか?独自のビデオ圧縮スキームを作成し、それを既存のネットワークポートに通すことには興味がありません。新しいネットワークポート(ビデオデータ専用)が最適だと思います。問題の2番目の部分は、ビデオをgtkmmで表示するにはどうすればよいですか?ビデオデータは非同期で届き、gtkmmのmain()を制御できないので、注意が必要だと思います。

私は、vlc、gstreamer、または私が知らない他の一般的な圧縮ライブラリのようなものを使用することにオープンです。

ありがとう!

編集:ロボットには1GHzプロセッサが搭載されており、Linuxのバージョンのようなデスクトップを実行していますが、X11は実行していません。

4

3 に答える 3

2

Gstreamerは、ほとんど労力をかけずにこれらのほぼすべてを解決し、Glibイベントシステムともうまく統合します。GStreamerには、V4Lソースプラグイン、gtk +出力ウィジェット、ビデオのサイズ変更/エンコード/デコードを行うためのさまざまなフィルター、そして何よりも、マシン間でデータを移動するためのネットワークシンクとソースが含まれています。

プロトタイプの場合、「gst-launch」ツールを使用してビデオパイプラインをアセンブルしてテストできます。その後、コードでプログラムでパイプラインを作成するのはかなり簡単です。「GStreamerネットワークストリーミング」を検索して、Webカメラなどでこれを行っている人々の例を確認してください。

于 2010-01-15T14:15:48.390 に答える
1

実際に使用されているテクノロジーについてはわかりませんが、フレームのドロップを回避したい場合は、これが大規模な同期になる可能性があります*****。私はビデオをファイルとネットワークに同時にストリーミングしていました。最終的に私がやったことは、1つの書き込みと2つの読み取りの3つのポインターを持つ大きな循環バッファーを使用することでした。3つの制御スレッド(およびいくつかの追加のエンコードスレッド)がありました。1つはバッファーへの書き込みで、他の両方によって読み取られないバッファー内のポイントに到達すると一時停止し、2つのリーダースレッドはバッファーから読み取り、書き込みを行います。ファイル/ネットワーク(プロデューサーより先に進んだ場合は一時停止します)。すべてがフレームとして書き込まれ、読み取られるため、同期のオーバーヘッドを最小限に抑えることができます。

私のプロデューサーは(別のファイルソースからの)トランスコーダーでしたが、あなたの場合、カメラが通常行う形式でフレーム全体を生成し、ロボットがサーバーに対して(ffmpegのようなもので)トランスコーディングのみを行うようにしたい場合があります画像を処理します。

ただし、ロボットはリアルタイムのフィードバックを必要とするため、ストリーミングサーバーが追いつくのを一時停止して待つことはできないため、問題はもう少し複雑です。したがって、フレームをできるだけ速く制御システムに送り、「コントロールパネル」にストリーミングするために、一部を循環バッファに個別にバッファリングすることをお勧めします。特定のコーデックはドロップされたフレームを他のコーデックよりも適切に処理するため、ネットワークが遅れた場合は、バッファの最後でフレームの上書きを開始できます(読み取られないように注意してください)。

于 2010-01-14T01:38:16.477 に答える
0

「新しいビデオポート」と言ってからvlc/gstreamingについて話し始めると、必要なものを見つけるのが難しいと感じています。明らかに、これらのソフトウェアパッケージは、多くのプロトコルを介したストリーミングと圧縮に役立ちますが、ストリームを送信するには、「ビデオポート」ではなく「ネットワークポート」が必要になることは明らかです。

あなたが本当に意味しているのがワイヤレスビデオ/テレビフィードを介してディスプレイ出力を送信することである場合、それは別の問題ですが、それについてはソフトウェアの専門家ではなくハードウェアの専門家からのアドバイスが必要になります。

次に進みます。私はMMS/UDPプロトコルを介して多くのストリーミングを行い、vlcはそれを(サーバーおよびクライアントとして)非常にうまく処理します。ただし、デスクトップ用に設計されており、必要なほど軽量ではない場合があります。gstreamer、mencoder、ffmpegのようなものが手元にある方が良いと思います。ロボットにはどのようなCPUが搭載されていますか?リアルタイムの圧縮を計画している場合は、少しうなり声が必要になります。

クライアント側では、GTKでビデオを処理するためのウィジェットがたくさんあると思います。インターフェイスの詳細について心配する前に、それを調べます。

于 2010-01-14T01:39:23.660 に答える