使用AudioTrack播放PCM音频数据
2012-11-08 10:22
549 查看
MediaPlayer只能对完整的音频文件进行操作,而不能直接对纯PCM音频数据操作。假如我们通过解码得到PCM数据源,又当如何将它们播放?没错,就是用 AudioTrack这个类(MediaPlayer内部也是调用该类进行真正的播放音频流操作)下面这个DEMO演示了如何使用AudioTrack |
MediaPlayer实现的。MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个 MediaPlayer程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。
但是该类只能对完整的音频文件进行操作,而不能直接对纯PCM音频数据操作。假如我们通过解码得到PCM数据源,又当如何将它们播放?没错,就是用 AudioTrack这个类(MediaPlayer内部也是调用该类进行真正的播放音频流操作)下面这个DEMO演示了如何使用AudioTrack
不啰嗦,上图先
2011-5-21 07:04:17 上传
下载附件
(28.48 KB)
以下这个类对AudioTrack做了简单封装:
public class MyAudioTrack { int mFrequency;// 采样率 int mChannel;// 声道 int mSampBit;// 采样精度 AudioTrack mAudioTrack; public MyAudioTrack(int frequency, int channel, int sampbit){ mFrequency = frequency; mChannel = channel; mSampBit = sampbit; } public void init(){ if (mAudioTrack != null){ release(); } // 获得构建对象的最小缓冲区大小 int minBufSize = AudioTrack.getMinBufferSize(mFrequency, mChannel, mSampBit); //STREAM_ALARM:警告声 //STREAM_MUSCI:音乐声,例如music等 //STREAM_RING:铃声 //STREAM_SYSTEM:系统声音 //STREAM_VOCIE_CALL:电话声音 mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, mFrequency,mChannel,mSampBit,minBufSize, AudioTrack.MODE_STREAM); //AudioTrack中有MODE_STATIC和MODE_STREAM两种分类。 //STREAM的意思是由用户在应用程序通过write方式把数据一次一次得写到audiotrack中。 //这个和我们在socket中发送数据一样,应用层从某个地方获取数据, //例如通过编解码得到PCM数据,然后write到audiotrack。 //这种方式的坏处就是总是在JAVA层和Native层交互,效率损失较大。 //而STATIC的意思是一开始创建的时候,就把音频数据放到一个固定的buffer,然后直接传给audiotrack, //后续就不用一次次得write了。AudioTrack会自己播放这个buffer中的数据。 //这种方法对于铃声等内存占用较小,延时要求较高的声音来说很适用。 mAudioTrack.play(); } public void release(){ if (mAudioTrack != null){ mAudioTrack.stop(); mAudioTrack.release(); } } public void playAudioTrack(byte []data, int offset, int length){ if (data == null || data.length == 0){return ;} try { mAudioTrack.write(data, offset, length); } catch (Exception e) { Log.i("MyAudioTrack", "catch exception..."); } } public int getPrimePlaySize(){ int minBufSize = AudioTrack.getMinBufferSize(mFrequency, mChannel, mSampBit); return minBufSize * 2; } }
mAudioTrack.write(data, offset, length);该函数正是将数据写入硬件播放的关键!
相关文章推荐
- Android开发:使用AudioTrack播放PCM音频数据【附源码】
- Android使用AudioRecord录制pcm音频原始数据以及使用AudioTrack播放
- [AudioTrack]使用AudioTrack播放PCM音频数据
- 使用AudioTrack播放PCM音频数据(android)
- 使用AudioTrack播放PCM音频数据(android)
- 使用AudioTrack播放PCM音频数据(android)
- 使用AudioTrack播放PCM音频数据
- Android编程中利用AudioTrack播放PCM数据在音频的最后出现重复回声现象的解决方案
- 【Android 多媒体应用】使用MediaCodec解码使用AudioTrack播放音频数据
- Android音频: 怎样使用AudioTrack播放一个WAV格式文件?
- [置顶] 《android多媒体api》之AudioTrack原始音频pcm播放api
- Virtual Audio Cable使用笔记三:使用Virtual Audio Cable将播放的音频数据传输到录音机程序中
- android中pcm数据的播放(AudioTrack)
- android使用AudioTrack播放多个音频文件
- 使用DirectSound播放PCM音频数据
- 使用AudioRecoder录制,AudioTrack播放PCM音频数据
- 使用audio标签播放音频文件
- AudioTrack如何与AudioFlinger交换音频数据
- 使用AudioTrack和AudioRecord录制和播放PCM wave文件
- 使用Audio Queue Services 播放和录制音频