Objective c 使用类似于Apple的AVAudioPlayer';s avTouch项目

Objective c 使用类似于Apple的AVAudioPlayer';s avTouch项目,objective-c,ios,avaudioplayer,Objective C,Ios,Avaudioplayer,我试图复制苹果的avTouch中的一些功能,但我无法让AVAudioPlayer播放曲目 它记录无法播放(空)。(null)表示AVAudioplayerplayer.url。但是,当我登录player.url时,它会正确返回。我还测试了流URL(它来自soundcloud) 我对示例代码几乎只做了两处更改 我使用的是音频流URL,而不是文件 我不得不在下面的代码中添加\u bridge(但我真的不知道它是干什么用的) 编辑:我认为这种情况正在发生。b/cAVAudioPlayer不适用于网络

我试图复制苹果的avTouch中的一些功能,但我无法让
AVAudioPlayer
播放曲目

它记录
无法播放(空)
。(null)表示AVAudioplayer
player.url
。但是,当我登录
player.url
时,它会正确返回。我还测试了流URL(它来自soundcloud)

我对示例代码几乎只做了两处更改

  • 我使用的是音频流URL,而不是文件
  • 我不得不在下面的代码中添加
    \u bridge
    (但我真的不知道它是干什么用的)


  • 编辑:我认为这种情况正在发生。b/c
    AVAudioPlayer
    不适用于网络流。我可以简单地将AVAudioPlayer更改为AVPLayer吗?我觉得这并不容易。

    AVAudioPlayer不适用于网络流。苹果文档:

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

    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];
      }
     }
    }