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

要通过libstagefright在android中使用HW解码器,在元数据中为kKeyAVCC设置什么,以用于帧基解码,而不是MP4播放?,android,android-ndk,h.264,stagefright,Android,Android Ndk,H.264,Stagefright,我一直在尝试使用libstagefright解码h264压缩帧。我没有MP4文件,而是想逐帧解码。我一直在探索来自中国的样本。此示例使用ffmpeg解析mp4文件。并使用ffmpeg的avcodeccontext设置和查找所需的元数据。现在我想设置kKeyAVCC、kKeyWidth、kKeyHeight、kKeyIsSyncFrame和kKeyTime。我不清楚这些参数中的每一个。所以,我只想知道是否需要设置所有这些参数?这些参数的用途是什么,以及为逐帧解码的元数据设置哪些参数。当我没有设置k

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

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

例如,请参阅
AwesomePlayer::initVideoDecoder
,其中调用了
mVideoTrack->getFormat()
,以获取视频曲目的元数据。请注意,这不是
MediaBuffer
的一部分,而是作为单独的对象传递的

创建解码器后,将调用
configureCodec
。在此方法中,
OMXCodec
读取不同的配置参数以初始化解码器

kKeyAVCC
对应于
Codec特定数据
csd
,其本质上是底层
H.264
流的
SPS
PPS

kKeyWidth
kKeyHeight
对应于视频帧的
width
height
。对于初始化解码器,您可以设置更多的附加参数。例如,如果要为解码器的输出设置特定的
colorFormat
,可以通过
kKeyColorFormat
进行设置

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

输入缓冲区是通过
OMXCodec::drainInputBuffer
方法填充的,该方法从解析器模块(在您的例子中是您的特定模块)读取
MediaBuffer
MediaBuffer
的内容被复制到
OMX
组件的
输入端口上填充的缓冲区中。与此数据一起,还传递此缓冲区的
时间戳
。时间戳信息通过
kKeyTime
参数读取,该参数随
MediaBuffer
一起传递

因此,对于在
MediaBuffer
中传递的每个帧,您需要确保有效的
时间戳也被传递到底层解码器,该解码器在解码器的输出端口上得到反映

在您的问题中,您询问了关于
kKeyIsSyncFrame
。此标志由
编码器设置,作为
FillBufferDone
回调的一部分,即当编码器对关键帧(如
IDR帧
)进行编码时,它通过此特定标志将此信息作为编码器输出端口回调的一部分进行通信。对于解码,这是不相关的

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


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

首先非常感谢您提供了详细的答案。你提供了很好的信息。我正在通过我的项目中的android.mk链接libstagfright.so。我需要包括所有相应的包含头从Android源。我编写了两个类,CustomMediaSource和CustomDecoder。CustomMediaSource派生自MediaSource并实现读取方法,而在CustomDecoder中,我调用的是OMXCodec::Create方法。现在,我的疑问是libstagefright是否能够稳定地用于所有android设备。我的意思是,可以根据TI、Qualcom等供应商的情况进行修改吗?从
API
的角度来看,无论供应商如何,libstagefright库都是相同的。但是,如果您正在查看一些性能数据,则可能存在特定于供应商SoC的潜在定制。我并不是说这种情况会一直持续下去,但这是可能的。如果您无法访问来源,那么您可能无法区分。谢谢。我想开发一个独立于平台的android应用程序。因此,选择稳定的API变得非常重要。正如您所说,我会在所有android手机中找到libstagefright.So,它将具有相同的api结构,我可以派生媒体源并使用派生类的实例来实现OMXCodec::Create方法。对吗?谢谢你,甘尼什。我还需要你的帮助来实施。您在回答中提到,我可以使用kKeyColorFormat标志设置编解码器的输出颜色空间。现在,当我将kKeyColorFormat设置为OMX_COLOR_Format16bitRGB565时,OMXCodec::Create方法不会返回。根据我的要求,我想解码和显示h264帧和表面可以在rgb565色彩空间渲染。那个么,你们能告诉我如何在曲面上实现yuv渲染吗?那么w可以是什么呢