Xamarin.android Android将双字节数组与音频数据相结合,并播放结果数组

Xamarin.android Android将双字节数组与音频数据相结合,并播放结果数组,xamarin.android,android-mediaplayer,audio-recording,Xamarin.android,Android Mediaplayer,Audio Recording,我有两个字节数组。一个包含背景音乐,第二个包含录制的声音 我如何将它们组合成单个阵列,并使用MediaPlayer播放它们? 我想做下一步: (一) (二) 在这两种情况下,我都接收到未合并的阵列(如果我将其传递给MediaPlayer,则仅播放语音或音乐) 提前谢谢 在这两种情况下,我都接收到未合并的阵列(如果我将其传递给MediaPlayer,则仅播放语音或音乐) 您可以参考以下问题:。正如@Matthew Whited所说: 您正在复制第一首歌曲上的第二首歌曲数据。而且MP3数据是流式传输

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

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

我想做下一步:

(一)

(二)

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

提前谢谢

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

您可以参考以下问题:。正如@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)进行重新编码。

如果我可以访问文件,下面的代码可能会很有用。但在我的例子中,我只有两个数组<代码>数组.Copy(文件[0],0,a,0,文件[0].长度)
Array.Copy(文件[1],0,a,文件[0]。长度,文件[1]。长度)从那篇文章中,我尝试了这个代码,但结果我仍然只收到语音或音乐。有什么想法吗?
byte[] joinedArray = Arrays.CopyOf(array1, array1.Length + array2.Length); 
Array.Copy(array2, 0, joinedArray, array1.Length, array2.Length);
return joinedArray;
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();
}