我正在尝试使用MediaCodec应用编码器。我使用的MediaFormat如下。
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/mp4v-es", 640, 480);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 125000);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV422PackedSemiPlanar);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
该演示在虚拟机上运行良好。但是,当我在真机(三星Galaxy Tab GT3113)上进行测试时失败了。该演示报告了codec.configure(mediaFormat, null /* surface */, null /* crypto */, MediaCodec.CONFIGURE_FLAG_ENCODE /* flags */); codec.start();
行的错误
logcat说:
06-24 15:16:54.582:E / ACodec(3146):[OMX.TI.DUCATI1.VIDEO.MPEG4E] 不支持颜色格式19 06-24 15:16:54.582:E / ACodec(3146): [OMX.TI.DUCATI1.VIDEO.MPEG4E] configureCodec返回错误 -2147483648
06-24 15:16:54.582:E / MediaCodec(3146):编解码器报告错误。 (OMX 错误0x80001001,internalError -2147483648)
我已经尝试了Android提供的所有 KEY_COLOR_FORMAT ,但都没有。 谁能帮我?谢谢!
答案 0 :(得分:4)
可能你正在尝试使用错误的编码器。在启动编码器之前,您应该使用某种方式“探测”现有的编码器:
HashMap<String, CodecCapabilities> mEncoderInfos;
void initEncoderInfos(){
for(int i = MediaCodecList.getCodecCount() - 1; i >= 0; i--){
MediaCodecInfo codecInfo = MediaCodecList.getCodecInfoAt(i);
if(codecInfo.isEncoder()){
for(String t : codecInfo.getSupportedTypes()){
try{
mEncoderInfos.put(t, codecInfo.getCapabilitiesForType(t));
} catch(IllegalArgumentException e){
e.printStackTrace();
}
}
}
}
}
所有信息都将在mEncoderInfos中收集。在此之后,您可以使用最合适的编码器。
换句话说:您不应该假设某些编码器(在您的情况下为“video / mp4v-es”)支持某种颜色格式(在您的情况下为MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV422PackedSemiPlanar)。