android MediaCodec的自己碰到的问题

本文是个人在使用MediaCodec开发的时候碰到的一些问题,做下记录....


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

1, 获取支持分辨率问题

Camera.Parameters parameters = _camera.getParameters();
List  previewSizes = parameters.getSupportedPreviewSizes();

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

2,设置分辨率
 
  
List previewFormatsSizes = parameters.getSupportedPreviewFormats();
 
  
 parameters.setPictureSize(_width, _height);
 parameters.setPreviewSize(_width, _height);
这里设置的宽和高,必须是previewFormatsSizes 里面支持的,否则会报错崩溃
 
  
3,设置MediaFormat.KEY_COLOR_FORMAT
这个非常重要,出了问题也很难找到原因,下面我描述一下,我之前在这里出现的问题。
YUV数据 = width * height *3 /2 ;这个不用多说。我使用魅族的手机,
List 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 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.  
网上搜索了很久,但是都没有发现有效的解决方法
注:此问题出现在三星,努比亚手机上,华为,魅族手机并 不会出现此问题。

此致  敬礼

你可能感兴趣的:(android)