在Android中混合麦克风和外部mp3的输入

在Android中混合麦克风和外部mp3的输入,android,audio,android-audiorecord,Android,Audio,Android Audiorecord,我昨天刚开始学习android应用程序开发,我想知道如何解决一个非常重要的问题。我试图创建的是一种迷你卡拉OK播放器,它允许用户在背景歌曲外部mp3文件旁边录制歌曲麦克风源。另一个功能是让用户在唱歌时听到自己的声音——一种近乎实时的反馈。最后,录制的歌曲应与背景曲目混合并存储在一个文件中。为了避免魔鬼般的反馈,假设用户在耳机上收听背景曲目和自己 到目前为止,我能够完成的是让用户使用MediaRecorder.AudioSource.MIC录制:AudioRecord,并将读取的缓冲区直接发送到以

我昨天刚开始学习android应用程序开发,我想知道如何解决一个非常重要的问题。我试图创建的是一种迷你卡拉OK播放器,它允许用户在背景歌曲外部mp3文件旁边录制歌曲麦克风源。另一个功能是让用户在唱歌时听到自己的声音——一种近乎实时的反馈。最后,录制的歌曲应与背景曲目混合并存储在一个文件中。为了避免魔鬼般的反馈,假设用户在耳机上收听背景曲目和自己

到目前为止,我能够完成的是让用户使用MediaRecorder.AudioSource.MIC录制:AudioRecord,并将读取的缓冲区直接发送到以下实例中: 带有AudioTrack.MODE_流的AudioTrack。我还将缓冲区持久化到一个文件,从而生成一个原始PCM文件

它基本上是这样的:

    this.isPlaying = true;
    this.record = new AudioRecord(MediaRecorder.AudioSource.MIC,
                SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO,
                AudioFormat.ENCODING_PCM_16BIT, this.bufferSize);

    this.track = new AudioTrack(AudioManager.STREAM_SYSTEM,
                SAMPLE_RATE, AudioFormat.CHANNEL_OUT_STEREO,
                AudioFormat.ENCODING_PCM_16BIT, this.bufferSize,
                AudioTrack.MODE_STREAM);

        //..Some customizations with this.track, etc...


    FileOutputStream fout = new FileOutputStream(audiofile.getPath());

    this.record.startRecording();
    this.track.play();

    while (isPlaying) {

        this.record.read(buffer, 0, this.bufferSize);
        fout.write(buffer);
        this.track.write(buffer, 0, buffer.length);
    }

    fout.close();

该方法在单独的线程中运行,到目前为止一切都很好。我很难弄明白的是,播放一个单独的背景曲目,并将它们混合到一个流中。我知道,当两个原始数据是相似的通道、采样频率等时,混音只是相加和直接的。因此,一个可能的解决方案可能是将MP3文件转换为具有相同功能的原始PCM,在单独的音频曲目中播放,然后将其混音。但我怀疑这里有一些可怕的同步问题,因为涉及到大量的延迟。我甚至不确定这是否是正确的前进方向。有更简单、更优雅的解决方案吗?您建议哪些android库执行转换?

github然后搜索音频混合器Just audio mixer没有帮助,因为我想在android中执行此操作。相反,我之前搜索过android音频,但它对我帮助不大——结果太多,而且对这个问题也不是很具体。您是否寻找过android编解码器的实现,以便与AudioRecord一起使用,您可以向编解码器提供两个频道,并让编码操作合并它们?我没有这样做,所以不知道它是否工作,但已经看到了低级别的编解码器代码,似乎可以允许这种类型的操作。