gpt4 book ai didi

android - MediaCodec 在一台设备上解码 h264 错误

转载 作者:行者123 更新时间:2023-12-04 23:56:45 26 4
gpt4 key购买 nike

我正在尝试使用 Android 的 MediaCodec 接口(interface)解码 h.264 流。在我的测试设备上一切正常,但在我无权访问的一台客户设备 (Samsung Tab S) 上出现了奇怪的问题。

当我解码流时,我不发送任何 SPS/PPS NAL 或初始帧。我刚开始从实时流中推送数据,分成以 0x09 NAL 结尾的 block ,解码器将很好地 self 同步而不会很快出现问题。

至少这个设备的问题是,当我从解码器获得 BufferInfo 时,它会声称它解码了 1413120 字节的数据,但缓冲区大小只有 1382400!所以当然,即使我试图从缓冲区中获取那么多数据,它也会崩溃。

视频为 1280x720 并解码为 NV12,因此缓冲区大小刚刚好。报告的解码输出大小不是。如果我将大小强制设置为 1382400 并将 NV12 转换为 RGB,我将获得几乎正确的图片。前 32 行具有强烈的绿色,蓝色 channel 偏移了很多。这意味着 UV block 在此设备上的解码部分错误。

有没有人遇到过这种问题?我已经从那个特定的设备录制了原始的 h264 流,它播放得很好,没有绿色 block 或颜色偏移。

我真的应该在开始流式传输之前设置 SPS/PPS 和初始帧吗?流似乎包含所需的一切,因为解码器意识到分辨率是正确的,在我测试过的所有其他设备上设置缓冲区和解码,除了这个。所以我只是想知道三星是否有什么特别的事情要发生。

解码相同流的另一个应用程序显示它没有问题,但据我所知他们在内部使用 ffmpeg,而不是 MediaCodec。如果可能,我宁愿使用内置的系统编解码器。

这是结果的一个例子。没有只有流的图像,请注意框架已旋转。绿色区域的 Y 分量很好,在右侧的白色 block 上可以清楚地看到蓝色偏移。

enter image description here

编辑:即使我用 csd-0 中的 SPS/PPS block 启动解码器,颜色问题仍然存在。所以这不是因为那个。

还设法用另一台设备测试了确切的流。没有绿色条,没有颜色变化。所以这是特定设备/型号中的编解码器的问题。

最佳答案

我过去遇到过类似的问题(特别是在三星设备上),如果我没记错的话,那是因为缺少 SPS/PPS 数据。如果您想要一致的结果,您必须输入 SPS/PPS 数据。

不是您问题的直接解决方案,但可能的解决方法是在该特定设备上运行时使用替代解码器(如果存在)。

我不确定你是如何实例化你的解码器的,但人们经常像这样使用 mime 类型:

decoder = MediaCodec.createDecoderByType("video/avc");

然后设备将选择首选解码器(可能是硬件)。

您也可以像这样实例化一个特定的解码器:

decoder = MediaCodec.createByCodecName("OMX.google.h264.decoder");

// OR

decoder = MediaCodec.createByCodecName("OMX.qcom.video.decoder.avc");

根据我的经验,大多数设备至少有 2 个不同的 H264 解码器可用,您可能会发现该设备上的替代解码器可以正常运行。

您可以使用以下代码列出所有可用的编解码器:

static MediaCodecInfo[] getCodecs() {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
MediaCodecList mediaCodecList = new MediaCodecList(MediaCodecList.ALL_CODECS);
return mediaCodecList.getCodecInfos();
} else {
int numCodecs = MediaCodecList.getCodecCount();
MediaCodecInfo[] mediaCodecInfo = new MediaCodecInfo[numCodecs];

for (int i = 0; i < numCodecs; i++) {
MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i);
mediaCodecInfo[i] = codecInfo;
}

return mediaCodecInfo;
}
}

关于android - MediaCodec 在一台设备上解码 h264 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35263909/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com