AppleのavTouchの機能の一部を複製しようとしていますがAVAudioPlayer
、トラックを再生できません。
ログに記録しCould not play (null)
ます。(null)はAVAudioplayerを表しますplayer.url
。ただし、ログに記録するplayer.url
と、正しく返されます。ストリームURLもテストしました(soundcloudからのものです)。
サンプルコードから変更を加えたのはほとんど2つだけです。
- ファイルではなく、オーディオストリームの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/cAVAudioPlayer
はネットワークストリーム用ではありません。AVAudioPlayerをAVPLayerに変更するだけでいいですか?そんなに簡単じゃない気がします。