Я пытаюсь воспроизвести некоторые функции 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]; } } }
Изменить: я думаю, что это происходит из-за того, что AVAudioPlayer
не предназначен для сетевых потоков. Могу ли я просто изменить AVAudioPlayer на AVPLayer? У меня такое ощущение, что это не так просто.