- A+
Android 音视频的代码好多都属于native层,Nupalyer和AweSomePlayer控制流程复杂, 学习难度比较大,作为app人员来说接触的机会又比较少,导致想学习知识的人门槛比较高。
所以这边通过上层的控制,让大家慢慢熟悉播放器的原理。
因此将非常简单的音频播放器,拿出来练习,源码提供大家参考。都有注释就不一一解释了。
本app采用上层的MediaCodec 和 MediaExtractor 将音频播放。步骤大概如下:
- 1、开启线程
- 2、将输入源给分离器MediaExtractor,MediaExtractor差分数据和解析出相关信息
- 3、通过分离器MediaExtractor分里的信息创建解码器MediaCodec
- 4、通过分离器MediaExtractor分里的信息创建音频输出环境AudioTrack
- 5、启动解码器,先将输入数据送入,后将解码数据输出。
- 6、AudioTrack写数据,声音响起。
package com.eebbk.sampleplayer; import android.media.AudioFormat; import android.media.AudioManager; import android.media.AudioTrack; import android.media.MediaCodec; import android.media.MediaExtractor; import android.media.MediaFormat; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.WindowManager; import java.nio.ByteBuffer; public class MainActivity extends AppCompatActivity { AudioTrack mAudioTrack; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); setContentView(R.layout.content_main); Thread thread = new Thread() {//耗时的操作应该另外开一个线程 @Override public void run() { //创建分离器 MediaExtractor extractor = new MediaExtractor(); try { extractor.setDataSource("/sdcard/mo.mp3"); } catch (Exception e) { e.printStackTrace(); } //选择视频流 创建解码器 MediaCodec mediaCodec = null; try { int tackNum = extractor.getTrackCount(); for (int i = 0; i < tackNum; i++) { MediaFormat format = extractor.getTrackFormat(i); String mime = format.getString(MediaFormat.KEY_MIME); if (mime.startsWith("audio/")) { int sampleRate =format.getInteger(MediaFormat.KEY_SAMPLE_RATE); int audioMinBufSize = AudioTrack.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT); //创建音频输出环境 mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,sampleRate,AudioFormat.CHANNEL_OUT_STEREO,AudioFormat.ENCODING_PCM_16BIT, audioMinBufSize,AudioTrack.MODE_STREAM); mAudioTrack.play(); mediaCodec = MediaCodec.createDecoderByType(mime); mediaCodec.configure(format, null, null, 0); extractor.selectTrack(i); } } } catch (Exception e) { e.printStackTrace(); } //启动解码器 mediaCodec.start(); ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers(); ByteBuffer[] outputBuffers = mediaCodec.getOutputBuffers(); boolean inputEnd = false; boolean outputEnd= false; final long kTimeOutUs = 10000; MediaCodec.BufferInfo info = new MediaCodec.BufferInfo(); while (!outputEnd) { try { if (!inputEnd) {//输入到解码器 进行解码 int inputBufIndex = mediaCodec.dequeueInputBuffer(kTimeOutUs); if (inputBufIndex >= 0) { ByteBuffer dstBuf = inputBuffers[inputBufIndex]; int sampleSize = extractor.readSampleData(dstBuf, 0);//从分离器拿数据 if (sampleSize < 0) { mediaCodec.queueInputBuffer(inputBufIndex, 0, 0, 0,MediaCodec.BUFFER_FLAG_END_OF_STREAM); inputEnd = true; } else { long mediatime = extractor.getSampleTime(); //将数据送入解码器 mediaCodec.queueInputBuffer(inputBufIndex, 0, sampleSize, mediatime, inputEnd ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0); extractor.advance(); } } } //从解码器输出 int res = mediaCodec.dequeueOutputBuffer(info, kTimeOutUs); //将数据从解码器拿出来 if (res >= 0) { int outputBufIndex = res; ByteBuffer buf = outputBuffers[outputBufIndex]; final byte[] pcmData = new byte[info.size]; buf.get(pcmData); buf.clear(); if (pcmData.length > 0) { //对音频数据pcm进行输出 mAudioTrack.write(pcmData, 0, pcmData.length); } try { sleep(16);//多长时间刷新 } catch (InterruptedException e) { e.printStackTrace(); break; } //告诉显示器释放并显示这个内容 mediaCodec.releaseOutputBuffer(outputBufIndex, true); } } catch (RuntimeException e) { e.printStackTrace(); } } if (mediaCodec != null) { mediaCodec.stop(); mediaCodec.release(); mediaCodec = null; } if (extractor != null) { extractor.release(); extractor = null; } } }; thread.start(); } }
Android 音视频学习基础--1.1 音视频基础知识
Android 音视频学习基础--1.2 需要认识的一些工具
Android 音视频学习基础--1.3 主流的开源项目
Android 音视频学习基础--1.4 ffmpeg pcm输出
Android 音视频学习基础--1.5 ffmpeg yuv输出
Android 音视频学习基础--1.6 ffmpeg 简单视频播放器
Android 音视频学习基础--1.7 Android最简单的音频播放器
Android 音视频学习基础--1.8 Android最简单的音频播放器
Android 音视频学习基础--1.9 Android最简单的视频播放器
Android 音视频学习基础--1.10 Android自制简单音视频播放器
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏