(iOS) Почему AVAudioPlayer initWithContentsOfURL всегда завершается ошибкой с кодом ошибки = -43 - PullRequest
4 голосов
/ 27 февраля 2012
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 из NSLog(@"songURL = %@", songURL); и вставлю его в safari, плагин Quicktime без проблем воспроизводит файлы, поэтому я знаю, что URL-адреса действительны.Я пытался с .m4a и .mp3 файлами и пытался удалить пробелы из songName, но неважно, что я всегда получаю Ошибка:

Ошибка домена = NSOSStatusErrorDomain Code = -43 "Операция не может быть завершена. (Ошибка OSStatus -43.) ".

Но это просто стандартные .m4a / .mp3 файлы, созданные в iTunes.

Ответы [ 5 ]

4 голосов
/ 07 марта 2012

Очевидно, AVAudioPlayer не поддерживает потоковую передачу. Apple рекомендует AVPlayer для этого, хотя это не так удобно для поиска таких вещей, как текущее время и продолжительность.

1 голос
/ 19 апреля 2013

Ошибка -43 указывает на невозможность найти данные.Это может быть связано с тем, что URL-адрес был на самом деле неверным или сервер не поддерживает потоковую передачу.Вы должны попытаться предварительно загрузить данные песни с объектом 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]);
}
0 голосов
/ 22 февраля 2014

Вы можете попробовать проверить цели в вашем аудиофайле. У меня была похожая проблема, и я исправил ее, убедившись, что флажок моего целевого членства в mp4-файле установлен. Я не должен был проверять это, когда я импортировал файл первоначально.

0 голосов
/ 20 августа 2013

в документации Apple

Экземпляр класса AVAudioPlayer, называемый аудиоплеером, обеспечивает воспроизведение аудиоданных из файла или памяти.

Apple рекомендует использовать этот класс для воспроизведения звука, если вы не воспроизводят звук, захваченный из сетевого потока или требуют очень низкого Задержка ввода / вывода.

0 голосов
/ 27 февраля 2012

У меня вчера была такая же проблема. Оказывается, мой URL был неправильным. У меня было что-то вроде тебя здесь:

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

Но моя songURL была типа NSString. Мой NSLog написал это правильно, но когда я помещаю% d в URL, получается неправильно. Я предлагаю вам попробовать проверить свой URL AVAudioPlayer снова.

попробуйте что-то вроде описанного здесь , чтобы увидеть URL игроков.

...