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

时间:2016-02-08 06:55:58

标签: android video h.264 mediacodec

我尝试使用Android的MediaCodec界面解码h.264流。一切都在我的测试设备上工作得很好,但在一个客户设备上,我没有'有权访问(三星Tab S)有一些奇怪的问题。

当我解码流时,我不发送任何SPS / PPS NAL或初始帧。我刚刚开始从实时流中推送数据,切换成以0x09 NAL结尾的块,解码器将很快同步,没有问题。

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

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

之前有没有人遇到过这种问题?我已经记录了来自该特定设备的原始h264流,它播放得很好,没有绿色块或颜色转换。

我应该在开始流媒体之前真正设置SPS / PPS和初始帧吗?流似乎包含所需的一切,因为解码器实现了正确的分辨率,在我测试过的除此之外的所有其他设备上设置缓冲区和解码。所以,我只是想知道三星是否有一些特别的东西。

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

以下是结果示例。不要只有流的图像,请注意框架是否旋转。绿色区域中的Y分量很好,右侧的白色区域可以清楚地看到蓝色区域。

enter image description here

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

还设法使用其他设备测试确切的流。没有绿色条,没有颜色变化。因此,该特定设备/模型中的编解码器存在问题。

2 个答案:

答案 0 :(得分:2)

我过去曾遇到类似的问题(特别是在三星设备上),如果我没记错的话,那是因为缺少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;
    }       
}

答案 1 :(得分:0)

当尝试使用480p和1440p层的h265解码器在Amazon Fire Stick(AFTMM)上播放时,我们面临类似的内存不足问题。 SDR和HDR播放均出现问题。尽管这绝对是特定于设备的问题,但可能存在一些变通办法,例如在编码时减少ref值和/或也减少CRF。这对我们有用。

相关问题