Eclipse 源码:
http://download.csdn.net/detail/yulinxx/9732744

package io.vec.demo.mediacodec;import java.io.IOException;import java.nio.ByteBuffer;import android.app.Activity;import android.media.MediaCodec;import android.media.MediaCodec.BufferInfo;import android.media.MediaCodecInfo;import android.media.MediaExtractor;import android.media.MediaFormat;import android.os.Bundle;import android.os.Environment;import android.util.Log;import android.view.Surface;import android.view.SurfaceHolder;import android.view.SurfaceView;public class DecodeActivity extends Activity implements SurfaceHolder.Callback {    // private static final String strVideo =    // Environment.getExternalStorageDirectory() + "/test/xx.avi";    // private static final String strVideo =    // Environment.getExternalStorageDirectory() + "/test/test.wmv";    // private static final String strVideo =    // Environment.getExternalStorageDirectory() +    // "/netease/cloudmusic/Music/Alborada Del Inka - Vientos suaves.mp3";    // private static final String strVideo =    // Environment.getExternalStorageDirectory() +    // "/DCIM/Camera/VID_20161117_175920.mp4";    // private static final String strVideo =    // Environment.getExternalStorageDirectory() + "/test/H264_1080.mp4";    // private static final String strVideo =    // Environment.getExternalStorageDirectory() + "/test/H265_1080.mp4";    private static final String strVideo = Environment.getExternalStorageDirectory() + "/test/H265_1080.mp4";    private String TAG = "DecodeActivity";    private PlayerThread mPlayerThread = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        SurfaceView sv = new SurfaceView(this);        sv.getHolder().addCallback(this);        setContentView(sv);    }    protected void onDestroy() {        super.onDestroy();    }    @Override    public void surfaceCreated(SurfaceHolder holder) {    }    @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {        if (mPlayerThread == null) {            mPlayerThread = new PlayerThread(holder.getSurface());            mPlayerThread.start();        }    }    @Override    public void surfaceDestroyed(SurfaceHolder holder) {        if (mPlayerThread != null) {            mPlayerThread.interrupt();        }    }    // *****************************************************************    private class PlayerThread extends Thread {        private MediaExtractor mediaExtractor;        /** 用来读取音視频文件 提取器 */        private MediaCodec mediaCodec;        /** 用来解码 解碼器 */        private Surface surface;        public PlayerThread(Surface surface) {            this.surface = surface;        }        @Override        public void run() {            mediaExtractor = new MediaExtractor();            try {                mediaExtractor.setDataSource(strVideo); // 设置数据源            } catch (IOException e1) {                e1.printStackTrace();            }            String mimeType = null;            for (int i = 0; i < mediaExtractor.getTrackCount(); i++) { // 信道总数                MediaFormat format = mediaExtractor.getTrackFormat(i); // 音频文件信息                mimeType = format.getString(MediaFormat.KEY_MIME); // Video/AVC                                                                    // H 264                                                                    // Video/HEVC                                                                    // H265                                                                    // video/hevc                if (mimeType.startsWith("video/")) { // 视频信道                    mediaExtractor.selectTrack(i); // 切换到视频信道                    mediaCodec = MediaCodec.createDecoderByType(mimeType); // 创建解码器,提供数据输出                    mediaCodec.configure(format, surface, null, 0);                    break;                }                if (mimeType.startsWith("audio/")) { // 音频信道                }            }            if (mediaCodec == null) {                Log.e("DecodeActivity", "Can't find video info!");                return;            }            mediaCodec.start(); // 启动MediaCodec ,等待传入数据            ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers(); // 用来存放目标文件的数据                                                                        // 输入            ByteBuffer[] outputBuffers = mediaCodec.getOutputBuffers(); // 解码后的数据                                                                        // 输出            BufferInfo info = new BufferInfo(); // 用于描述解码得到的byte[]数据的相关信息            boolean bIsEos = false;            long startMs = System.currentTimeMillis();            // ==========开始解码=============            while (!Thread.interrupted()) {                if (!bIsEos) {                    int inIndex = mediaCodec.dequeueInputBuffer(10000);                    if (inIndex >= 0) {                        ByteBuffer buffer = inputBuffers[inIndex];                        int nSampleSize = mediaExtractor.readSampleData(buffer, 0); // 读取一帧数据至buffer中                        if (nSampleSize < 0) {                            Log.d("DecodeActivity", "InputBuffer BUFFER_FLAG_END_OF_STREAM");                            mediaCodec.queueInputBuffer(inIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);                            bIsEos = true;                        } else {                            // 填数据                            mediaCodec.queueInputBuffer(inIndex, 0, nSampleSize, mediaExtractor.getSampleTime(), 0); // 通知MediaDecode解码刚刚传入的数据                            mediaExtractor.advance(); // 继续下一取样                        }                    }                }                int outIndex = mediaCodec.dequeueOutputBuffer(info, 10000);                switch (outIndex) {                case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:                    Log.d("DecodeActivity", "INFO_OUTPUT_BUFFERS_CHANGED");                    outputBuffers = mediaCodec.getOutputBuffers();                    break;                case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:                    Log.d("DecodeActivity", "New format " + mediaCodec.getOutputFormat());                    break;                case MediaCodec.INFO_TRY_AGAIN_LATER:                    Log.d("DecodeActivity", "dequeueOutputBuffer timed out!");                    break;                default:                    ByteBuffer buffer = outputBuffers[outIndex];                    Log.v("DecodeActivity", "We can't use this buffer but render it due to the API limit, " + buffer);                    // We use a very simple clock to keep the video FPS, or the                    // video                    // playback will be too fast                    while (info.presentationTimeUs / 1000 > System.currentTimeMillis() - startMs) {                        try {                            sleep(10);                        } catch (InterruptedException e) {                            e.printStackTrace();                            break;                        }                    }                    mediaCodec.releaseOutputBuffer(outIndex, true);                    break;                }                // All decoded frames have been rendered, we can stop playing                // now                if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {                    Log.d("DecodeActivity", "OutputBuffer BUFFER_FLAG_END_OF_STREAM");                    break;                }            } // end while            mediaCodec.stop();            mediaCodec.release();            mediaExtractor.release();        }    }}

更多相关文章

  1. 我的Android进阶之旅------>Android视频录制小例子
  2. android 日志文件输出
  3. gradle 配置文件 build.gradle 属性详解
  4. android文件缓存,并SD卡创建目录未能解决和bitmap内存溢出解决
  5. Android和Java本地数据库新选择
  6. android 布局文件 layout_weight用法
  7. android 中xml文件中出现 Attr.value missing 错误
  8. 获得Android Linux系统增删文件的权限
  9. 在Android中查看和管理sqlite数据库

随机推荐

  1. Android中利用Handler实现消息的分发机制
  2. Android(安卓)Paging Library 基于Recycl
  3. 实现一个用于显示当前时间的Google Andro
  4. Android REST 开发网络跳棋对战程序
  5. 浅谈Android 的线程和线程池的使用
  6. Hierarchy Viewer测试工具
  7. android 如何使用SAX解析XML
  8. 使用delphi 开发 web(五)Android 与delphi
  9. Android Studio升级后,开启时遇到tools.ja
  10. android每日一问1【2011-09-06】