2012-10-02 42 views
3

我正在嘗試開發一種使用一些聲音並將它們混合在一起以創建音樂作品的Android應用程序。在開始時,我試着只是在同一時間再現聲音,但當我這樣做時,他們會變得不同步,在幾個小時的閱讀論壇後,我意識到在循環模式下同時再現多種聲音的最佳方式就是將音頻文件合併爲一個文件,然後將它們作爲單個文件複製。Android:如何混合2個音頻文件並用soundPool重現它們

這裏是我使用的代碼:

 //Oppening file 1 
     InputStream is = getAssets().open("sounds/sound_1.ogg"); 
     int size = is.available(); 
     byte[] buffer = new byte[size]; 
     is.read(buffer); 
     is.close(); 
     //End Oppening file 1 

     //Oppening file 2 
     InputStream is_2 = getAssets().open("sounds/sound_2.ogg"); 
     int size_2 = is_2.available(); 
     byte[] buffer_2 = new byte[size_2]; 
     is_2.read(buffer_2); 
     is_2.close(); 
     //End Oppening file 2 

     //Get Bigger size and Merge Files 
     int total_size =0; 

     byte[] buffer_final; 
     if(buffer.length>buffer_2.length){ 
      total_size = buffer_2.length; 
     }else{ 
      total_size = buffer.length-1; 
     } 

     buffer_final= new byte[total_size]; 

     for(int i=30; i<total_size-30;i++){ 


      float a =buffer[i]; 
      float b =buffer_2[i]; 
      float c = (a+b)/2; 
      buffer_final[i]=(byte) c;  

     } 

     FileOutputStream fos = new FileOutputStream(f);   
     fos.write(buffer_final); 
     fos.close(); 

而在此之後,使用的Soundpool我讀生成的文件,並嘗試重現它。

如果我使用這個公式而不合並文件(所以,只使用一個聲音,創建一個新文件,然後閱讀它,它完美的工作,所以我認爲問題是在文件合併,這可能是不是那麼容易,因爲只需添加字節在一起,然後除以2

劃分這樣做後,日誌告訴我:。

無法加載樣本(空)

而且OFC,當我嘗試重現日誌說樣本沒有準備好。

對此有任何幫助嗎?我一直在谷歌它幾個星期,我無法解決它...

這是我第一次編程Android和音頻,所以我有點失落。

問題是,我怎麼能混合這聽起來?我以正確的方式做這件事?哪裏有問題?

感謝您的閱讀和幫助:)

+0

非常好格式化的第一篇文章!一個清晰而簡潔的問題。做得好。 – davehale23

回答

1

如果您使用的原始PCM數據,場均的樣本將正常工作。你需要做的是首先將OGG文件轉換成PCM緩衝區。如果您希望將輸出保留爲OGG,那麼在完成後您需要將其轉換回來。

我的經驗主要是使用MP3庫而不是OGG,但我聽到關於JOrbis的好消息。

+0

其實我不在乎格式(它可以是.mp3,wav,ogg,...)anythig。最主要的是嘗試混合兩種聲音,並能夠在循環中再現最終結果。 那麼,哪種方法是最好的呢? 謝謝! – TurboTi

+0

好吧,不管它是什麼格式,你都需要得到原始(PCM)的聲音。有些格式比其他格式更容易。例如,WAV主要是PCM和一些標題信息,因此從中獲取原始數據並不是什麼問題。一些(MP3,OGG等)是壓縮/編碼的,因此您需要一個庫將它們轉換爲原始音頻。 – Geobits

+0

在緩衝區中有* raw *音頻後,您可以像嘗試一樣添加/分割它們。不過,如果你想讓它在大多數球員身上發揮,你必須對結果進行一些恢復。 – Geobits

0

這樣

soundPool = new SoundPool(NUM_SOUNDS, AudioManager.STREAM_MUSIC, 0); 

NUM_SOUNDS是多少聲音的Soundpool可以togheter玩。