0

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

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 设备上。有人有什么想法吗?

4

1 回答 1

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.

于 2014-11-11T20:28:26.963 回答