2012-07-26 4 views
12

앱이 시작될 때 AVAudioSession을 설정하고 위임자를 appDelegate로 설정합니다. 전화가 수신 될 때 대리자의 beginInterruption이 호출되지 않는 것을 제외하면 모든 것이 작동하는 것 (재생 등) 인 것 같습니다. 호출이 끝날 때 endInterruption이 호출됩니다.AVAudioSessionDelegate가 endInterruption에서 호출되었지만 beginInterruption이 호출되지 않았습니다.

내가 가지고있는 유일한 생각은 내가 사용하고있는 오디오 플레이어 코드가 AVAudioPlayer를 기반으로 사용되었지만 현재 AVPlayer를 사용하고 있다는 것입니다. AVAudioPlayer 대리자의 인터럽트 처리를위한 콜백은 아직 거기에 있지만 어떤 식 으로든 충돌하는 것은 이상한 것 같습니다.

+0

내가 같은 상황, 앤드류 타격있어가, 그것을 해결하기 위해 당신이 할 수 있었다? – Ethan

+0

iOS 5.x에서 문제가 발생합니까? – farski

+0

iOS 6에서만 똑같은 것을 보았습니다. 업그레이드 만되었지만 작동하지 않습니다. 네가 해결했다면 알려줘. –

답변

8

헤더를 보면 iOS6에서 AVAudioSessionDelegate가 더 이상 사용되지 않는 것 같습니다.

iOS6 대신 AVAudioSessionInterruptionNotification을 사용하십시오.

업데이트 : 작동하지 않았습니다. 프레임 워크에 버그가 있다고 생각합니다.

예, 저의 경험으로 beginInterruption 또는 새로 문서화 된 AVAudioSessionInterruptionNotification이 제대로 작동합니다. 내가해야 할 일은 로컬 플래그를 사용하여 플레이어의 상태를 추적 한 다음 endInterruption:withFlags: 메서드를 처리하여 중단으로부터 복구를 추적하는 것입니다.

iOS 6에서는 중단으로 인한 재개로 인해 오디오 플레이어가 올바른 위치에 유지되므로 AVAudioPlayer의 마지막 재생 시간을 저장할 필요가 없어 단순히 재생해야했습니다.

다음은 내가 생각해 낸 해결책입니다. AVPlayer가 너무 오래 머무르면 iOS 6이 미디어 리셋으로 오디오를 죽이는 것처럼 보입니다. 무슨 일이 일어나고, AVPlayer가 재생되지만 소리가 나지 않습니다. AVPlayer의 속도는 1이지만 소리가 전혀 들리지 않습니다. 상황에 고통을 추가하려면 AVAudioSession setActive 나 문제가 있음을 나타내는 AVPlayer 자체에 오류가 없습니다.

appWillResignActive에 의존 할 수 없다는 사실에 덧붙여서, 원격 제어 동작에 전혀 의존하고있는 경우 앱이 백그라운드에 이미있을 수 있습니다.

구현 한 마지막 해결책은 AVPlayer에주기적인 관찰자를 추가하고 마지막으로 알려진 시간을 기록하는 것입니다. 내가 컨트롤을 다시 받았다는 이벤트를 받으면 새로운 AVPlayer를 만들고 AVPlayerItem으로로드 한 다음 적절한 시간에 seekToTime을로드합니다.

이것은 상당히 까다로운 해결 방법이지만, 적어도 작동하고 정기적 인 충돌이 발생하지 않도록합니다.

+1

동의 함. AVAudioSessionInterruptionNotification도 AVAudioSessionRouteChangeNotification도 작동하지 않는 것 같습니다! 나는 Apple에 버그를 제출했으며, 6.1에서이 API를 수정하기를 희망하는 다른 개발자에게 권장합니다. https://bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/wa/signIn – clozach

4

C api를 사용하면 인터럽트가 시작될 때 인터럽트 방법도 호출되지 않음을 확인할 수 있습니다. 끝날 때만

(AudioSessionInitialize (nil, nil, interruptionListenerCallback, (__bridge void *)(self)); 

나는 또한이 문제에 대해 사과와 함께 버그 보고서를 제출했습니다.

편집 : 이것은 아이폰 OS 6.1에서 해결 (하지만 아이폰 OS 6.0.1)

+0

코드 설정에 문제가 있는지 확실하지 않지만 중단이 발생할 때 오디오 세션 중단 콜백이 호출되는 것을보고 있습니다. iOS 6 기기에서 시작됩니다. – hotpaw2

+0

흥미 롭다 - 나는 [예제를 업로드했다] (http://mixandmash.co.uk/sam/AudioInterruptions.zip) 나는 사과에 보냈다 - 당신은 그것을 줄 수 있고 NSLog가 방해? 오디오 세션을 다르게 설정하는 경우 알아두면 좋을까요? –

+0

위에서 언급 한 프로젝트는 iOS 6.1 베타 –

0

난 그냥 내 아이폰 5 선언 된 AudioSessionInterruptionListener 콜백 함수에 중단 점을 설정하여 (아이폰 OS 6.0을 실행)에서 확인 AudioSessionInitialize()에서이 인터럽트 콜백은 실제로 앱에 활성 오디오 세션 및 오디오 장치가 있고 수신 전화 통화로 중단 될 때 호출됩니다 (Xcode는 중단이 시작될 때 중단 점에서 앱이 중단되었음을 나타냅니다) , 나는 그 다음부터 계속된다).

나는 앱에 오디오 장치를 중지시키고 오디오 세션을 비활성화합니다. 그런 다음 종료 중단 콜백에서 앱이 오디오 세션을 다시 활성화하고 문제없이 오디오 기기를 다시 시작합니다 (앱이 이후에 오디오를 제대로 녹음 함).

+0

우리가 mpeg4aac에 직접 인코딩하면 문제는 표면적 인 것처럼 보입니다. 다른 코덱 및 모든 것이 잘 작동합니다. 파일 형식으로 무엇을 사용 했습니까? –

0

iOS 6.0.x에서 새로운 오디오 스트리밍 (AVPlayer) 응용 프로그램을 만들었고 동일한 문제가 발견되었습니다. 내가 AVAudioSessionInterruptionOptionShouldResume과 함께 만 AVAudioSessionInterruptionTypeEnded 내 처리기를 얻을 수신 전화 통화 중에

  1. :

    대표는 현재 사용되지 않으며 우리는 알림을 사용할 필요가 있으며, 그 위대한, 그러나 여기 내 결과입니다. 오디오 세션이 자동으로 일시 중지되고 (오디오가 사라짐) AVPlayer의 재생을 다시 시작하면됩니다.

  2. 그러나 CSR Racing과 같은 게임을 시작하려고 할 때 나는 이상하게도 AVAudioSessionInterruptionTypeBegan이라는 두려움을 얻었지만 내 애플리케이션이 게임을 다시 시작하지 않고 심지어 게임을 죽일 수는 없다는 신호가 표시되지 않습니다. 이제

이 다른 (내 경우 AVAudioSessionCategoryPlayback에서) 같은 내 오디오 카테고리 등의 요인, 그리고 두 응용 프로그램 (kAudioSessionProperty_OverrideCategoryMixWithOthers), 잘 모르겠어요의 혼합 설정에 따라 달라질 수 있지만, 확실히 내가 밖으로 무언가를보고 장소.

바라건대 다른 사람들은 6.1beta에서이 문제가 수정되었으며 아직 업그레이드해야하므로 잘보아야합니다.

2

그냥 전화 :

[[AVAudioSession sharedInstance] setDelegate: self]; 
+0

beginInterruption를 트리거 그? – farski

관련 문제