|
(代码流)Android硬编解码
发表于 2014-11-26 11:10:44
浏览:81256
|
回复:30
打印
只看该作者
[复制链接]
楼主
本帖最后由 bunchen 于 2014-12-13 10:56 编辑
Android硬编解码主要用MediaCodec实现。以下是Android官方的使用说明:
- MediaCodec codec = MediaCodec.createDecoderByType(type);
- codec.configure(format, ...);
- codec.start();
- ByteBuffer[] inputBuffers = codec.getInputBuffers();
- ByteBuffer[] outputBuffers = codec.getOutputBuffers();
- for (;;) {
- int inputBufferIndex = codec.dequeueInputBuffer(timeoutUs);
- if (inputBufferIndex >= 0) {
- // fill inputBuffers[inputBufferIndex] with valid data
- ...
- codec.queueInputBuffer(inputBufferIndex, ...);
- }
- int outputBufferIndex = codec.dequeueOutputBuffer(timeoutUs);
- if (outputBufferIndex >= 0) {
- // outputBuffer is ready to be processed or rendered.
- ...
- codec.releaseOutputBuffer(outputBufferIndex, ...);
- } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
- outputBuffers = codec.getOutputBuffers();
- } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
- // Subsequent data will conform to new format.
- MediaFormat format = codec.getOutputFormat();
- ...
- }
- }
- codec.stop();
- codec.release();
- codec = null;
复制代码
我就用MediaCodec做一个demo,实现硬编解码摄像的的preview数据。
demo界面如图:
程序界面很简单,右下角是摄像头的预览窗口,中间的经过硬编解码显示出来的数据。
- private void doCodec(byte[] data){
- int et = mEncoder.encode(data , 0 , data.length, buffer1, 0);
- Log.d("buncodec","encode et="+et);
-
- int dt = mDecoder.decode(buffer1, 0 , et , buffer2 , 0);
- Log.d("buncodec","decode dt="+dt);
-
-
- // 用YuvImage显示 NV21 数据 ,效率不高 ,但只是个demo 。
- YuvImage image = new YuvImage(buffer2,
- getPreviewFormat(), getPreviewWidth(), getPreviewHeight(),
- null);
- setData(image,getPreviewWidth(),getPreviewHeight());
-
- image = null ;
- }
复制代码
logcat显示:
从logcat可以看出1280*720的preview数据长度是1280*720*3/2=1382400;
硬编码后数据长度是et 大概在50000以内。
硬解码后数据长度是dt 又回到了1382400。
|
|