连接Mp3文件到一个:Chrome问题

本文关键字:一个 Chrome 问题 Mp3 文件 连接 | 更新日期: 2023-09-27 17:54:49

嗨,我使用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秒。

可能有一个帧表示文件结束?这可能吗?如果是,我应该避免哪一帧写入输出文件?是否有一个通用的帧头来指定实际的文件持续时间?

连接Mp3文件到一个:Chrome问题

显然文件有不同的比特率,所以实际上你正在创建一个可变比特率文件,它看起来像谷歌浏览器不能正确处理它们。这是MP3播放器不能正确处理可变比特率的常见问题。

也只有在连接整个文件时才安全。例如,如果您想将文件的后半部分连接到另一部分,那么您需要解析帧侧信息并查找字段main_data_begin,如果它为零,则可以追加。如果它不为零,则该帧的音频数据开始于一帧或多帧之后,因此您需要使用main_data_begin == 0查找下一帧。

编辑:仔细考虑后,您根本不想这样做,因为:

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

  2. 在解码过程中,每个MP3帧的前半部分与最后一帧的后半部分重叠,因此连接也会引入故障。