您好我使用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个文件
Chrome会假装新文件的持续时间仅为6秒,而应该是18秒。
可能有一个框架指示文件的结尾?可能吗?如果是,我应该避免写入输出文件? 是否有一个公共帧头来指定实际文件持续时间?
答案 0 :(得分:0)
显然这些文件的比特率不同,所以实际上你创建了一个可变比特率文件,看起来Google Chrome无法正确处理它们。对于没有正确处理可变比特率的MP3播放器来说,这是常见问题。
如果您连接整个文件,这也是安全的。例如,如果你想将文件的后半部分连接到另一个文件,那么你需要解析框架sideinfo并查找字段main_data_begin,如果它是零则可以附加。如果它不为零,则帧的音频数据会在后面开始一帧或多帧,因此您需要使用main_data_begin == 0来查找下一帧。
编辑: 在考虑之后,你根本不想这样做,因为:
MP3文件衰减第一帧,因此编码器在开头用零填充输入(这就是为什么MP3文件在解码后比原始文件略大),因此在连接点会有短暂的静音
每个MP3帧的前半部分在解码过程中与最后一帧的后半部分重叠,因此结束也会引入毛刺。