Опитвам се да репликирам част от функционалността в avTouch на Apple, но не мога да накарам 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? Имам чувството, че не е толкова лесно.