【发布时间】:2013-03-04 01:06:33
【问题描述】:
我想在安卓手机中使用libstagefright.so进行媒体操作。我已经探索了this 页面中给出的示例。我一直在尝试实施相同的方法。在为多个 OMXCodec 实例测试此实现时,它的输出缓冲区相互冲突。
我在eclipse中开发了一个android项目,并在JNI下链接libstagefright。我添加了两个类CustomDataSource(派生MediaSource)和CustomOmxDecoder。 CustomDataSource 类实现了MediaSource 的所有虚方法。在CustomOmxDecoder 类中,我调用OMXCodec::Create 方法。然后我创建了两个线程,它们具有CustomOmxDecoder 的单独实例。使用这个实例,我调用了一个方法ProcessNextFrame,在该方法中我调用了主要的videoDecoder->read() 方法。这就是我的设置。
现在,当我使用上述设置运行应用程序时。 OMXCodec 解码两个源的帧,但是当我在表面上渲染它时,它显示了冲突的输出。似乎两个源的解码缓冲区都以某种方式在内部进行了网格化。我正在同时创建两个 h264 解码器。这里有什么问题?可以和MediaBufferGroup有关吗?在调用videoDecoder->read() 调用后,我在CustomDataSource 中获取缓冲区并在CustomOmxDecoder 的ProcessNextFrame 中释放缓冲区。
任何建议都会很棒。 谢谢。
【问题讨论】:
-
如果你使用
allocateOutputBuffersfromNativeWindow,那么你需要检查nativeWindow或surface传递给解码器的创建。根据您的评论,我觉得您将相同的surface传递给解码器的两个实例,因此您可能会观察到不正确的图像。您能否检查您的逻辑是否仅适用于解码器的一个实例? -
实际上我在创建 omxcodec 实例时没有将表面作为参数传递。我检查了地面地址。它们不一样。甚至我又做了一个测试,在我的解码显示方法中添加了一个条件,在 customomxdecoder 类中,这样对于线程一解码缓冲区在给定表面上呈现,对于线程二,帧将被解码但表面将仅呈现黑色.在这种情况下,图片在第一个表面和第二个表面显示黑色时也会发生冲突。
-
你认为videosource->read(&buffer,&option)方法需要在auto lock/mutex之间覆盖吗?
-
Ganesh,你的猜测是正确的。不是表面,而是我的代码中有另一个参数对于两个线程都是相同的。因此它证明了 omxcodec 的多个实例是可能的。我为我的帖子道歉。并将在一段时间内删除此线程,因为它可能会浪费某人的时间。谢谢。
-
Sam.. 我很高兴你发现了你的错误。我在几个用例中尝试了多实例编解码器。但是,我没有在 Java 级别上进行太多编程。你打算删除这篇文章吗?
标签: android stagefright openmax