我已经将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文件。我知道它可能但是没有正确的方法来实现这一目标。任何帮助都会很棒。 感谢
答案 0 :(得分:1)
关于“覆盖”的问题:
如果不将原件解码为PCM,在叠加层中混合,然后将整个内容重新编码为MP3,则无法做到这一点。
在您现有的代码上:
你可以像这样连接MP3文件。通常虽然我建议放弃ID3标签,然后只制作一个包含每个文件的MP3帧的文件。如果您正在使用NAudio,那么您可以使用Mp3FileReader上的ReadNextFrame()
方法获取每个MP3帧并将其RawBytes
写入文件。
为获得最佳效果,您希望所有MP3文件使用相同的采样率和通道数。此外,如果这些是VBR,您将使XING or VBRI headers中的信息无效,因此最好也放弃这些信息。
答案 1 :(得分:1)
最后我找到了解决方案。使用NAudio
我们可以混合wav流,首先将mp3转换为wav,然后混合wav文件,然后使用lame.exe
将生成的wav文件转换为mp3。
借助Mark Heath,可以使用NAudio库使用以下代码执行将MP3转换为WAV。
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);
}
现在终于使用找到here
的lame.exe将finalwav文件转换为mp3public 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;
}