Android AudioTrack AudioRecord

如何使用 AudioTrack,其實跟AudioRecord差不多, 我們做一個比較

新增一個AudioTrack 跟新增一個AudioRecord幾乎一樣


AudioTrack audioTrack = new AudioTrack(
AudioManager.STREAM_MUSIC,
SAMPLE_RATE,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT,
bufferSize,
AudioTrack.MODE_STREAM);

以下是AudioRecord

AudioRecord record = new AudioRecord(
MediaRecorder.AudioSource.DEFAULT,
SAMPLE_RATE,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT,
bufferSize);

AudioTrack多了AudioTrack.MODE_STREAM這個選項。AudioTrack.MODE_STREAM是指串流的資料。AudioTrack.MODE_STATIC是指一次把整個音源檔載入。

兩個類都有bufferSize這個參數。bufferSize 是需要計算的,也可能跟手機的硬體能力有關。所以兩個類都有提供計算的方法。


int bufferSize = AudioRecord.getMinBufferSize(
SAMPLE_RATE,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT);

int bufferSize = AudioTrack.getMinBufferSize(
SAMPLE_RATE,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_16BIT);


這樣我們可以建一個Thread來讓AudioTrack播串流音樂



void playMusic() {
    new Thread(new Runnable() {
    @Override
    public void run() {

        int bufferSize = AudioTrack.getMinBufferSize(
        SAMPLE_RATE,
        AudioFormat.CHANNEL_OUT_MONO,
        AudioFormat.ENCODING_PCM_16BIT);

        if (bufferSize == AudioTrack.ERROR || bufferSize == AudioTrack.ERROR_BAD_VALUE) {
            bufferSize = SAMPLE_RATE * 2;
        }

        AudioTrack audioTrack = new AudioTrack(
                                              AudioManager.STREAM_MUSIC,
                                              SAMPLE_RATE,
                                              AudioFormat.CHANNEL_OUT_MONO,
                                              AudioFormat.ENCODING_PCM_16BIT,
                                              bufferSize,
                                              AudioTrack.MODE_STREAM);

        audioTrack.setStereoVolume(1.0f, 1.0f);

        audioTrack.play();




        while (true) {
           byte[] buffer = packet.getData();//如果資料從udp來
           audioTrack.write(buffer, 0, buffer.length);
        }
        audioTrack.stop();
        audioTrack.release();
    }
}).start();

}

留言

這個網誌中的熱門文章

python 找圖自動點擊

Python pyserial 抓取系統內的 COM PORT

VBA EXCEL 工作表變化 馬上執行 的作法 Worksheet_Change