7.5 使用AudioTrack播放原始音频

    AudioTrack是Android中的一个类,它允许播放原始音频样本。利用该类能够播放使用AudioRecord捕获的音频,而他们并不能使用mediaPlayer对象来播放。

    为了构造一个AudioTrack对象,需要传入一系列的配置变量来描述待播放的音频。

    第一个参数是流类型。可能的值定义为AudioManager类中的常量。在示例中将使用AudioManager.STREAM_MUSIC,这是用于正常播放音乐的音频流。

    第二个参数是将要播放的音频数据的采样率,以赫兹为单位。在示例中,采用11025Hz的采样率来捕获音频,因此咋播放时需要指定相同的值。

    第三个参数是通道配置。可能的值与构造AudioRecord对象时使用的值相同,他们定义为AudioFormat类中的常量。他们的名称解释了其作用。

    AudioFormat.CHANNEL_CONFIGURATION_MONO   单通道

    AudioFormat.CHANNEL_CONFIGURATION_STEREO 双通道

    AudioFormat.CHANNEL_CONFIGURATION_INVALID 错误的音频通道掩码

    AudioFormat.CHANNEL_CONFIGURATION_DEFAULT 默认通道

    第四个参数是音频格式,可能的值与构造AudioRecord对象时使用的值相同,他们定义为AudioFormat类中的常量。使用的值应匹配待传入的音频的值。

    AudioFormat.ENCODING_DEFAULT

    AudioFormat.ENCODING_INVALID

    AudioFormat.ENCODING_PCM_16BIT

    AudioFormat.ENCODING_PCM_8BIT

    第五个参数是将对象中用于存储音频的缓冲区大小。为了确定使用最小的缓冲区大小,可以调用getMinBufferSize方法,同时传入采样率、通道配置和音频格式。

1     private int frequency=11025;
2     private int channelConfiguration=AudioFormat.CHANNEL_CONFIGURATION_MONO;
3     private int audioEncoding=AudioFormat.ENCODING_PCM_16BIT;

4 private int bufferSize=AudioTrack.getMinBufferSize(frequency, channelConfiguration, audioEncoding)

    最后一个参数是模式。可能的值定义为AudioTrack类中的常量。

    AudioTrack.MODE_STATIC:在播放发生之前将所有的音频数据转移到AudioTrack对象。

    AudioTrack.MODE_STREAM:在播放的同时将音频数据持续的转移到AudioTrack对象。

    下面是AudioTrack配置:

1                 AudioTrack audioRtack=new AudioTrack(AudioManager.STREAM_MUSIC, frequency, channelConfiguration, audioEncoding, bufferSize, AudioTrack.MODE_STREAM);

    一旦构造了AudioTrack,就需要打开音频源,将音频数据读取到缓存中,并将它传递给AudioTrack对象。

    根据一个包含了正确格式(11025Hz、16位、单声道)的原始PCM数据的文件,可以构造DataInputStream。

1                 DataInputStream dis=new DataInputStream(new FileInputStream(recordingFile));

    然后可以调用AudioTrack对象上的play方法,并开始从DataInputStream写入音频。

 1                 audioRtack.play();
 2                 try {
 3                     while(isPlaying&&dis.available()>0){
 4                         int i=0;
 5                         while(dis.available()>0&&i<audiodata.length){
 6                             audiodata[i]=dis.readShort();
 7                             i++;
 8                         }
 9                         audioRtack.write(audiodata, 0, audiodata.length);
10                     }
11                 } catch (IOException e) {
12                     e.printStackTrace();
13                 }
14                 try {
15                     dis.close();
16                 } catch (IOException e) {
17                     e.printStackTrace();
18                 }

     以上内容涵盖了使用AudioTrack播放由AudioRecord录制的音频文件的基本知识。

posted on 2014-09-01 16:02  宁静致远,一览众山小  阅读(4847)  评论(0编辑  收藏  举报

导航