Инициализация AVAudioPlayer с URL-адресом песни iPod с помощью initWithContentsOfURL

Я знаю, что можно воспроизводить песни iPod с помощью AVPlayer, но я не могу понять, как инициализировать AVAudioPlayer URL-адресом песни iPod с помощью initWithContentsOfURL. Когда я пытаюсь, AVAudioPlayer возвращает NULL при инициализации.

Мне нужно использовать AVAudioPlayer, потому что мне нужно использовать его метод делегата audioPlayerDidFinishPlaying для дальнейшей обработки, когда мое приложение работает в фоновом режиме (т.е. AVAudioPlayer метод делегата audioPlayerDidFinishPlaying вызывается, если приложение работает в фоновом режиме. Но AVPlayer не предоставляет методы делегата , поэтому вы можете использовать только уведомления, которые не работают в фоновом режиме).

Следующий код предназначен для воспроизведения песни iPod с помощью AVPlayer.

- (void)viewDidLoad {

    [super viewDidLoad];
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategoryPlayback error:nil];
    NSError *error = nil;

    [session setActive:YES error:&error];
    MPMediaQuery *query = [MPMediaQuery songsQuery];
    NSArray *collection = [query items];
    MPMediaItem *item = [collection objectAtIndex:0];
    NSLog(@"%@",[item valueForProperty:MPMediaItemPropertyTitle]);
    NSURL *url = [item valueForProperty:MPMediaItemPropertyAssetURL];
    AVPlayer *player = [[AVPlayer alloc]initWithURL:url];   // <-- Line to Replace
    [player play];
}

Это прекрасно работает. Но если я заменю предпоследнюю строку следующим:

    AVAudioPlayer *player = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];

вызов initWithContentsOfURL возвращает NULL.

Есть ли какие-либо мысли о том, почему это возвращает NULL, когда я использую AVAudioPlayer, но возвращает инициализированный проигрыватель, когда я использую AVPlayer?

Согласно техническим вопросам и ответам http://developer.apple.com/library/ios/#qa/qa1634/_index.html, «URL-адрес, используемый с initWithContentsOfURL: должен быть URL-адресом файла (file: //). То есть локальным путем».

Когда я получаю URL-адрес песни в моей библиотеке iPod, путь следующий:

ipod-библиотека: //item/item.mp3? id = -4017276016911605928

Вы бы сказали, что этот путь к моей библиотеке iPod не считается «локальным путем», или вы считаете ошибкой, что initWithContentsOfURL возвращает NULL?

Кто-нибудь думает?


person JeffB6688    schedule 31.12.2011    source источник
comment
какое решение для этого? я делаю то же самое в Swift, но не повезло. . не могли бы вы рассказать, как сделать указанный выше URL-адрес локальным   -  person Usama Sadiq    schedule 29.07.2015
comment
@UsamaSadiq Извините, но, как вы можете видеть из ответа ниже, похоже, что решения нет (по крайней мере, такого, который не работает для меня).   -  person JeffB6688    schedule 31.07.2015


Ответы (1)


Вы как бы ответили на свой вопрос, потому что из того, что я могу понять, для AVAudioPlayer важен URL-путь, и он должен быть локальным для пакета. Есть пример использования AVPlayer с уведомлениями, ищите AVPlayerDemo для playerItemDidReachEnd, но я не могу сказать, работает ли он в фоновом или переднем плане.

person macasas    schedule 22.02.2012
comment
хорошо спасибо. Я не знал, что путь URL-адреса должен быть локальным для пакета. Хорошо знать. К сожалению, уведомления от AVPlayer не отображаются, когда приложение находится в фоновом режиме, пока оно не вернется на передний план, так что это не поможет. - person JeffB6688; 27.02.2012
comment
Думаю неоднозначно, значит локальные в комплекте или на устройстве. AVAudioPlayer initWithContentsOfURL с URL-адресом ipod-библиотеки, похоже, нормально работает в iOS 6 и 7, но я не вижу официальной документации или объяснения этого изменения. - person arlomedia; 16.12.2013