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