MediaCodec问题汇总

来源:互联网 发布:苹果cms整合ck播放器 编辑:程序博客网 时间:2024/05/20 23:02
参考:http://blog.csdn.net/mincheat/article/details/51385144

MediaCodec的基本用法,网上一大把,这里就不写了

1, 获取支持分辨率问题

Camera.Parameters parameters = _camera.getParameters();
List<Size>  previewSizes = parameters.getSupportedPreviewSizes();
List<Size> svsList = parameters.getSupportedVideoSizes();
svsList 有可能为空(有些手机是获取不到的),在网上 找了些资料,如果svsList为空,其实是可以直接使用parameters.getSupportedPreviewSizes();
所以:
if(svsList == null){    svsList = parameters.getSupportedPreviewSizes();}

2,设置分辨率
List<Integer> previewFormatsSizes = parameters.getSupportedPreviewFormats();
 parameters.setPictureSize(_width, _height); parameters.setPreviewSize(_width, _height);
这里设置的宽和高,必须是previewFormatsSizes 里面支持的,否则会报错崩溃
3,设置MediaFormat.KEY_COLOR_FORMAT
这个非常重要,出了问题也很难找到原因,下面我描述一下,我之前在这里出现的问题。
YUV数据 = width * height *3 /2 ;这个不用多说。我使用魅族的手机,
List<Integer> previewFormatsSizes = parameters.getSupportedPreviewFormats();
if( -1 != previewFormatsSizes.indexOf(ImageFormat.YV12)){    _imageFormat = ImageFormat.YV12;}else if(-1 != previewFormatsSizes.indexOf(ImageFormat.NV21)){    _imageFormat = ImageFormat.NV21;}else{    _imageFormat = -1;    return ;}
那么_imageFormat = ImageFormat.YV12;
然后
mediaCodec = MediaCodec.createEncoderByType("video/avc");MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", width, height);
switch(_imageFormat ){case ImageFormat.NV21:   mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar);   break;case ImageFormat.YV12:   mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar);   break;   default:      break;}
//some code ...
ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers();
发现inputBuffers的每一个成员,的大小都是width*height*3/2, 非常好,一切正常
但是
我使用华为手机的时候发现inputBuffers的每一个成员,的大小都是width*height,所以我把我的数据buffer(w*h*3/2),input进去就溢出了。百思不得其解,
最后的解决方法是:
List<Integer> previewFormatsSizes = parameters.getSupportedPreviewFormats();
if( -1 != previewFormatsSizes.indexOf(ImageFormat.NV21)){    _imageFormat = ImageFormat.NV21;}else if(-1 != previewFormatsSizes.indexOf(ImageFormat.YV12)){
   _imageFormat = ImageFormat.YV12;}else{    _imageFormat = -1;    return ;}
让它优先适配NV21,那么就没问题了,调试的发现,其实previewFormatsSizes中NV21和YV12都有,这个和手机又关系吧,同样的问题,也出现在三星,努比亚手机上。

4,mediaCodec.dequeueOutputBuffer 返回-1   (此问题我还没有解决,如果有童鞋解决了,麻烦请留言,非常感谢)
现象:在编码的时候,前面的pps,sps,第一帧正常,之后就一直返回-1.  
网上搜索了很久,但是都没有发现有效的解决方法
注:此问题出现在三星,努比亚手机上,华为,魅族手机并 不会出现此问题。