【问题标题】:Playing two sounds simultaneously - Android同时播放两种声音 - Android
【发布时间】:2014-10-20 22:19:51
【问题描述】:

是否可以同时播放两个声音 (mp3) 文件?我尝试使用两个不同的 MediaPlayer 对象-

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 对象方法起作用吗?如果没有,那么还有哪些其他选择?代码会很有帮助!

【问题讨论】:

  • 你想把它合并在一起还是同时播放两个文件。
  • @james 我需要同时播放这两个文件。
  • 您找到答案了吗?我正在努力让它发挥作用。
  • @Totem 我做到了。有点。它将两个音频文件组合成一个文件,并使用单个媒体播放器实例播放。唯一的问题是我没有时间完善它。由于两个文件的组合,仍然会产生一些噪音。还需要我发一些代码吗?
  • @Totem 这是一个 + 和 ÷。平均值。我将发布代码作为答案。

标签: android audio merge android-mediaplayer mixing


【解决方案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的应用程序中,另一个在外部存储目录中),将它们相加,然后写入新的字节到另一个文件。

此代码的问题在于它会产生一些背景噪音。这不是很多,但我相信在某些点(可能是极值?)对字节的总和会导致噪音。如果有人知道如何解决此问题,您能否编辑答案并告诉我。

附:这是一个开源的语音转换器应用程序,具有戏剧性的背景噪音效果,称为 Kylo Ren Voice Changer (https://github.com/advaitsaravade/Kylo-Ren-Voice-Changer)

【讨论】:

  • @Totem 证明不需要任何平均。只是总结一下。
  • 为什么将两个文件合二为一会导致同时播放?
【解决方案2】:

我在Service 中使用了两个MediaPlayer 实例。我的代码和你的类似。我遇到了一些问题,但最终解决了。请在这里查看我的答案Unable to play two MediaPlayer at same time in Nexus 5

如果还有问题,请把你的完整代码和logcat错误。

【讨论】:

    【解决方案3】:

    您也可以尝试创建两个片段,每个片段播放一个声音。 如果我播放 mp3 文件,我还有另一个问题,然后单击后退按钮,然后再次开始活动,我可以再次播放相同的文件。您可以同时阅读Android Mediaplayer multiple instances when activity resumes播放声音

    【讨论】:

      猜你喜欢
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 2015-12-31
      相关资源
      最近更新 更多