我一直试图通过OMXCodec
使用Stagefright
。我已经为ICS
版本的Android实现了代码。我有两个类CustomDataSource
,派生MediaSource
,另一个是CustomOmxCodec
调用OMXCodec::Create
方法并执行读取解码h264帧的操作。我已经在具有omx.google.video.avc
软件解码器的设备上测试了这个实现,它工作正常。现在,当我尝试在具有硬件h264解码的Android手机上运行相同的实现时,它会在读取调用时返回错误。错误如下:
[OMX.MTK.VIDEO.DECODER.AVC] ERROR (0x80001005, 0)
0x80001005
适用于OMX_ErrorBadParameter
。
我在读操作时得到错误代码-1103
。
我尝试了各种参数但没有成功。
完整的日志如下:
[OMX.MTK.VIDEO.DECODER.AVC] mVideoInputErrorRate (0.000000)
!@@!>>create tid (21087) O<XCodec mOMXLivesLocally=0, mIsVideoDecoder (1), mIsVideoEncoder (0), mime(video/avc)
[OMX.MTK.VIDEO.DECODER.AVC] video dimensions are 640X480
mSupportesPartialFrames 1 err 0
[OMX.MTK.VIDEO.DECODER.AVC] allocating 10 buffers of size 65536 on input port.
[OMX.MTK.VIDEO.DECODER.AVC] mMemHeapBase = 0x00E8C288, mOutputBufferPoolMemBase=0x51F8E000, size = 9578848
[OMX.MTK.VIDEO.DECODER.AVC] ERROR (0x80001005, 0)
OMXCodec::onEvent--OMX Bad Parameter!!
Read Error : -1103
我很感激任何方向。
答案 0 :(得分:2)
从该问题来看,硬件编解码器即OMX.MTK.VIDEO.DECODER.AVC
不支持作为配置步骤的一部分传递的参数之一。
从OMXCodec::create
开始,将调用configureCodec
,内部调用许多其他函数。由于错误是OMXCodec::onEvent
的一部分,因此可能的情况之一可能是组件在解码第一帧的前几个字节时遇到错误。
具体而言,当组件遇到SPS
和PPS
(编解码器特定数据的一部分)时,组件通常会触发portSettingsChanged
。根据您的回复,我觉得在此过程中出现了一些错误,因此onEvent
已被触发。
请分享更多日志以进一步分析。
答案 1 :(得分:1)
MTK H264解码器需要参数csd-0和csd-1来启动解码器(您可以在http://developer.android.com/reference/android/media/MediaCodec.html获得一些信息)。 csd-0和csd-1代表H264的SPS和PPS。我问过MTK工程师,他说我们可以使用下面的代码设置这两个参数。
byte[] sps = {0,0,0,1,103,100,0,40,-84,52,-59,1,-32,17,31,120,11,80,16,16,31
,0,0,3,3,-23,0,0,-22,96,-108};
byte[] pps = {0,0,0,1,104,-18,60,-128};
MediaFormat mFormat = MediaFormat.createVideoFormat("video/avc", width, height);
mFormat.setByteBuffer("csd-0", ByteBuffer.wrap(sps));
mFormat.setByteBuffer("csd-1", ByteBuffer.wrap(pps));
也许我们收到了OMX Bad Parameter错误消息。
答案 2 :(得分:0)
从日志中将其映射到已实现的代码,我觉得发生了以下情况
[OMX.MTK.VIDEO.DECODER.AVC] allocating 10 buffers of size 65536 on input port.
此步骤在解码器的输入端口上分配缓冲区
从代码流中,在分配输入端口缓冲区后,输出端口上的缓冲区从nativeWindow
到allocateOutputBuffersFromNativeWindow
分配。
作为此方法实现的一部分,其中一个步骤是将输出端口上的缓冲区数量增加2,并将其设置为OMX
组件,如图所示here。
我觉得您的错误可能源于此特定点,因为nBufferSize
是OMX_IndexParamPortDefinition
索引的 只读 参数。请参阅OMX Standard,第83页第3.1.3.12.1节,其中明确显示nBufferSize
是 只读 参数。
您的OMX
组件可能是严格的OMX
兼容组件,而在ICS
之后的Android中,预计会出现某些偏差。 可能可能是导致错误的原因之一。
P.S:如果您可以分享更多信息,我们可以提供更多帮助。