C#:将mp3文件叠加到另一个文件

本文关键字:文件 叠加 另一个 mp3 | 更新日期: 2023-09-27 18:31:24

我仅使用以下代码将 3 个 mp3 文件合并为一个 mp3 文件

using (var fs = File.OpenWrite(Path.Combine(txtOutputFile.Text, "new.mp3")))
            {
                var buffer = File.ReadAllBytes(Path.Combine(txtIntroLoc.Text, fileName1));
                fs.Write(buffer, 0, buffer.Length);
                buffer = File.ReadAllBytes(Path.Combine(txtOutroloc.Text, fileName2));
                fs.Write(buffer, 0, buffer.Length);
                buffer = File.ReadAllBytes(Path.Combine(txtFileThree.Text, fileName3));
                fs.Write(buffer, 0, buffer.Length);
                fs.Flush();
            }

我想要的是覆盖另一个mp3文件,该文件将在这个新创建的mp3文件的后台播放。我知道这是可能的,但没有找到正确的方法来实现这一目标。任何帮助都会很棒。谢谢

C#:将mp3文件叠加到另一个文件

关于"覆盖"的问题:

如果不将原件解码为 PCM,混合在您的叠加层中,然后将整个内容重新编码为 MP3,就无法做到这一点。

在现有代码上:

您几乎可以像这样连接MP3文件。通常,尽管我建议放弃ID3标签,而只制作一个包含每个文件中的MP3帧的文件。如果您使用的是NAudio,则可以在Mp3FileReader上使用ReadNextFrame()方法来获取每个MP3帧并将其RawBytes写到文件中。

为了获得最佳效果,您希望所有 MP3 文件使用相同的采样率和通道数。此外,如果这些是 VBR,您将使 XING 或 VBRI 标头中的信息无效,因此最好也放弃它们。

最后我找到了解决方案。使用NAudio我们可以混合 wav 流,因此首先将 mp3 转换为 wav,然后混合 wav 文件,然后使用 lame.exe 将生成的 wav 文件重新转换为 mp3 .

MP3转换为WAV可以使用以下代码段使用NAudio库执行,这要归功于Mark Heath。

string file = "new.mp3";
            Mp3FileReader readers = new Mp3FileReader(file);
            WaveFormat targetFormat = new WaveFormat();
            WaveStream convertedStream = new WaveFormatConversionStream(targetFormat, readers);
            WaveFileWriter.CreateWaveFile("firstwav.wav", convertedStream);

现在可以使用使用此代码使用 NAudio 类来执行它与另一个 wav 文件混合。

string[] inputFiles = new string[2];
            Stream output = new MemoryStream();
            inputFiles[0] = "firstwav.wav";
            inputFiles[1] = "secondwav.wav";
mixWAVFiles(inputFiles);

mixWAVFiles方法

public void mixWAVFiles(string[] inputFiles)
        {
            int count = inputFiles.GetLength(0);
            WaveMixerStream32 mixer = new WaveMixerStream32();
            WaveFileReader[] reader = new WaveFileReader[count];
            WaveChannel32[] channelSteam = new WaveChannel32[count];
            mixer.AutoStop = true;
            for (int i = 0; i < count; i++)
            {
                reader[i] = new WaveFileReader(inputFiles[i]);
                channelSteam[i] = new WaveChannel32(reader[i]);
                mixer.AddInputStream(channelSteam[i]);
            }
            mixer.Position = 0;
            WaveFileWriter.CreateWaveFile("mixedWavFile.wav", mixer);
        }

现在终于使用 跛脚将 finalwav 文件转换为 mp3.exe在这里找到

public void convertWAVtoMP3(string wavfile)
        {
            //string lameEXE = @"C:'Users'Jibran'Desktop'MP3 Merger'bin'Debug'lame.exe";
            string lameEXE = Path.GetDirectoryName(Application.ExecutablePath) +"/lame.exe";
            string lameArgs = "-V2";
            string wavFile = wavfile;
            string mp3File = "mixed.mp3";
            Process process = new Process();
            process.StartInfo = new ProcessStartInfo();
            process.StartInfo.FileName = lameEXE;
            process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            process.StartInfo.Arguments = string.Format(
                "{0} {1} {2}",
                lameArgs,
                wavFile,
                mp3File);
            process.Start();
            process.WaitForExit();
            int exitCode = process.ExitCode;
}