Использование AVAudioPlayer аналогично проекту Apple avTouch

Я пытаюсь воспроизвести некоторые функции avTouch от Apple, но не могу заставить AVAudioPlayer воспроизвести трек.

Он регистрирует Could not play (null). (null) представляет AVAudioplayer player.url. Однако, когда я регистрирую player.url, он возвращается правильно. Я также проверил URL-адрес потока (это из soundcloud).

Я сделал только два изменения из примера кода.

  1. Я использую URL-адрес аудиопотока, а не файл.
  2. Мне пришлось добавить __bridge в следующий код (хотя я действительно не знаю, для чего это нужно)

    OSStatus result = AudioSessionInitialize(NULL, NULL, NULL, NULL);
      if (result)
    NSLog(@"Error initializing audio session! %@", result);
    
      [[AVAudioSession sharedInstance] setDelegate: self];
      NSError *setCategoryError = nil;
      [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError];
      if (setCategoryError)
        NSLog(@"Error setting category! %@", setCategoryError);
    
        result = AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange, RouteChangeListener, (__bridge void *)self);
       if (result) 
    NSLog(@"Could not add property listener! %@", result);
    
    void RouteChangeListener(   void *                  inClientData,
                     AudioSessionPropertyID inID,
                     UInt32                  inDataSize,
                     const void *            inData)
    {
    SongsViewController* This = (__bridge SongsViewController*)inClientData;
    
    if (inID == kAudioSessionProperty_AudioRouteChange) {
    
    CFDictionaryRef routeDict = (CFDictionaryRef)inData;
    NSNumber* reasonValue = (__bridge NSNumber*)CFDictionaryGetValue(routeDict, CFSTR(kAudioSession_AudioRouteChangeKey_Reason));
    
    int reason = [reasonValue intValue];
    
    if (reason == kAudioSessionRouteChangeReason_OldDeviceUnavailable) {
    
        [This pausePlaybackForPlayer:This.player];
      }
     }
    }
    

Изменить: я думаю, что это происходит из-за того, что AVAudioPlayer не предназначен для сетевых потоков. Могу ли я просто изменить AVAudioPlayer на AVPLayer? У меня такое ощущение, что это не так просто.


person mnort9    schedule 14.06.2012    source источник


Ответы (1)


AVAudioPlayer не предназначен для сетевых потоков. Документы Apple:

Apple recommends that you use this class for audio playback unless you are playing audio captured from a network stream or require very low I/O latency.

person mnort9    schedule 15.06.2012