android多媒体总结

来源:互联网 发布:迅龙数据恢复怎么样 编辑:程序博客网 时间:2024/06/11 11:57

        使用android的MediaCodec进行视频编解码时,经常出现出不了视频数据的情况,有以下几点需要注意的:

1.MediaCodec硬解码时,高通平台经常出现分辨率不支持的情况,比如传入MediaCodec解码时是352X288的分辨率,但是MediaCodec出来的数据却是384X288的,所以再以352X288的分辨率进行渲染视频画面时,将会出现花屏,而是应该用384X288进行界面的渲染,才能出真正的视频数据,高通平台用的分辨率很多是宽高比例为4:3的。所以在开发视频通信时,分辨率的选择要4:3的分辨率,比如352X288就不是4:3的比率,384X288就是4:3的分辨率。要不然一开始协商的视频通信分辨率为352X288,而解码器只支持384X288,此时进行384X288进行渲染时,将会出现32dp的绿色边框,因为MediaCodec会填充空白数据从353到384为止,如下图所示。

        

而MediaCodec真正解码出来的分辨率获取如下:                 

            int height =  mediaCodec.getOutputFormat().getInteger(MediaFormat.KEY_SLICE_HEIGHT);

            int width = mediaCodec.getOutputFormat().getInteger(MediaFormat.KEY_STRIDE);
2.MediaCodec视频编码时,可以通过设置I帧间隔:mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, XWVideoLauncher.iFrameStep);避免视频界面显示部分花屏的情况。
3.有些终端视频硬编码时从MediaCodec获取数据时,ByteBuffer[] outputBuffers = mediaCodec.getOutputBuffers();要增加:
               outputBuffer.position(bufferInfo.offset);
               outputBuffer.limit(bufferInfo.offset + bufferInfo.size);
否则会出现溢出的问题。但是有的终端不需要增加这两句代码,这里要跟底层的MediaCodec配置起来吧,毕竟不同的终端底层的代码还是不一样的。

4.使用视频硬编码时比较适合的码率是5倍当前的分辨率:mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, mWidth * mHeight * 5);

5.Camera.Parameters.setPreviewFpsRange(mFrameRate*1000, mFrameRate*1000);有些终端设置了帧率范围后,出不了数据。

6.有些终端硬解码时的decoder.dequeueInputBuffer(-1),超时时间一定要设置为-1,否则出不了数据。



原创粉丝点击