objective-c - AVAudioPlayer 拒绝播放修改后的 wav 文件

标签 objective-c c avaudioplayer wav

我第一次调用此方法时,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/

相关文章:

c - 求最小值没有指针的多个矩阵中的值

swift - 将音频通话扬声器转换为麦克风

iphone - AVAudioPlayer 在 iPhone 上非常安静,但在 iPod touch 上声音足够大

ios - 使用类作为静态 AVAudioPlayer 的 AVAudioPlayerDelegate

ios - 当我使用 PFQueryTableViewController 子类时出现 Parse.com 错误 'Method not allowed when Pinning is enabled.'

iOS 核心蓝牙 :Sending data from central and getting response from peripheral

c - 仅在第 6 个位置将循环值减 2

iphone - iphone 的 UIScrollView 捕捉到它不应该的边界

ios - 在 Objective C 中缩小类型 UIView

c - 非阻塞 pasv sock 和阻塞连接(主动)套接字