【发布时间】:2015-02-18 13:36:33
【问题描述】:
我正在使用 bigflake 的 selectColorFormat 方法来获取 MediaCodec 编码器支持的输入颜色格式。它在除华为 Mate7 之外的一些测试设备上运行良好。返回的颜色格式是COLOR_FormatYUV420Planar。所以我把它配置为输入格式。但是编码时我发现输入缓冲区的容量不正确,应该是3*width*height/2。但是它比那个小。所以当queueInputBuffer调用时发生了错误。然后我观察了capabilities.colorFormats列表,它有十多种颜色格式。但是在普通设备上,该列表大约有2或3种颜色格式。然后我将颜色格式选择为COLOR_FormatYUV420SemiPlanar,它在Mate7上也很好用。
所以我怀疑这是Mate7版本的bug还是selectColorFormat方法的bug?
我发现 FAQ Q5 的答案有:
#20 COLOR_FormatYUV420PackedPlanar (also I420)
#39 COLOR_FormatYUV420PackedSemiPlanar (also NV12)
#0x7f000100 COLOR_TI_FormatYUV420PackedSemiPlanar (also also NV12)
also I420 和 NV12 是什么意思?是说布局和 I420 或 NV12 都一样吗?因为我测试过 I420 和 NV12,但没有遇到过这三色设备。
selectColorFormat方法如下:
private MediaCodecInfo selectCodec(String mimeType) {
int numCodecs = MediaCodecList.getCodecCount();
for (int i = 0; i < numCodecs; i++) {
MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i);
if (!codecInfo.isEncoder()) {
continue;
}
String[] types = codecInfo.getSupportedTypes();
for (int j = 0; j < types.length; j++) {
if (types[j].equalsIgnoreCase(mimeType)) {
return codecInfo;
}
}
}
return null;
}
private int selectColorFormat(String mimeType) {
MediaCodecInfo codecInfo = selectCodec(mimeType);
int colorFormat = 0;
MediaCodecInfo.CodecCapabilities capabilities = codecInfo.getCapabilitiesForType(mimeType);
for (int i = 0; i < capabilities.colorFormats.length; i++) {
if (isRecognizedFormat(capabilities.colorFormats[i])) {
colorFormat = capabilities.colorFormats[i];
break;
}
}
return colorFormat;
}
private boolean isRecognizedFormat(int colorFormat) {
switch (colorFormat) {
// these are the formats we know how to handle for this test
case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar:
case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedPlanar:
case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar:
case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedSemiPlanar:
case MediaCodecInfo.CodecCapabilities.COLOR_TI_FormatYUV420PackedSemiPlanar:
return true;
default:
return false;
}
}
【问题讨论】:
标签: android yuv android-mediacodec