【问题标题】:AVAudioPlayer refuses to play modified wav fileAVAudioPlayer 拒绝播放修改后的 wav 文件
【发布时间】:2011-12-28 23:25:58
【问题描述】:

我第一次调用此方法时,file1 将为零,file2 将被返回。当这种情况发生时,文件将正常播放(因此调用此方法应该没问题)。但是当我第二次调用它时,它会返回一个NSURL AVAudioPlayer 不会播放。我的猜测是我错过了标题中的某些内容。在调试模式下,我看到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 标头:44 字节或 46 字节。我都试过了。

编辑

我查看了Audio File Services Reference,其中包含很多我可能想要使用的好东西,但我不知道如何使用所有这些。我真的不知道c。希望任何人都可以帮助我解决这个问题。

编辑

在这里可以找到合并的 wav 文件的示例:7--443522512

【问题讨论】:

  • 您是否尝试过在模拟器中运行时将 wav 保存到文件中,然后尝试在其他播放器中播放?
  • @MattiasWadman 这不是一个转贴,因为我试图找到一种方法来解决内存问题,但是这个已经全部修复了,我正试图让 wav玩。好像一样,不一样。我没试过,现在试试。
  • 不,它也不会让我在音乐播放器中播放。知道问题可能是什么吗?
  • 然后使用十六进制编辑器检查 wav 文件,在终端等中运行 file file.wav 并尝试发现任何错误。如果您没有找到任何东西,请发布一个人们可以帮助您检查的合并 wav 文件的示例。

标签: objective-c c avaudioplayer wav


【解决方案1】:

看起来您的 WAV 文件在 data 块之前包含一个损坏的 FLLR 块,或者至少 VLC 认为 FLLR 块超过 2GB,因此它会尝试跳到文件之外的下一个块结束。

也许您应该在合并之前尝试创建没有 FLLR 块的 WAV 文件,kAudioFileFlags_DontPageAlignAudioData 接缝让音频文件服务跳过它。

另一种选择是提取data 块并编写一个新的wav 文件,在这里进行了概念验证:https://gist.github.com/1555889

【讨论】:

  • 您有任何关于如何执行此操作的信息(链接或代码),将不胜感激!
  • 从哪里获得 wav 文件?您是否使用音频文件服务 API 创建它们?
  • 我用 AVAudioRecorder 录制它们(在同一个应用程序中)。
  • 太棒了!该代码就像一个魅力。当第一个文件为空时,我修改为将第二个文件复制到第一个文件,现在它可以正常工作了!!非常感谢^_^
  • 不错!您正在开发什么样的应用程序?
猜你喜欢
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多