我正在尝试复制 Apple avTouch 中的一些功能,但我无法让 AVAudioPlayer
播放轨道。
它记录 Could not play (null)
。 (null) 表示 AVAudioplayer player.url
。但是,当我登录 player.url
时,它会正确返回。我还测试了流 URL(它来自 soundcloud)。
我几乎只对示例代码做了两处更改。
- 我使用的是音频流 URL,而不是文件。
我必须在下面的代码中添加
__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]; } } }
编辑:我认为这是发生在 b/c AVAudioPlayer
不适用于网络流。我可以简单地将 AVAudioPlayer 更改为 AVPLayer 吗?我觉得这并不容易。
最佳答案
AVAudioPlayer 不适用于网络流。苹果文档:
Apple 建议您将此类用于音频播放,除非您正在播放从网络流捕获的音频或需要非常低的 I/O 延迟。
关于objective-c - 使用类似于Apple的avTouch项目的AVAudioPlayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11026452/