当前位置: 代码迷 >> Android >> 安卓播发pcm数据
  详细解决方案

安卓播发pcm数据

热度:24   发布时间:2016-04-28 05:03:10.0
安卓播发pcm数据 - Android
当前位置: 代码迷 » Android » 安卓播发pcm数据

安卓播发pcm数据

www.MyException.Cn,网友分享于:2014-06-30   浏览:2次
安卓播放pcm数据
Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的。MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaPlayer程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。
但是该类只能对完整的音频文件进行操作,而不能直接对纯PCM音频数据操作。假如我们通过解码得到PCM数据源,又当如何将它们播放?没错,就是用AudioTrack这个类(MediaPlayer内部也是调用该类进行真正的播放音频流操作)下面这个DEMO演示了如何使用AudioTrack
不啰嗦,上图先
以下这个类对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) {                        // TODO: handle exception                        Log.i("MyAudioTrack", "catch exception...");                }        }                public int getPrimePlaySize(){                int minBufSize = AudioTrack.getMinBufferSize(mFrequency,                                 mChannel,                                mSampBit);                                return minBufSize * 2;        }}

mAudioTrack.write(data, offset, length);该函数正是将数据写入硬件播放的关键!
  相关解决方案