本文是个人在使用MediaCodec开发的时候碰到的一些问题,做下记录....
MediaCodec的基本用法,网上一大把,这里就不写了
1, 获取支持分辨率问题
Camera.Parameters parameters = _camera.getParameters();
ListpreviewSizes = parameters.getSupportedPreviewSizes();
ListsvsList = parameters.getSupportedVideoSizes();
svsList 有可能为空(有些手机是获取不到的),在网上 找了些资料,如果svsList为空,其实是可以直接使用parameters.getSupportedPreviewSizes();
所以:
if(svsList == null){ svsList = parameters.getSupportedPreviewSizes(); }
2,设置分辨率
ListpreviewFormatsSizes = parameters.getSupportedPreviewFormats();
parameters.setPictureSize(_width, _height); parameters.setPreviewSize(_width, _height);
这里设置的宽和高,必须是previewFormatsSizes 里面支持的,否则会报错崩溃
3,设置MediaFormat.KEY_COLOR_FORMAT
这个非常重要,出了问题也很难找到原因,下面我描述一下,我之前在这里出现的问题。
YUV数据 = width * height *3 /2 ;这个不用多说。我使用魅族的手机,
ListpreviewFormatsSizes = 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进去就溢出了。百思不得其解,
最后的解决方法是:
ListpreviewFormatsSizes = 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.
网上搜索了很久,但是都没有发现有效的解决方法
注:此问题出现在三星,努比亚手机上,华为,魅族手机并 不会出现此问题。
此致 敬礼