Android 使用MediaDecode 各种坑

在接手其他同事音视频相关收尾工作时,有一个需求在实时通话界面需要能够保存视频和音频数据到mp4。由于先前没有实际上手过相关音视频工作,只能硬着头皮在哔哩哔哩上面看了一个视频教程。

视频上的老师,先这样再那样,然后视频文件就录制好了,非常不错。采用系统自带的MediaDecode是一个不错的选择,谁知真真上手,放到项目里面问题不断,一路上是各种坑,也或者是自己经验不足,才算是坑。

坑1:视频和音频通过MediaMuxer 混合时,必现先把音频和视频分别都addTrack后才可以start

      MediaFormat mediaFormat = mediaCodec.getOutputFormat();
      mTrackIndex = mediaMuxer.addTrack(mediaFormat);
     MediaFormat mediaFormat = mAudioCodec.getOutputFormat();
     mAudioTrackIndex = mediaMuxer.addTrack(mediaFormat);

坑2:手机差异性

写完逻辑后,使用一部手机进行调试验证,发现视频可以正常录制,非常顺利,偶然又换了一台测试手机,发现同样的代码录制的视频,每一帧图像都是色条,再换上原来调试的手机发现图像又是正常。最后定位到是MediaFormat.KEY_COLOR_FORMAT参数没有配置对,这里说明不同手机兼容不一致。

坑3:MediaDecode的兼容问题

在部分手机调试通过后,开始兼容性测试,在华为手机上,录制的mp4文件只有几百k,且无法打开。最后定位到代码段

int outputBufferId = mediaCodec.dequeueOutputBuffer(bufferInfo, 200);

outputBufferId一直都是-1。

测试验证了好几台手机,只有这台手机异常。经过不懈的百度,最后找到解决方案如下。

 mediaFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE,(int)(videoWidth*videoHeight*1.7+1));

需要添加MediaFormat.KEY_MAX_INPUT_SIZE这个配置,这里value对应的值可达可小,根据自己需求定义

坑4:华为手机绿屏

刚从坑3出来,发现视频可以正常录制了,文件大小也正常了。细看发现每帧图像大部分是黑白且图像底部有绿色色条。各种关键字搜索都没有找到解决方案,最后使用了关键字“MediaDecode”和“华为”两个字,最终找到了先前大神的一篇博客。

博客里面提到华为系统内置了两套两个编解码库。救命博客

抱着试试看的心态,发现管用。

  mediaCodec = MediaCodec.createByCodecName("OMX.google.h264.encoder");

创建MediaCodec 对象时指定使用Google库名称

你可能感兴趣的:(MediaCodec)