android MediaCodec的自己碰到的问题

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


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.  
网上搜索了很久,但是都没有发现有效的解决方法
注:此问题出现在三星,努比亚手机上,华为,魅族手机并 不会出现此问题。

此致  敬礼

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值