MediaCodec Demo
来源:互联网 发布:ctp交易接口源码 编辑:程序博客网 时间:2024/05/29 14:34
package com.example.wan.audiocodec;import android.media.MediaCodec;import android.media.MediaExtractor;import android.media.MediaFormat;import android.util.Log;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.nio.ByteBuffer;/** * Created by wan on 2016/4/17. */public class AudioCodec { private String TAG = "Audio"; private MediaCodec mDecoder; private MediaExtractor mExtractor; private String srcPath; private String desPath; private ByteBuffer[] mInputBuffers; private ByteBuffer[] mOutputBuffers; private MediaCodec.BufferInfo info; private MediaFormat mFormat; private int mChannels; private long mDurations; private int mBitrate; private int mSampleRate; private boolean mInputEOS = false; private boolean mOutputEOS = false; private FileOutputStream mOutFile; private OnCompletedListner mCompletedListener; public interface OnCompletedListner { void onCompleted(); } public void setOnCompletedListener(OnCompletedListner listener) { this.mCompletedListener = listener; } public static AudioCodec getInstance() { return new AudioCodec(); } public void setIOPath(String srcPath, String desPath) { this.srcPath = srcPath; this.desPath = desPath; } public int prepare() { mExtractor = new MediaExtractor(); try { mExtractor.setDataSource(srcPath); int trackCounts = mExtractor.getTrackCount(); for (int i = 0; i<trackCounts; i++) { mFormat = mExtractor.getTrackFormat(i); String mime = mFormat.getString(MediaFormat.KEY_MIME); Log.e(TAG, "prepare mime = " + mime + ", mFormat = " + mFormat); if (mime.startsWith("audio")) { mExtractor.selectTrack(i); mSampleRate = mFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE); //mBitrate = mFormat.getInteger(MediaFormat.KEY_BIT_RATE); mDurations = mFormat.getLong(MediaFormat.KEY_DURATION); mChannels = mFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT); Log.e(TAG, "mSampleRate = " + mSampleRate //+ ", mBitrate = " + mBitrate + ", mDurations = " + mDurations + ", mChannels = " + mChannels); mDecoder = MediaCodec.createDecoderByType(mime); mDecoder.configure(mFormat, null, null, 0); break; } } } catch (IOException e) { e.printStackTrace(); return -1; } if (mDecoder == null) { Log.e(TAG, "create decoder failed"); return -1; } mDecoder.start(); mInputBuffers = mDecoder.getInputBuffers(); mOutputBuffers = mDecoder.getOutputBuffers(); info = new MediaCodec.BufferInfo(); try { mOutFile = new FileOutputStream(desPath); } catch (FileNotFoundException e) { e.printStackTrace(); return -1; } Log.e(TAG, "prepare done"); return 0; } private class InputRunnable implements Runnable { @Override public void run() { processInput(); } } private class OutputRunnable implements Runnable { @Override public void run() { processOutput(); if (mCompletedListener != null) { mCompletedListener.onCompleted(); } Log.e(TAG, "Completed"); } } public void startAsync() { Log.e(TAG, "start Async..."); new Thread(new InputRunnable()).start(); new Thread(new OutputRunnable()).start(); } private void processInput() { while (!mInputEOS) { int inputBufferIndex = mDecoder.dequeueInputBuffer(-1); if (inputBufferIndex >= 0) { ByteBuffer inputBuffer = mInputBuffers[inputBufferIndex]; int sampleSize = mExtractor.readSampleData(inputBuffer, 0); if (sampleSize >= 0) { mDecoder.queueInputBuffer(inputBufferIndex, 0, sampleSize, 0, 0); mExtractor.advance(); } else { Log.e(TAG, "input EOS"); mInputEOS = true; mDecoder.queueInputBuffer(inputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM ); } } } } private void processOutput() { while (!mOutputEOS) { int outputBufferIndex = mDecoder.dequeueOutputBuffer(info, -1); if (outputBufferIndex >= 0) { ByteBuffer outputBuffer = mOutputBuffers[outputBufferIndex]; byte[] chunkPCM = new byte[info.size]; outputBuffer.get(chunkPCM); outputBuffer.clear(); try { mOutFile.write(chunkPCM); } catch (IOException e) { e.printStackTrace(); } mDecoder.releaseOutputBuffer(outputBufferIndex, false); if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) { Log.e(TAG, "output EOS"); mOutputEOS = true; } } } } public void release() { try { if (mOutFile != null) { mOutFile.close(); } } catch (IOException e) { e.printStackTrace(); } finally { mOutFile = null; } if (mDecoder != null) { mDecoder.stop(); mDecoder.release(); mDecoder = null; } if (mExtractor != null) { mExtractor.release(); mExtractor = null; } mOutputEOS = false; mInputEOS = false; }}
0 0
- MediaCodec Demo
- MediaCodec Demo
- MediaCodec Demo
- MediaCodec Demo
- android 5.0 mediacodec demo
- Mediacodec
- MediaCodec
- Android中使用MediaCodec硬件解码,高效率得到YUV格式帧,快速保存JPEG图片(不使用OpenGL)(附Demo)
- MediaCodec Sample
- MediaCodec类
- MediaCodec类
- MediaCodec 实例
- MediaCodec总结
- Android MediaCodec
- Mediacodec序
- Android MediaCodec
- Android MediaCodec “Decoded”
- Android MediaCodec 使用例子
- spring(16)------spring的数据源配置
- Java内部类
- 第四章:android核心组件之SimpleAdapter适配器构造函数的详解(二)
- POJ 1004
- linux解压文件出错gzip: stdin: invalid compressed data--format violated
- MediaCodec Demo
- [LeetCode]80. Remove Duplicates from Sorted Array II
- ansible入门
- 半卷湘帘半掩门,碾冰为土玉为盆——客户端检测
- 消息机制之Looper
- Linus,一生只为寻找欢笑(完全版)
- 用sift检测模糊图像
- 安卓开发 第三篇 我的安卓应用架构设计-----Responce类
- POJ 1005