将audio输出redirect到电话扬声器和麦克风input到耳机

是否有可能将audio输出redirect到手机扬声器,并仍然使用麦克风耳机input?

如果我将audio路由redirect到电话扬声器而不是耳机,它也会redirect麦克风。 这是有道理的,但我似乎无法只能redirect麦克风input? 有任何想法吗?

以下是我用来将audioredirect到扬声器的代码:

UInt32 doChangeDefaultRoute = true; propertySetError = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof(doChangeDefaultRoute), &doChangeDefaultRoute); NSAssert(propertySetError == 0, @"Failed to set audio session property: OverrideCategoryDefaultToSpeaker"); UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); 

这是可能的,但是如何设置它是挑剔的。

 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil]; UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride); 

使用AVAudioSessionCategoryPlayAndRecord非常重要,否则路由将无法发送到扬声器。 一旦为audio会话设置了覆盖路由,就可以使用AVAudioPlayer实例并向扬声器发送一些输出。

希望像其他人一样为我工作。 关于这个文件分散,但Skype的应用程序certificate是可能的。 坚持,我的朋友! 🙂

下面是一些苹果文档: http : //developer.apple.com/library/ios/#documentation/AudioToolbox/Reference/AudioSessionServicesReference/Reference/reference.html

kAudioSessionProperty_OverrideAudioRoute的页面上进行kAudioSessionProperty_OverrideAudioRoute

恐怕这看起来不可能。

从audio会话编程指南 – kAudioSessionProperty_OverrideAudioRoute

如果在将此属性的值设置为kAudioSessionOverrideAudioRoute_Speaker时插入了耳机,系统将更改input以及输出的audio路由:input来自内置麦克风; 输出转到内置扬声器。

这个问题可能重复

你可以做的是在任何情况下强制audio输出到扬声器:

从UI黑客 – iOS:在耳机插入时强制audio输出到扬声器

 @interface AudioRouter : NSObject + (void) initAudioSessionRouting; + (void) switchToDefaultHardware; + (void) forceOutputToBuiltInSpeakers; @end 

 #import "AudioRouter.h" #import <AudioToolbox/AudioToolbox.h> #import <AVFoundation/AVFoundation.h> @implementation AudioRouter #define IS_DEBUGGING NO #define IS_DEBUGGING_EXTRA_INFO NO + (void) initAudioSessionRouting { // Called once to route all audio through speakers, even if something's plugged into the headphone jack static BOOL audioSessionSetup = NO; if (audioSessionSetup == NO) { // set category to accept properties assigned below NSError *sessionError = nil; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error: &sessionError]; // Doubly force audio to come out of speaker UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride); // fix issue with audio interrupting video recording - allow audio to mix on top of other media UInt32 doSetProperty = 1; AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(doSetProperty), &doSetProperty); // set active [[AVAudioSession sharedInstance] setDelegate:self]; [[AVAudioSession sharedInstance] setActive: YES error: nil]; // add listener for audio input changes AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange, onAudioRouteChange, nil ); AudioSessionAddPropertyListener (kAudioSessionProperty_AudioInputAvailable, onAudioRouteChange, nil ); } // Force audio to come out of speaker [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil]; // set flag audioSessionSetup = YES; } + (void) switchToDefaultHardware { // Remove forcing to built-in speaker UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride); } + (void) forceOutputToBuiltInSpeakers { // Re-force audio to come out of speaker UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride); } void onAudioRouteChange (void* clientData, AudioSessionPropertyID inID, UInt32 dataSize, const void* inData) { if( IS_DEBUGGING == YES ) { NSLog(@"==== Audio Harware Status ===="); NSLog(@"Current Input: %@", [AudioRouter getAudioSessionInput]); NSLog(@"Current Output: %@", [AudioRouter getAudioSessionOutput]); NSLog(@"Current hardware route: %@", [AudioRouter getAudioSessionRoute]); NSLog(@"=============================="); } if( IS_DEBUGGING_EXTRA_INFO == YES ) { NSLog(@"==== Audio Harware Status (EXTENDED) ===="); CFDictionaryRef dict = (CFDictionaryRef)inData; CFNumberRef reason = CFDictionaryGetValue(dict, kAudioSession_RouteChangeKey_Reason); CFDictionaryRef oldRoute = CFDictionaryGetValue(dict, kAudioSession_AudioRouteChangeKey_PreviousRouteDescription); CFDictionaryRef newRoute = CFDictionaryGetValue(dict, kAudioSession_AudioRouteChangeKey_CurrentRouteDescription); NSLog(@"Audio old route: %@", oldRoute); NSLog(@"Audio new route: %@", newRoute); NSLog(@"========================================="); } } + (NSString*) getAudioSessionInput { UInt32 routeSize; AudioSessionGetPropertySize(kAudioSessionProperty_AudioRouteDescription, &routeSize); CFDictionaryRef desc; // this is the dictionary to contain descriptions // make the call to get the audio description and populate the desc dictionary AudioSessionGetProperty (kAudioSessionProperty_AudioRouteDescription, &routeSize, &desc); // the dictionary contains 2 keys, for input and output. Get output array CFArrayRef outputs = CFDictionaryGetValue(desc, kAudioSession_AudioRouteKey_Inputs); // the output array contains 1 element - a dictionary CFDictionaryRef diction = CFArrayGetValueAtIndex(outputs, 0); // get the output description from the dictionary CFStringRef input = CFDictionaryGetValue(diction, kAudioSession_AudioRouteKey_Type); return [NSString stringWithFormat:@"%@", input]; } + (NSString*) getAudioSessionOutput { UInt32 routeSize; AudioSessionGetPropertySize(kAudioSessionProperty_AudioRouteDescription, &routeSize); CFDictionaryRef desc; // this is the dictionary to contain descriptions // make the call to get the audio description and populate the desc dictionary AudioSessionGetProperty (kAudioSessionProperty_AudioRouteDescription, &routeSize, &desc); // the dictionary contains 2 keys, for input and output. Get output array CFArrayRef outputs = CFDictionaryGetValue(desc, kAudioSession_AudioRouteKey_Outputs); // the output array contains 1 element - a dictionary CFDictionaryRef diction = CFArrayGetValueAtIndex(outputs, 0); // get the output description from the dictionary CFStringRef output = CFDictionaryGetValue(diction, kAudioSession_AudioRouteKey_Type); return [NSString stringWithFormat:@"%@", output]; } + (NSString*) getAudioSessionRoute { /* returns the current session route: * ReceiverAndMicrophone * HeadsetInOut * Headset * HeadphonesAndMicrophone * Headphone * SpeakerAndMicrophone * Speaker * HeadsetBT * LineInOut * Lineout * Default */ UInt32 rSize = sizeof (CFStringRef); CFStringRef route; AudioSessionGetProperty (kAudioSessionProperty_AudioRoute, &rSize, &route); if (route == NULL) { NSLog(@"Silent switch is currently on"); return @"None"; } return [NSString stringWithFormat:@"%@", route]; } @end