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錄制的音頻文件的基本知識。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM