mediaCodec 的使用遇到的问题

最近项目需要在android的项目进行音视频的硬编解码,所以使用mediaCodec。

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

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

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.html

你可能感兴趣的:(mediaCodec 的使用遇到的问题)