Media Extractor:解码器在Android 4.2上提供错误的宽度

时间:2014-11-11 13:38:06

标签: android decoding mediacodec mediaextractor

我正在为Unity编写一个插件,使用Media Extractor解码并从视频文件中获取帧并重新编码为新的视频文件。然而,帧被解码为一个错误大小的数组(在android 4.2.2上),因为编解码器认为当它实际是720时高度是736。

for (int i = 0; i < numTracks; ++i) 
    {
        MediaFormat format = extractor.getTrackFormat(i);

        String mime = format .getString(MediaFormat.KEY_MIME);  

        if(mime.startsWith("video/"))
        {
            extractor.selectTrack(i);
            //Decoder
            decoder = MediaCodec.createDecoderByType(mime);
            decoder.configure(format, null, null, 0);

            break;
        }
     }

输出缓冲区索引返回INFO_OUTPUT_BUFFERS_CHANGED,然后返回INFO_OUTPUT_FORMAT_CHANGED。记录这个通知我解码器认为高度为736而不是正确的720。

            decoder.queueInputBuffer(inputBufIndex, 0, sampleSize, extractor.getSampleTime(), 0);               
            //Get Outputbuffer Index
            int outIndex = decoder.dequeueOutputBuffer(info, 10000);

这在运行4.4的设备上运行正常,问题仅出现在较旧的4.2设备上。有人有什么想法吗?

1 个答案:

答案 0 :(得分:1)

请记住,您还需要检查MediaFormat中的裁剪字段,高度字段是输出缓冲区的完整高度,包括潜在的填充。参见例如https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java中的checkFrame函数 - 您将实际内容高度设为format.getInteger("crop-bottom") - format.getInteger("crop-top") + 1