2014-08-27 192 views
1

是否可以同時播放兩個聲音(mp3)文件?我嘗試過使用兩個不同的MediaPlayer對象 -同時播放兩個聲音 - Android

MediaPlayer mediaPlayer; 
MediaPlayer mediaPlayer2; 

要播放聲音,但這不起作用。我無法使用SoundPool,因爲正在使用的聲音文件大約每個10MB(因爲SoundPool對於大於3MB的聲音文件效果不佳)。

下面是一些代碼來熟悉我的情勢

@Override 
public void onResume() { 
    super.onResume(); 
    if(mediaPlayer == null) 
    { 
    mediaPlayer = MediaPlayer.create(getActivity().getApplicationContext(), R.raw.song1); 
    } 
    if(mediaPlayer2 == null) 
    { 
    mediaPlayer2 = MediaPlayer.create(getActivity().getApplicationContext(), R.raw.song2); 
    } 
} 
private void startPlaying() { 
mediaPlayer.setLooping(true); 
mediaPlayer.start(); 
mediaPlayer2.start(); 
} 

有什麼建議?有沒有辦法讓這2個MediaPlayer對象方法起作用?如果沒有,那麼還有什麼其他選擇?代碼會很有幫助!

+0

您想要將它連接在一起還是同時播放這兩個文件。 – 2014-08-27 11:09:23

+0

@james我需要同時播放這兩個文件。 – 2014-08-27 12:09:40

+0

您是否找到答案?我試圖讓這個工作。 – Totem 2017-01-12 16:24:24

回答

1

因此,同時播放兩個音頻文件肯定是一個問題,所以我想,另一種方式來看待這個問題將兩個音頻文件編程合併爲一個,並播放。事實證明,使用WAV文件很容易實現(MP3和其他壓縮格式需要先解壓縮?)。總之,這裏的我是如何做的:

InputStream is = getResources().openRawResource(R.raw.emokylotheme); // Name of file 1 

byte [] bytesTemp2 = fullyReadFileToBytes(new File(
Environment.getExternalStorageDirectory().getAbsolutePath()+ 
"/Kylo Ren/"+filename+"_morphed.wav")); // Name of file 2 

byte [] sample2 = convertInputStreamToByteArray(is); 
byte[] temp2 = bytesTemp2.clone(); 

RandomAccessFile randomAccessFile2 = new RandomAccessFile(new File(
Environment.getExternalStorageDirectory().getAbsolutePath()+ 
"/Kylo Ren/"+filename+"_morphed.wav"), "rw"); 

//seek to skip 44 bytes for WAV formats 
randomAccessFile2.seek(44); 
for (int n = 0; n < bytesTemp2.length; n++) 
{ 
    bytesTemp2[n] = (byte) ((temp2[n] + (sample2[n]))); 
} 

randomAccessFile2.write(bytesTemp2); 
randomAccessFile2.close(); 

,這裏是支持功能:

public byte[] convertInputStreamToByteArray(InputStream inputStream) 
    { 
    byte[] bytes= null; 

    try 
    { 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

    byte data[] = new byte[1024]; 
    int count; 

    while ((count = inputStream.read(data)) != -1) 
    { 
    bos.write(data, 0, count); 
    } 

    bos.flush(); 
    bos.close(); 
    inputStream.close(); 

    bytes = bos.toByteArray(); 
    } 
    catch (IOException e) 
    { 
    e.printStackTrace(); 
    } 
    return bytes; 
    } 


byte[] fullyReadFileToBytes(File f) throws IOException { 
     int size = (int) f.length(); 
     byte bytes[] = new byte[size]; 
     byte tmpBuff[] = new byte[size]; 
     FileInputStream fis= new FileInputStream(f); 
     try { 

      int read = fis.read(bytes, 0, size); 
      if (read < size) { 
       int remain = size - read; 
       while (remain > 0) { 
        read = fis.read(tmpBuff, 0, remain); 
        System.arraycopy(tmpBuff, 0, bytes, size - remain, read); 
        remain -= read; 
       } 
      } 
     } catch (IOException e){ 
      throw e; 
     } finally { 
      fis.close(); 
     } 

     return bytes; 
    } 

在本質上,代碼的作用是:它得到了兩個音頻文件的字節(一個在R.raw的應用程序中,另一個在外部存儲目錄中),總結它們,並將新字節寫入另一個文件。

該代碼的問題是它會產生一些背景噪音。這不是很多,但我相信在某些點(可能是極值?)總結字節會導致噪音。如果有人知道如何解決這個問題,你可以編輯答案並讓我知道。

P.S.這是一個開放源碼的語音轉換應用程序,具有戲劇性的背景噪音效果,叫做Kylo Ren Voice Changer(https://github.com/advaitsaravade/Kylo-Ren-Voice-Changer

+0

@Totem結果沒有任何平均要求。只是總結一些東西。 – 2017-01-14 22:14:54