(iOS)为什么AVAudioPlayer initWithContentsOfURL总是失败,错误代码= -43

时间:2012-02-27 09:32:33

标签: objective-c ios avaudioplayer

NSString *songNameEscaped = [songName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];    
NSURL *songURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", @"http://somerootpath/Music/", songNameEscaped]];

NSLog(@"songURL = %@", songURL);
NSError *avPlayerError = nil;

AVAudioPlayer *avPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:songURL error:&avPlayerError];
if (avPlayerError)
{
    NSLog(@"Error: %@", [avPlayerError description]);
}
else
{
    [avPlayer play];
}

如果我从NSLog(@"songURL = %@", songURL);复制NSLog输出并将其粘贴到safari中,Quicktime插件播放文件没问题,所以我知道这些URL是有效的。我尝试使用.m4a.mp3文件并试图从songName中删除空格,但不管我总是得到什么错误:

  

错误域= NSOSStatusErrorDomain代码= -43“无法完成操作。(OSStatus错误-43。)”。

但它们只是在iTunes中创建的标准.m4a / .mp3个文件。

5 个答案:

答案 0 :(得分:4)

显然AVAudioPlayer不支持流式传输。 Apple建议使用AVPlayer,尽管它不像查找当前时间和持续时间那样方便。

答案 1 :(得分:1)

错误-43表示无法找到数据。这可能是因为网址实际上格式不正确,或者因为服务器不支持流式传输。您应该尝试使用NSData对象预加载歌曲数据。

NSString *songNameEscaped = [songName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];    
NSURL *songURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", @"http://somerootpath/Music/", songNameEscaped]];

NSLog(@"songURL = %@", songURL);
NSError *avPlayerError = nil;
NSData* songData = [NSData dataWithContentsOfURL:songURL error:&avPlayerError];
if (songData)
{
    AVAudioPlayer *avPlayer = [[AVAudioPlayer alloc] initWithData error:&avPlayerError];
    if (avPlayer)
    {
        [avPlayer prepareToPlay];
        [avPlayer play];
    }
    else
    {
        NSLog(@"Error initializing data for AVAudioPlayer.  Possibly an Unsupported Format");
        NSLog(@"Error: %@", [avPlayerError description]);
    }
}
else
{
    NSLog(@"Error initializing data for AVAudioPlayer.  Possibly Malformed URL");
    NSLog(@"Error: %@", [avPlayerError description]);
}

答案 2 :(得分:0)

昨天我遇到了同样的问题。结果我的网址错了。 我在这里有类似的东西:

NSURL *songURLID = [NSURL URLWithString:[NSString stringWithFormat:@"%@%d", @"http://somerootpath/Music/", songNameEscaped]];
NSLog(@"songURL = **%d**", songURL**ID**);

但是,我的songURL是NSString类型。我的NSLog正确地写了它,但是当我把%d放在url中时,结果是错误的。我建议你再试一次检查你的AVAudioPlayer网址。

尝试使用描述here之类的内容来查看玩家网址。

答案 3 :(得分:0)

您可能想尝试检查音频文件中的目标。我有一个类似的问题并通过确保我的mp4文件目标成员资格复选框被选中来修复它。我最初导入文件时一定不能检查它。

答案 4 :(得分:-1)

Apple文档中的

  

AVAudioPlayer类的一个实例,称为音频播放器,   提供文件或内存中音频数据的播放。

     

Apple建议您使用此课程进行音频播放,除非您   正在播放从网络流捕获的音频或需要非常低的音频   I / O延迟。