Java で SIP クライアントを構築しようとしています。SIP フレームワークとして、dobango を使用します。ビデオを表示するために、JOGL を介して OpenGL を使用していますが、テスト中に実際に JOGL から ByteStream を切り離したため、これは重要ではありません。
まず、ビデオは 32 ビット VM を搭載した Win 7 で正常に動作します。ライブラリは 64 ビット用にコンパイルされないため、64 ビット システムで 32 ビット VM を使用する必要があります。残念ながら、「javaw.exe の 0x774315de で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0xdddddde9」でクラッシュする前に、数秒間しかビデオを見ることができません。
VisualStudio でデバッグすると、次の行で例外が発生することが明らかになりました。
memcpy((void*)m_ConsumeBuffer.pConsumeBufferPtr, pBuffer, nRetsize);
そのため、メソッドを数百回呼び出した後にエラーが発生したようです (ビデオがしばらくの間正しく表示されるため)。
考えられる原因を絞り込むために、テストでは着信ビデオのみを実装しました。
doubango は、次のように、Java での実装から ByteBuffer へのポインターを取得します。
videoFrame = ByteBuffer.allocateDirect(frameSize);
consumer.setConsumeBuffer(videoFrame, frameSize);
これは、建設時に入手したconsumer
dobango 独自のものです。ProxyVideoConsumer
私は Java と Delphi の経験が豊富なので、C++ デバッグにはあまり詳しくありませんが、何らかのヒープ破損が発生しているように見えると自信を持って言えます。
私の現在の推測ではByteBuffer.allocateDirect(..)
、64 ビット マシンで 32 ビット JVM を実行すると、JVM の -function が正しく動作しないということですが、もちろん、間違っている可能性もあります。
興味深いことに、約 50 回のテスト実行のうち 2 回で、ビデオは 5 ~ 10 分間安定しており、劣化や明らかなメモリ リークはありませんでした。しかし、この「疑似ランダム性」は、Delphi でのメモリ割り当ての問題に関する私の経験と一致しています。
これを安定して実行する方法のアイデアがなくなったので、誰かが私を助けてくれたらうれしいです。
よろしく、CSp