gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:03:48 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com