1

バックグラウンド

video4linux 2 仕様を使用してビデオをキャプチャしています。C プログラムを使用してリアルタイムでキャプチャされます。また、ローカルとリモートの両方で実行できる Java フロントエンドもあります。リモート側は簡単でした。画像を JPEG に圧縮し、mini-http サーバーを介してクライアントに送信し、解凍して画面に表示するだけです。

ローカルで実行する場合、何らかの方法で IPC がそのメモリに直接接続し、Java から画像にアクセスできるようにしたいと考えています。次に、できるだけ少ない CPU パワーを使用してそれらを画面にブリットします。これは「監視」タイプのシステムなので、一度に 8 ~ 16 台のカメラ フィードを実行できます。

質問

画像データ (YUV420P) を v4l2 mmap バッファーから Java アプリに移動して画面に表示する最も効率的な方法は何ですか? コードを表示するか、利用可能な API/仕様があれば教えてください。

答え

時間の都合上、単純なソケットを使用してデータを RGB で送信することにしました。Java クライアントが同じマシンで実行されている場合、パフォーマンスを大幅に向上させることができました。クライアントがリモートで実行されている場合でも、ネットワーク経由で JPEG を送信しています。次に、最適化された JPEG デコーダーを見つける必要があります。

ところで、これは 2 つのクライアントではなく、CameraStream ウィジェットが両方のタイプを読み取って解析するだけです。

4

4 に答える 4

2

を使用しない限りSocket、より原始的なIPCメカニズムにフックするためにJNIを使​​用する必要があります。

ビデオデータを含むメモリバッファがある場合、「共有メモリ」APIを使用して、JVM内からそのメモリにアクセスできる場合があります。のマニュアルページをご覧くださいshmat

また、新しいビデオデータが利用可能であることをJavaクライアントに通知するための何らかのシグナルも必要になります。

于 2008-11-10T16:54:05.213 に答える
1

JNIを使​​用する代わりに、JNA(Java Native Access)を試すことができます。これを使用すると、JNIコードを記述しなくても、Javaから直接CAPIを呼び出すことができます。ウェブカメラデバイスを開いたり閉じたり、画像をバイト配列として取得したりするなど、必要なすべてのメソッドを定義する小さなDLLを準備することを検討してください。次に、JNAreatorを使用して、このDLLからJavaクラスを準備します。それは素晴らしい働きをします。このプロジェクトを発見した数年後、私は再びネイティブコードで遊び始めました。

ネイティブコードに対する他のJavaAPIであるBridJの使用を検討することもできます。また、JNAと同じくらい透過的ですが、はるかに高速であり、JNIを使​​用する必要もありません。

于 2012-12-05T00:48:32.087 に答える
1

「リモート」インターフェースを両方の状況で許容できるように実行することを検討することをお勧めします。

デュアル フロント エンド (この場合はバック エンドも) を維持することは、メンテナンスが 2 倍になり、(潜在的な) バグが 2 倍になることを意味します。

于 2008-11-10T18:34:38.943 に答える