2013-08-06 3 views
16

팟 캐스트 앱에서 작업하고 있습니다. 이것은 AVAudioSessionCategoryPlayback 세션 유형을 사용하여 오디오를 재생합니다. 이것은 제가하고 싶은 거의 모든 것을합니다. 다른 재생중인 음악을 일시 중지하고 전화가 왔을 때 중단되며 일반적으로 원하는대로 정확하게 작동합니다.AVAudioSession이 "더킹 (ducked)"될 때 감지

예외. 우선 순위가 높은 오디오가 재생되면 (예 : 내비게이션 단계별 앱 실행) 내 애플리케이션의 오디오는 볼륨이 낮아 지지만 계속 실행됩니다. 이것은 원하지 않는 두 목소리의 끔찍한 혼합을 만듭니다. 대신 응용 프로그램의 오디오가 재생 된 사운드 중에 일시 중지 한 다음 끝나면 다시 계속하는 것이 좋습니다.

다른 AVAudioSession 속성 (예 : AVAudioSessionCategoryOptionMixWithOthers)을 변경해 보았습니다. 그러나 이는 우선 순위가 낮은 소리가 내 응용 프로그램과 어떻게 혼합되어 있는지 만 변경합니다. 광산이 우선 순위가 높은 소리와 어떻게 섞여 있는지는 바뀌지 않습니다. 나는 또한 sharedSessionotherAudioPlaying 속성을 관찰 해 보았습니다.하지만이 짧은 클립이 오버레이 될 때 변경 사항이 발생하지 않았습니다.

내 앱의 오디오가 더킹되지 않을 때이를 감지하여 일시 중지시킬 수있는 방법이 있습니까? 또는 내 앱의 오디오가 더킹되지 않도록 차단하여 이러한 다른 사운드를 중단으로 간주 할 수 있습니까?

감사합니다.

+0

'kAudioSessionBeginInterruption'과'kAudioSessionEndInterruption'을 사용해 보셨나요? – iwasrobbed

+0

예.하지만 AVAudioSession에 관한 한 오버레이 덕킹은 '중단'으로 간주되지 않습니다. 따라서 이러한 콜백/알림은 시작되지 않습니다. –

+2

당신이해야한다고 생각한다면 애플에 레이더 파일을 보내고 싶을 것입니다. 필자의 견해로는 오디오 세션 중단으로 간주해야한다는 것이 논리적 인 것처럼 보입니다. – iwasrobbed

답변

0

나는 이것을 한 적이 없지만 AudioSession 서비스 C 함수 audioSessionAddPropertyListener을 사용하여 kAudioSessionProperty_OtherAudioIsPlaying에 대한 콜백을 등록 할 수 있다고 상상합니다.

"향후에"일부 또는 전부의 AudioSession C 기능이 더 이상 사용되지 않을 수 있다는 점에 대해 "플래 팅 된"설명서 및 Apple DevForums에 약간의 혼동이 있음을 유의하십시오.

+0

의견을 보내 주셔서 감사합니다. 그러나 Obj-C 및 C API를 사용하여이 두 가지를 시도했습니다. 더킹 도중 해고 될 때 콜백의 원하는 결과를 생성하지 않습니다. –

0

당신은 중단 보길 원하는, 단순히 오디오 세션을 버릴 수있는 경우 중단 중단이 종료 될 때 다음과 같이하고, 그것을 다시 시작 :

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

if ([self canBecomeFirstResponder]) { 
    [self becomeFirstResponder]; 
} 

는 통지를 처리하는 : 당신의 viewDidLoad에서

을 :

static NSInteger audioSessionActiveCounter = 0; 

- (void)audioSessionDidChangeInterruptionType:(NSNotification *)notification 
{ 
    AVAudioSessionInterruptionType interruptionType = [[[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey] unsignedIntegerValue]; 

    if (AVAudioSessionInterruptionTypeBegan == interruptionType) 
    { 
     DDLogVerbose(@"Session interrupted: --- Begin Interruption ---"); 
     // stop your session here with a setActive:NO 

    } 
    else if (AVAudioSessionInterruptionTypeEnded == interruptionType) 
    { 
     DDLogVerbose(@"Session interrupted: --- End Interruption ---"); 
     // resume your session here with a setActive:YES 
    } 
} 

희망이 있습니다.

0

kAudioSessionProperty_OtherAudioIsPlaying이 어떤 식 으로든 콜백하지 않는다고 생각합니다. 정기적으로이 값을 폴링해야 할 수도 있습니다.

다른 오디오가 장치에서 재생 될 때 0이 아닌 값을 반환해야합니다. 이것은 당신이 "ducked"하고 있다는 것을 나타내는 것은 아니지만 다른 오디오가 오디오와 섞여 있음을 나타냅니다. 다른 앱이 자신의 오디오 세션의 kAudioSessionProperty_OtherMixableAudioShouldDuck 속성을 설정 한 경우에만 당신은 싫증을 날 것입니다.

폴링에 관해서는, 콜백만큼 우아하지 않을 수도 있지만 때로는 필요하고 폴링이 작은 히트라고 생각됩니다.

희망이 도움이됩니다.

1

AppDelegate.m 클래스에서와 didFinishLaunchingWithOptions 기능에, 다음과 같은 알림

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionInterruption:) name:AVAudioSessionInterruptionNotification object:nil]; 

및 응용 프로그램 실행 방법 외부

을 듣고이 당신을 위해 작동합니다

- (void)audioSessionInterruption:(NSNotification *)notif{ 
    NSLog(@"\n\nInterruption Notification :%@\n\n",notif.userInfo); 
} 

희망으로 선택을 구현 .. ..

0

나는이 문제에 대해 Apple DTS에 썼다. 다음은 내가받은 것입니다.

Apple 개발자 기술 지원 (DTS)에 문의 해 주셔서 감사합니다. Google의 엔지니어가 귀하의 요청을 검토 한 결과 현재 시스템 구성이 제공된 경우 에 원하는 기능을 달성 할 수있는 지원 방법이 없다고 결론을 냈습니다.

애플, 다시 오디오를 시작하는 배경을 응용 프로그램을 활성화/ 전경 응용 프로그램은 오리 다른 오디오를 선택할 때 오디오 재생을 중지하는 배경 응용 프로그램을 알릴 수 있도록 미래 에 지원을 추가하는 것을 고려하는 당신이 원하는 경우 더킹 완료 후 Bug Reporter 도구 ( http://bugreport.apple.com)를 통해 개선 요청을 제출하십시오.

지금은 불행한 일입니다.