我正在尝试用 Java 构建一个 SIP 客户端。作为 SIP 框架,我使用 doubango。为了显示我通过 JOGL 使用 OpenGL 的视频,但这并不重要,因为在测试期间我实际上将 ByteStream 与 JOGL 分离。
首先,该视频在带有 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
的 doubango 自己的。ProxyVideoConsumer
我对 C++ 调试不太熟悉,因为我对 Java 和 Delphi 更有经验,但我认为我有信心说似乎发生了某种堆损坏。
我目前的假设是 JVM 的ByteBuffer.allocateDirect(..)
-function 在 64 位机器上运行 32 位 JVM 时表现不正确,但我当然可能会弄错。
有趣的是,在大约 50 次测试中的两次,视频稳定了 5-10 分钟,没有任何降级或明显的内存泄漏。但是这种“伪随机性”与我在 Delphi 中处理内存分配问题的经验是一致的。
如果有人可以帮助我,我会很高兴,因为我已经没有办法让它稳定运行了。
问候, CSP