我正在为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设备上。有人有什么想法吗?
答案 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
。