9

我尝试使用下面的代码连接 2 个 MP3 文件。我有一个新文件,我可以播放前半部分(完整的第一个文件),但后半部分是无声的。新文件的长度是正确的。我做错了什么?

List<Byte[]> files = new List<byte[]>();
var tempfile = File.ReadAllBytes(Path.Combine(path, "1.mp3"));
files.Add(tempfile);
tempfile = File.ReadAllBytes(Path.Combine(path, "2.mp3"));
files.Add(tempfile);
Byte[] a=new Byte[files[0].Length+files[1].Length];
Array.Copy(files[0], a, files[0].Length);
Array.Copy(files[1], a, files[1].Length);

File.WriteAllBytes(Path.Combine(path, "3.mp3") , a);
4

6 回答 6

15

我敢打赌你只听第二首歌。(并且两个文件的长度相同或第一个文件更短)

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

MP3 帧头的详细信息

... 试试这个...

Array.Copy(files[0], 0, a, 0, files[0].Length);
Array.Copy(files[1], 0, a, files[0].Length, files[1].Length);

……或者更好……

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();
}
于 2009-09-21T18:02:30.060 回答
6

简单的:

public static void Combine(string[] mp3Files, string mp3OuputFile)
{
    using (var w = new  BinaryWriter(File.Create(mp3OuputFile)))
    {
        new List<string>(mp3Files).ForEach(f => w.Write(File.ReadAllBytes(f)));
    }
}
于 2015-01-17T22:06:26.943 回答
3

以下是使用NAudio连接 MP3 文件的方法:

public static void Combine(string[] inputFiles, Stream output)
{
    foreach (string file in inputFiles)
    {
        Mp3FileReader reader = new Mp3FileReader(file);
        if ((output.Position == 0) && (reader.Id3v2Tag != null))
        {
            output.Write(reader.Id3v2Tag.RawData,
                         0,
                         reader.Id3v2Tag.RawData.Length);
        }
        Mp3Frame frame;
        while ((frame = reader.ReadNextFrame()) != null)
        {
            output.Write(frame.RawData, 0, frame.RawData.Length);
        }
    }
}

请参阅此处了解更多信息。

于 2010-11-08T18:42:31.233 回答
2

每个 MP3 文件在文件的开头都有一个标题,其中包含歌曲的元数据。至少你必须在第二个文件中删除它。

这是之前的 Stack Overflow 问题,如何使用 C# 合并/加入 MP3 文件?.

这是Read MP3 Tag Information (ID3v1 and ID3v2)的另一个链接,它可能会帮助您删除它。

于 2009-09-21T17:55:36.953 回答
2

这个问题已经在这里这里问过。另请参阅在 C# 中读取 MP3 标头,但不是读取标头,您只想将其剥离,连接其余部分,然后为连接的文件生成一个新标头。

编辑:在进一步阅读之后,如果您只是连接文件而不剥离 ID3 标签,显然没有任何区别。但首先将它们剥离似乎仍然是一个好主意。

于 2009-09-21T18:03:17.000 回答
2

众所周知,Mp3 文件只是一些,您可以将流连接在一起:

public static void Concatenate(params string[] mp3filenames)
{
    Stream w = File.OpenWrite("D:\\out.mp3");

    foreach (string filename in mp3filenames)
        File.OpenRead(filename).CopyTo(w);    

    w.Flush();
    w.Close();
}

并听到用法:

Concatenate("D:\\1.mp3", "D:\\2.mp3");
于 2015-11-28T18:13:52.203 回答