我第一次调用此方法时,file1
将为 nil,file2
将被返回。当发生这种情况时,文件将正常播放(因此调用此方法应该没问题)。但是当我第二次调用它时,它将返回一个 AVAudioPlayer 不播放的 NSURL
。我的猜测是我在标题中遗漏了一些东西。在 Debug模式下,我看到 totalLength
正好与数据的长度一样长。
+(NSURL *)mergeFile1:(NSURL *)file1 withFile2:(NSURL *)file2 {
if(file1 == nil) {
return [file2 copy];
}
NSData * wav1Data = [NSData dataWithContentsOfURL:file1];
NSData * wav2Data = [NSData dataWithContentsOfURL:file2];
int wav1DataSize = [wav1Data length] - 46;
int wav2DataSize = [wav2Data length] - 46;
if (wav1DataSize <= 0 || wav2DataSize <= 0) {
return nil;
}
NSMutableData * soundFileData = [NSMutableData dataWithData:[wav1Data subdataWithRange:NSMakeRange(0, 46)]];
[soundFileData appendData:[wav1Data subdataWithRange:NSMakeRange(46, wav1DataSize)]];
[soundFileData appendData:[wav2Data subdataWithRange:NSMakeRange(46, wav2DataSize)]];
unsigned int totalLength = [soundFileData length];
NSLog(@"Calculated: %d - Real: %d", totalLength, [soundFileData length]);
[soundFileData replaceBytesInRange:NSMakeRange(4, 4)
withBytes:&(UInt32){NSSwapHostIntToLittle(totalLength-8)}];
[soundFileData replaceBytesInRange:NSMakeRange(42, 4)
withBytes:&(UInt32){NSSwapHostIntToLittle(totalLength)}];
[soundFileData writeToURL:file1 atomically:YES];
return [file1 copy];
}
如果有人看到可以提供帮助的东西,将不胜感激! 任何问题都会尽快得到解答。
编辑
我知道有 2 种 wav header :44 字节或 46 字节。我都试过了。
编辑
我看过 Audio File Services Reference其中包含很多我可能想使用的好东西,但我不知道如何使用所有这些。我真的不了解c。希望有人能帮我解决这个问题。
编辑
可在此处找到合并的 wav 文件示例:7--443522512
最佳答案
看起来你的 WAV 文件在 data
block 之前包含一个损坏的 FLLR
block ,或者至少 VLC 认为 FLLR
block 超过 2GB大,因此它会尝试跳到文件末尾之外的下一个 block 。
也许你应该在合并之前尝试创建没有 FLLR
block 的 WAV 文件,kAudioFileFlags_DontPageAlignAudioData
接缝使音频文件服务跳过它。
另一种选择是提取data
block 并编写一个新的wav 文件,在这里进行了概念验证:https://gist.github.com/1555889
关于objective-c - AVAudioPlayer 拒绝播放修改后的 wav 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8662427/