Android MediaCodec类
来源:互联网 发布:python urllib介绍 编辑:程序博客网 时间:2024/06/03 13:20
Android MediaCodec应用类
1、MediaCodec播放音频
MediaExtractor extractor = new MediaExtractor();try {extractor.setDataSource("/sdcard/demo.mp3");} catch (IOException e) {return;}MediaFormat format = null;String mime = null;int sampleRate = 0;for (int index = 0; index < extractor.getTrackCount(); index++) {MediaFormat mf = extractor.getTrackFormat(index);mime = mf.getString(MediaFormat.KEY_MIME);sampleRate = mf.getInteger(MediaFormat.KEY_SAMPLE_RATE);if (mime.startsWith("audio/")) {format = mf;// 选择音频extractor.selectTrack(index);break;}}if (format == null) { return; }// AudioTrack播放音频int bufferSize = AudioTrack.getMinBufferSize(sampleRate,AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT);AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT,bufferSize, AudioTrack.MODE_STREAM);audioTrack.play();try {MediaCodec mediaCodec = MediaCodec.createDecoderByType(mime);mediaCodec.configure(format, null, null, 0);mediaCodec.start();ByteBuffer[] inputBufferArray = mediaCodec.getInputBuffers();ByteBuffer[] outputBufferArray = mediaCodec.getOutputBuffers();boolean outputEos = false;boolean inputEos = false;long timeoutUs = 10;MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();while (!outputEos && !mStop) {try {if (!inputEos) {int inputBufferIndex = mediaCodec.dequeueInputBuffer(timeoutUs);if (inputBufferIndex >= 0) {ByteBuffer buffer = inputBufferArray[inputBufferIndex];int sampleSize = extractor.readSampleData(buffer, 0);long presentationTime = 0;// 如果sampleSize小于0,已到文件末尾if (sampleSize < 0) {inputEos = true;sampleSize = 0;} else {presentationTime = extractor.getSampleTime();}mediaCodec.queueInputBuffer(inputBufferIndex, 0,sampleSize, presentationTime,inputEos ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);if (!inputEos) {extractor.advance();}}int outputBufferIndex = mediaCodec.dequeueOutputBuffer(info, timeoutUs);if (outputBufferIndex >= 0) {ByteBuffer buffer = outputBufferArray[outputBufferIndex];final byte[] buf = new byte[info.size];buffer.get(buf);buffer.clear();if (buf.length > 0) {audioTrack.write(buf, 0, buf.length);}mediaCodec.releaseOutputBuffer(outputBufferIndex, false);if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {outputEos = true;}}}} catch (Exception e) {}}if (mediaCodec != null) {mediaCodec.stop();mediaCodec.release();}} catch (IOException e) {} finally {extractor.release();audioTrack.stop();audioTrack.release();}
2、MediaCodec播放视频
MediaExtractor extractor = new MediaExtractor();try {extractor.setDataSource("/sdcard/video.3gp");} catch (IOException e) {return;}MediaFormat format = null;String mime = null;for (int index = 0; index < extractor.getTrackCount(); index++) {MediaFormat mf = extractor.getTrackFormat(index);mime = mf.getString(MediaFormat.KEY_MIME);// 选择视频if (mime.startsWith("video/")) {format = mf;extractor.selectTrack(index);break;}}if (format == null) { return; }try {MediaCodec mediaCodec = MediaCodec.createDecoderByType(mime);// 绑定surfacemediaCodec.configure(format, mSurfaceView.getHolder().getSurface(), null, 0);mediaCodec.start();ByteBuffer[] inputBufferArray = mediaCodec.getInputBuffers();boolean outputEos = false;boolean inputEos = false;long timeoutUs = 10;long startTimeMillis = 0;MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();while (!outputEos && !mStop) {try {if (!inputEos) {int inputBufferIndex = mediaCodec.dequeueInputBuffer(timeoutUs);if (inputBufferIndex >= 0) {long presentationTime = 0;ByteBuffer buffer = inputBufferArray[inputBufferIndex];int sampleSize = extractor.readSampleData(buffer, 0);if (sampleSize < 0) {inputEos = true;sampleSize = 0;} else {presentationTime = extractor.getSampleTime();}mediaCodec.queueInputBuffer(inputBufferIndex, 0,sampleSize, presentationTime,inputEos ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);if (!inputEos) {extractor.advance();}}int outputBufferIndex = mediaCodec.dequeueOutputBuffer(info, timeoutUs);if (outputBufferIndex >= 0) {long currentTimeMillis = System.currentTimeMillis();if (startTimeMillis == 0) {startTimeMillis = currentTimeMillis;} else {long sleepTime = (info.presentationTimeUs / 1000) -(currentTimeMillis - startTimeMillis);if (sleepTime > 0) {try {Thread.sleep(sleepTime);} catch (InterruptedException e) {}}}mediaCodec.releaseOutputBuffer(outputBufferIndex, true);if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {outputEos = true;}}}} catch (Exception e) {}}mediaCodec.stop();mediaCodec.release();} catch (IOException e) {} finally { extractor.release();}
0 0
- Android MediaCodec类
- Android MediaCodec
- Android MediaCodec
- MediaCodec类
- MediaCodec类
- Android MediaCodec “Decoded”
- Android MediaCodec 使用例子
- Android MediaCodec 使用例子
- Android MediaCodec “Decoded”
- Android MediaCodec stuff
- Android MediaCodec小结
- Android MediaCodec小结
- Android MediaCodec小结
- Android MediaCodec小结
- Android MediaCodec学习
- Android MediaCodec使用介绍
- Android MediaCodec 视频编码
- Android MediaCodec 使用例子
- Xcode自定义代码块
- HDFS 挂载目录及重做方式
- 台阶问题:斐波那契数列的扩展问题研究
- 深入理解Java中的final关键字
- hadoop学习笔记--4.Ubuntu下Eclipse+hadoop开发配置
- Android MediaCodec类
- 10. Hibernate_详解 Hibernate 映射文件(2)
- PHP5.6.15连接Sql Server 2008配置方案
- 源码时代——最新开班计划
- linux上的Tomcat 8 的远端debug调试
- Android RIL架构分析——(1)本地库实现[c/cpp部分]
- linux memalign()
- Python nan ,ref的含义
- 同步图运算框架GraphLite实例之KCore算法