Xamarin.Android将两个字节数组与audiodata结合并播放结果数组

时间:2018-02-19 14:20:58

标签: xamarin.android android-mediaplayer audio-recording

我有两个字节数组。一个包含背景音乐,第二个包含录制的声音。

我如何将它们组合成单个数组并使用MediaPlayer播放?

我试着做下一个:

1)

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
if (array1 != null && array1 != 0) 
outputStream.Write(array1); 
if (array2 != null && array2 != 0) 
outputStream.Write(array2); 
return outputStream.ToByteArray();

2)

byte[] joinedArray = Arrays.CopyOf(array1, array1.Length + array2.Length); 
Array.Copy(array2, 0, joinedArray, array1.Length, array2.Length);
return joinedArray;

在这两种情况下,我都没有收到合并的数组(如果我将其传递给MediaPlayer,则仅播放语音或仅播放音乐。)

提前致谢。

1 个答案:

答案 0 :(得分:1)

  

在这两种情况下,我都没有收到合并的数组(如果我将其传递给MediaPlayer,则仅播放语音或仅播放音乐)

您可以参考这个问题:C# : concatenate 2 MP3 files。正如@Matthew Whited所说:

  

您正在复制第一首歌曲数据。并且MP3数据是流式的,因此您可以将文件相互附加而不必担心比特率(虽然它们可能会出现故障)比特率应该自动调整。

尝试使用以下代码:

using (var fs = File.OpenWrite(Path.Combine(path, "3.mp3")))
{
    var buffer = File.ReadAllBytes(Path.Combine(path, "1.mp3"));
    fs.Write(buffer, 0, buffer.Length);
    buffer = File.ReadAllBytes(Path.Combine(path, "2.mp3"));
    fs.Write(buffer, 0, buffer.Length);
    fs.Flush();
}

更新

考虑.mp3个文件的两种情况:

  • 采样频率和通道数相同的文件

在这种情况下,我们可以将第二个文件附加到第一个文件的末尾。这可以使用Android上提供的文件类来实现。

  • 采样频率或频道数不同的文件。

在这种情况下,必须重新编码其中一个剪辑,以确保两个文件具有相同的采样频率和通道数。要做到这一点,我们需要解码MP3,获取PCM样本,处理它以改变采样频率,然后重新编码为MP3。

Android没有转码或重新编码API。一种选择是通过JNI使用像lame / FFMPEG这样的外部库进行重新编码。