2011-05-30 42 views
9

我需要流式傳輸運行時生成的PCM數據。所以我有一個循環線程流媒體模式下的AudioTrack MODE_STREAMING

public void run() { 
    while(...) { 
    mAudioTrack.write(getPCM(), ...); 
    } 
} 

不幸的是,這是行不通的。它似乎不依賴於AudioTrack緩衝區大小。我想這是非常小的,以模擬類的低延遲特性(150毫秒),使用戶可以dinamically更改)由getPCM(選擇了PCM

int bufferSize = 0.150 * sampleRate * channels * bitsPerSample/8; 

不過,我試圖增加緩衝區的大小可達100K沒有結果

回答

13

這裏是爲我的作品簡單的例子:

public class Internal extends Activity 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main);    
    } 

    public void onPlayClicked(View v) 
    { 
     start();  
    } 

    public void onStopClicked(View v) 
    { 
     stop(); 
    } 

    boolean m_stop = false; 
    AudioTrack m_audioTrack; 
    Thread m_noiseThread; 

    Runnable m_noiseGenerator = new Runnable() 
    {  
     public void run() 
     { 
      Thread.currentThread().setPriority(Thread.MIN_PRIORITY); 

      /* 8000 bytes per second, 1000 bytes = 125 ms */ 
      byte [] noiseData = new byte[1000]; 
      Random rnd = new Random(); 

      while(!m_stop) 
      {   
       rnd.nextBytes(noiseData); 
       m_audioTrack.write(noiseData, 0, noiseData.length);     
      } 
     } 
    }; 

    void start() 
    { 
     m_stop = false; 

     /* 8000 bytes per second*/ 
     m_audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_OUT_MONO, 
             AudioFormat.ENCODING_PCM_8BIT, 8000 /* 1 second buffer */, 
             AudioTrack.MODE_STREAM);    

     m_audioTrack.play();   


     m_noiseThread = new Thread(m_noiseGenerator); 
     m_noiseThread.start(); 
    } 

    void stop() 
    { 
     m_stop = true;   
     m_audioTrack.stop(); 
    } 
} 
+0

不知道你的意思。我聽不到任何東西 – Raffaele 2011-05-30 18:41:52

+0

這段代碼適用於兩種設備(兩種都是三星)。檢查你的LogCat日誌,它應該打印關於'AudioTrack'的所有細節。 – inazaruk 2011-05-30 18:43:44

+0

當然,我必須在創建活動時添加一個調用start()。然後這是一個神祕的它不適用於實際的PCM數據。現在我要用一臺機器生成的A 440hz聲音進行測試 – Raffaele 2011-05-30 19:12:24