美文网首页
2024-01-05 AVAudioPlayer无法加载音频文件

2024-01-05 AVAudioPlayer无法加载音频文件

作者: 我是小胡胡123 | 来源:发表于2024-01-04 15:08 被阅读0次

Initialization error: The operation couldn’t be completed. (OSStatus error 1685348671.)

问题代码:

- (void)playAvPlayer:(NSString *)localPath {
 
    NSURL *url = [NSURL fileURLWithPath:localPath];
    NSError *error = nil;
    self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
    if (error) {
        NSLog(@"Initialization error: %@", error.localizedDescription);
    }
    self.player.delegate = self;
    [self.player prepareToPlay];
    [self.player play];
}

无法成功创建player

报错内容如下:

  Problem scanning for packets
  MPEGAudioFile::OpenFromDataSource failed
 OpenFromDataSource failed
  Open failed
 Initialization error: The operation couldn’t be completed. (OSStatus error 1685348671.)

问题排查:

从server下载的音频文件没有后缀,
app下载逻辑是如果没有后缀,添加mp3作文文件名后缀保存到本地。
但是如果音频本来是wav格式的,保存文件名为mp3作为后缀,就打不开。

只有正确的文件名后缀,才可以正常播放。

那么怎么知道下载的音频文件是mp3格式还是wav格式?

通过

[request setHTTPMethod:@"HEAD"];

这样就可以快速获取响应头。无需等文件下载。

通过url获取生成本地文件名,下载前判断如果本地文件存在,不下载,如果不存在则下载。
则是需要同步的直接的就可以通过url获取文件名。通过先取head头部得到文件格式的方式效率不高。

最后解决方法:

    NSURL *url = [NSURL fileURLWithPath:localPath];
    NSError *error = nil;
    NSData *data = [NSData dataWithContentsOfURL:url];
    
    AVAudioFile *audioFile = [[AVAudioFile alloc] initForReading:url error:nil];
    self.player=[[AVAudioPlayer alloc] initWithData:data error:&error];
    if (error) {
        NSLog(@"Initialization error: %@", error.localizedDescription);
    }
    self.player.delegate = self;
    [self.player prepareToPlay];
    [self.player play];

ok,可以了音频文件可以播放,即使wav保存mp3文件名后缀也没问题。

相关文章

网友评论

      本文标题:2024-01-05 AVAudioPlayer无法加载音频文件

      本文链接:https://www.haomeiwen.com/subject/slkbndtx.html