将Mp3文件连接成一个:Chrome问题

时间:2014-03-28 05:15:52

标签: c# google-chrome mp3 concatenation

您好我使用NAudio和这段代码将多个mp3文件连接在一起。

            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);
            }

问题是当我在谷歌浏览器中读取输出文件时(IE或Firefox没有问题), Chrome似乎用连接的第一个mp3文件确定文件的总持续时间。就像我有3个文件

  • 1.mp3(6秒长)
  • 2.mp3(8秒长)
  • 3.mp3(4秒长)
  • output.mp3(18秒长)

Chrome会假装新文件的持续时间仅为6秒,而应该是18秒。

可能有一个框架指示文件的结尾?可能吗?如果是,我应该避免写入输出文件? 是否有一个公共帧头来指定实际文件持续时间?

1 个答案:

答案 0 :(得分:0)

显然这些文件的比特率不同,所以实际上你创建了一个可变比特率文件,看起来Google Chrome无法正确处理它们。对于没有正确处理可变比特率的MP3播放器来说,这是常见问题。

如果您连接整个文件,这也是安全的。例如,如果你想将文件的后半部分连接到另一个文件,那么你需要解析框架sideinfo并查找字段main_data_begin,如果它是零则可以附加。如果它不为零,则帧的音频数据会在后面开始一帧或多帧,因此您需要使用main_data_begin == 0来查找下一帧。

编辑: 在考虑之后,你根本不想这样做,因为:

  1. MP3文件衰减第一帧,因此编码器在开头用零填充输入(这就是为什么MP3文件在解码后比原始文件略大),因此在连接点会有短暂的静音

  2. 每个MP3帧的前半部分在解码过程中与最后一帧的后半部分重叠,因此结束也会引入毛刺。