我正在尝试通过使用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 / *标志* /)处报告错误. codec.start();
日志说:
06-24 15:16:54.582: E/ACodec(3146): [OMX.TI.DUCATI1.VIDEO.MPEG4E] does
not support color format 19 06-24 15:16:54.582: E/ACodec(3146):
[OMX.TI.DUCATI1.VIDEO.MPEG4E] configureCodec returning error
-214748364806-24 15:16:54.582: E/MediaCodec(3146): Codec reported an error. (omx
error 0x80001001, internalError -2147483648)
我已经尝试了Android提供的所有KEY_COLOR_FORMAT,但是它们都不起作用.
谁能帮我?谢谢!
解决方法:
可能是您尝试使用错误的编码器.在开始编码器之前,您应该使用某种方法“探测”现有的编码器:
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).