合并MP3导致错误的持续时间(目标C)

时间:2013-11-27 14:36:46

标签: ios objective-c audio mp3

在合并多个MP3文件后,我的AVAudioPlayer出现了一些奇怪的行为,我一直称之为“[AVAudioPlayer setCurrentTime:anyValueAfter260]”当前时间总是设置为260,这是因为MP3持续时间信息错误。任何人都有一些线索如何更换MP3上的信息,或者我的合作是否有问题 这是我的合并代码:

NSMutableData *original =  original = [[NSMutableData alloc] init];
for (int i=0; i< [self.filesPath count]; i++) {
    NSString *fileName = [self.filesPath objectAtIndex:i];
    NSMutableData *part=[NSMutableData dataWithContentsOfURL:[NSURL fileURLWithPath:fileName]];
    [original appendData:part];
}

if(original!=nil){
    [original writeToURL:[[NSURL alloc] initWithString: self.finalPath ]  atomically:YES];
}

截图的

左侧没有问题合并文件,右侧文件合并错误的持续时间

http://oi44.tinypic.com/9pm07c.jpg

在iTunes上播放时间不正确的MP3

http://oi43.tinypic.com/vcsy2t.jpg

最奇怪的是这个问题不会一直发生,在某些情况下最终文件会显示正确的时间......

1 个答案:

答案 0 :(得分:0)

MP3持续时间不容易确定。如果你知道文件是CBR(恒定比特率),那只需要弄清楚第一个mp3数据帧的大小,然后就是简单的数学:

length of song = length of file
                 ----------------- * 0.028  
                 size of 1st frame

每个MP3帧的播放持续时间为0.028秒。但是如果文件是VBR编码的(可变比特率),那么这个数学就会崩溃。你将拥有“长”帧和“短”帧。确定VBR文件播放长度的唯一方法是扫描整个文件,计算有多少帧,然后重复数学运算:

length of song = number of frames * 0.028 seconds per frame

鉴于您获得了不同的播放长度,您可能会将MP3与不同的比特率和/或VBR编码的文件组合在一起。您获得正确播放时间的情况,可能是CBR文件,每个原始组件文件使用相同的比特率。