GStreamer と OpenCV を使用してビデオ処理用のアプリケーションを開発しています。タスクは、OpenCV ソースからイメージをフェッチして GStreamer パイプラインにプッシュ/プルし (変換とデコードを行い、後でビデオ データをストリーミングする必要があります)、Java 言語環境でイメージを処理することです。
そこで、このタスクを管理する C でネイティブ フレームワークを構築します。ここで、JNI を使用して C ライブラリにアクセスし、実行中の GStreamer メイン ループを JVM に接続しました。SDL ライブラリを使用する画像処理に関係のないスレッドがいくつかありますが、Java メソッドを呼び出していません。どうやらこれまでのところ動作します。生の画像を Java に取り込み、ByteBuffer
(ネイティブ側で作成された)get
メソッドとSystem.err.println
.
問題は、これらの画像を何らかの方法で GUI に表示することです。グラフィカル環境には Swing フレームワークを使用しています。
JPanel
そこで、通常どおりに を拡張することで、すばやく汚れたイメージ ビューを作成しました。これは通常、Java のみを使用する場合に機能します。
paint
メソッドを使用して画像を描画するメソッドをオーバーライドしますGraphics.drawImage
。イメージは、ネイティブ コールバックによって配信された生データを整数配列にコピーし、この整数配列を に割り当てることによって生成されますMemoryImageSource
。createImage
(JFrame の) メソッドを使用してImage
オブジェクトを取得します。すべてが明らかに有効な参照を返します。例外はスローされません。少なくとも私には見えません。
MemoryImageSource
これまでに生成されていない画像にバイト配列を使用するだけでなく、いくつかの方法を試しました。しかし、データはそこにあり、私はそれを読むことができます!
データをコピーしてバイト データを表示することはできますが、カスタムJPanel
ビュー エリアに表示可能な画像を表示できません。画像が完全に黒または透明か何かのようです。
この問題は本当に私を打ち負かします、私はこれがうまくいくように説得する方法がわかりません. ここでのスレッド化にはいくつかの問題があると思います。しかし、この特定のシナリオに関するこれ以上のリソースはありません。
私は何を間違っていますか、または正しい方法でそれを行う方法を改善します。
追加:ウィンドウのサイズを変更すると、アプリケーションがクラッシュしたり、GUIがフリーズしたりすることもあるので、今のところこれを避けています。そのため、ネイティブ スレッドに問題があります。