要通过libstagefright在android中使用HW解码器,在元数据中为kKeyAVCC设置什么用于帧基解码而不是MP4播放?

sam*_*m18 5 android h.264 android-ndk stagefright

我一直在尝试使用libstagefright来解码h264压缩帧.我没有MP4文件,而是想逐帧解码.我一直在从链接中探索样本.此示例使用ffmpeg来解析mp4文件.并使用ffmpeg的avcodeccontext设置并查找所需的元数据.现在我想设置kKeyAVCC,kKeyWidth,kKeyHeight,kKeyIsSyncFrame和kKeyTime.我不清楚这些参数中的每一个.所以,我想知道的是,是否需要设置所有这些参数?这些参数的目的是什么,以及为逐帧解码的元数据设置什么.当我没有设置kKeyTime时,omxcodec在读取mediabuffer时崩溃.如果我在读取操作上取得成功,我没有得到我在MediaBuffer的派生读取方法中设置的元数据值.我得到了帧的视频尺寸和错误代码INFO_FORMAT_CHANGED.

Gan*_*esh 9

创建新编解码器时,元数据作为OMXCodec::Create方法的一部分从解析器传递到解码器.我假设在您的实现中,您将注意MetaData按照普通的vanilla android实现中指定的格式传递元数据.

例如,请参考AwesomePlayer::initVideoDecodermVideoTrack->getFormat()被调用,以获得视频轨道的元数据.请注意,这不是a的一部分MediaBuffer,而是作为单独的对象传递.

一旦创建了解码器,configureCodec就会调用它.在此方法中,OMXCodec读取不同的配置参数以初始化解码器.

kKeyAVCC对应于Codec Specific Datacsd基本上是SPSPPS基础H.264流的和.

kKeyWidthkKeyHeight对应于widthheight所述视频帧的.要初始化解码器,您可以设置更多其他参数.例如,如果要为colorFormat解码器的输出设置特定的,则可以设置相同的通过kKeyColorFormat.

创建解码器后,您必须通过标准openmax接口传递各个帧.解调器以调用OMXCodec::read方法启动,该方法将填充输入和输出缓冲区.

输入缓冲区通过从解析器模块(在您的情况下是您的特定模块)中OMXCodec::drainInputBuffer读取a 的方法填充MediaBuffer.的内容MediaBuffer被复制到填充在缓冲器input port的的OMX成分.除此数据外,timestamp还传递了此缓冲区.时间戳信息通过kKeyTime与其一起传递的参数读取MediaBuffer.

因此,对于在a中传递的每个帧MediaBuffer,您需要确保有效值timestamp也传递给底层解码器,该解码器将反映在解码器的输出端口上.

在你的问题中,你曾经质疑过kKeyIsSyncFrame.该标志由Encoder作为FillBufferDone回调的一部分设置,即当编码器对关键帧进行编码时IDR frame,它通过该特定标志传送该信息作为编码器输出端口上的回调的一部分. 对于解码,这是不相关的.

如果您可以在OMXCodec启用日志的情况下发布更多日志,则可能更容易提供更准确的答案.

PS在android框架中,有一个命令行实用程序Stagefright,它可以创建一个解析器和解码器,并在不进行任何渲染的情况下执行命令行解码.这可能是您插入自己的解析器的一个很好的参考.