mediaCodec 的使用遇到的问题

最近项目须要在android的项目进行音视频的硬编解码,因此使用mediaCodec。html

这个过程,首先须要对音视频的编解码有足够的理解。android

不管是音频、视频的编码、解码,MediaCodec都是有三个部分。原理是消费者生产者的处理信息的过程。web

1.MediaCodec初始化设置,主要设置MediaCodec
2.将数据放到MediaCodec的InputBuffer
3.将数据从MediaCodec的OutputBuffer取出来,而后处理

问题:网络

1.因为视频编码后显示的数据质量偏低,因此须要调整质量。这个时候须要在这个设置level、profile.

Profile是对视频压缩特性的描述(CABAC呀、颜色采样数等等)。Level是对视频自己特性的描述(码率、分辨率、fps)。
简单来讲,Profile越高,就说明采用了越高级的压缩特性。Level越高,视频的码率、分辨率、fps越高
        mediaFormat.setInteger(MediaFormat.KEY_LEVEL, mLevel);            mediaFormat.setInteger(MediaFormat.KEY_PROFILE, mProfile);        

可是须要考虑到传输速率的问题,因此,须要设置level在8192如下。

2.编码时须要设置音视频呈现时间
主要是设置MediaCodec.queueInputBuffer的presentationTimeUs,所以该时间的设置是
long pts = 1000000 * mCnt++ / mFramerate; 其中mC++ 初始化为0,mFramerate为帧率/时间间隔;

3.解码时须要设置音视频的取包的时间
主要是MediaCodec.dequeueOutputBuffer。这个时间设置是timeoutUs。若是timeoutUs=-1,就是当有包时当即处理,没有包时不处理;若是timeoutUs=1(单位为s),就是每隔1s去获取包,这个时候有可能获取不到包

4.解码时须要注意格式的获取
对于音视频的格式,能够在MediaFomat上设置,也能够在网络推流前上设置。
如今主要使用OutputBuffer。
使用dequeueOutputBuffer后,会获取对应的idx。若是idx=-2,这个就是存储着解码后音视频的信息。这个时候能够参考其信息,而后,传递出来

5.曾经我遇到过解码后输出的byte[]为0。这个时候,原来是我编码的数据,宽和高倒置了。所以仍是须要获取格式后去设置

6.在视频编码后若是是关键帧,须要在关键帧前添加关键信息

参考:
https://developer.android.com/reference/android/media/MediaCodec.htmlsvg