Инициализация AVAudioPlayer с помощью URL-адреса песни iPod с помощью initWithContentsOfURL - PullRequest
2 голосов
/ 01 января 2012

Я знаю, что можно воспроизводить песни 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, путь:

ставка библиотека: //item/item.mp3 ID = -4017276016911605928

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

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

1 Ответ

1 голос
/ 22 февраля 2012

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

...