2014-07-06 16 views
7

Ich versuche, Audio an die Lautsprecher im AppRTC iOS example umzuleiten.Wie wird Audio an Lautsprecher im AppRTC iOS-Beispiel umgeleitet?

Ich habe versucht:

AVAudioSession* session = [AVAudioSession sharedInstance]; 

//error handling 
BOOL success; 
NSError* error; 

//set the audioSession category. 
//Needs to be Record or PlayAndRecord to use audioRouteOverride: 

success = [session setCategory:AVAudioSessionCategoryPlayAndRecord 
         error:&error]; 

if (!success) NSLog(@"AVAudioSession error setting category:%@",error); 

//set the audioSession override 
success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker 
             error:&error]; 
if (!success) NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error); 

//activate the audio session 
success = [session setActive:YES error:&error]; 
if (!success) NSLog(@"AVAudioSession error activating: %@",error); 
else NSLog(@"audioSession active"); 

es keine Fehler gibt, aber es funktioniert nicht. Wie kann ich das beheben?

+0

Haben Sie eine Lösung für Ihr Problem gefunden? Ich habe das gleiche Problem wie Sie im Moment. –

+1

@JosipB. https://github.com/alongubkin/audiotoggle –

+0

funktioniert nicht für mich ... –

Antwort

0

Ich fand am Ende Lösung.

Grund war, dass Sie AVAudioSession Kategorie auf AVAudioSessionCategoryPlayback setzen müssen. Aber aus irgendeinem Grund wurde nach dem Einrichten des webRTC-Aufrufs auf AVAudioSessionCategoryPlayAndRecord zurückgesetzt. Am Ende entschied ich mich Beobachter für AVAudioSessionRouteChangeNotification hinzufügen und wechseln zu jedes Mal, wenn ich unerwünschte Kategorie ändern entdeckt. Ein bisschen Hack-Lösung, aber am Ende gearbeitet. Sie können es überprüfen here.

9

Ich löste es durch die Lösung. Hören Sie einfach AVAudioSessionRouteChangeNotification

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didSessionRouteChange:) name:AVAudioSessionRouteChangeNotification object:nil]; 

Und die didSessionRouteChange Selektor wie folgt:

- (void)didSessionRouteChange:(NSNotification *)notification 
{ 
    NSDictionary *interuptionDict = notification.userInfo; 
    NSInteger routeChangeReason = [[interuptionDict valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue]; 

    switch (routeChangeReason) { 
     case AVAudioSessionRouteChangeReasonCategoryChange: { 
      // Set speaker as default route 
      NSError* error; 
      [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error]; 
     } 
     break; 

    default: 
     break; 
    } 
} 
0

phuongle's answer korrekt ist. Wenn Sie Override aktivieren, wird die Audioausgabe sogar überschrieben, selbst wenn der Benutzer Kopfhörer einsteckt. Es macht wenig Sinn, Audio über Lautsprecher abzuspielen, wenn der Benutzer Kopfhörer benutzt. Verwenden Sie dazu folgenden Code:

- (void)didSessionRouteChange:(NSNotification *)notification 
{ 
    NSDictionary *interuptionDict = notification.userInfo; 
    const NSInteger routeChangeReason = [[interuptionDict valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue]; 

    if (routeChangeReason == AVAudioSessionRouteChangeReasonRouteConfigurationChange) { 
     [self enableLoudspeaker]; 
    } 
} 

- (void)enableLoudspeaker { 
    AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
    AVAudioSessionCategoryOptions options = audioSession.categoryOptions; 
    if (options & AVAudioSessionCategoryOptionDefaultToSpeaker) return; 
    options |= AVAudioSessionCategoryOptionDefaultToSpeaker; 
    [audioSession setActive:YES error:nil]; 
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:options error:nil]; 
}