从无线耳机录制音频并通过蓝牙扬声器播放

Posted

技术标签:

【中文标题】从无线耳机录制音频并通过蓝牙扬声器播放【英文标题】:Record Audio From wireless Headset and Play it Through Bluetooth speaker 【发布时间】:2015-12-30 06:58:57 【问题描述】:

从 BT 耳机录制音频。录制完成后,切换路由,通过无线蓝牙音箱播放。

我已经实现,但音频正在同一耳机或扬声器中录制和播放。如何录制和播放 viseversa ?任何解决方案。? 提前致谢

【问题讨论】:

你能声明你的代码吗? 【参考方案1】:

嘿@Rushi 我认为这段代码将帮助您播放音频 viseversa

    -(IBAction)RecordButtonPlayed:(id)sender

    if(player.playing)
    
        [player stop];
    

    if (!recorder.recording)
    
        [[AVAudiosession sharedInstance] setActive:YES error:NULL];
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:NULL];

         [_btnRecord setImage:[UIImage imageNamed:@"player-stop-outline-512.png"] forState:UIControlStateNormal];
        [recorder record];
    

    else
    
         [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:NULL];

         [_btnRecord setImage:[UIImage imageNamed:@"171.png"] forState:UIControlStateNormal];
         [recorder stop];

    

【讨论】:

好极了...但只能使用手动设置的蓝牙耳机和扬声器【参考方案2】:

AVAudioSession 可用于设置会话的默认输出端口。

首先要做的是设置类别AVAudioSession。这里有几个选项,因为我们希望能够播放和录制声音。

AVAudioSessionCategoryPlayAndRecord — 播放和录制。输入和输出不必同时发生,但如果需要可以。用于音频聊天应用程序。

AVAudioSessionCategoryMultiRoute — 播放和录制。允许同时输入和输出不同的音频流,例如 USB 和耳机输出。 DJ 应用程序将受益于使用多路由类别。 DJ 经常需要在播放另一首曲目时听一首音乐。使用多路径类别,DJ 应用可以通过耳机播放未来的曲目,同时为舞者播放当前曲目。

在这种情况下,AVAudioSessionCategoryPlayAndRecord 似乎是合适的。设置如下:

NSError *setCategoryError = nil;
BOOL success = [[AVAudioSession sharedInstance]
                setCategory: AVAudioSessionCategoryPlayAndRecord
                      error: &setCategoryError];

if (!success)  /* handle the error in setCategoryError */ 

Apple 建议设置一次类别,然后根据我们的需要修改输入路由。

一旦类别设置为 AVAudioSessionCategoryPlayAndRecord,下面的行将返回可用输入和输出路由的列表。

NSArray <AVAudioSessionPortDescription *> *availableInputs = [AVAudioSession sharedInstance].availableInputs;

来自 OP,此端口将用于录制。

AVAudioSessionPortBluetoothHFP - 支持免提模式 (HFP) 的蓝牙设备。

这样设置:

[[AVAudioSession sharedInstance] setPreferredInput:AVAudioSessionPortBluetoothHFP error: &error];

录制完成后,可以从availableInputs 列表中选择另一个设备进行播放。 BT 扬声器的播放端口很可能是AVAudioSessionPortBluetoothA2DP,但here is a comprehensive list of all playback ports。

这样设置:

[[AVAudioSession sharedInstance] setPreferredInput:AVAudioSessionPortBluetoothA2DP error: &error];

现在声音应该播放到 BT 扬声器。

这里需要注意的是,[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&amp;error]; 将恢复为手机的内置扬声器,而不是 BT 扬声器。

【讨论】:

我已经试过了。但我的问题是BT扬声器的输出不是默认的iphone扬声器。 哦,我误解了OP。我虽然你想播放 BT 扬声器。我将在早上编辑我的答案,以展示如何使用 iPhone 扬声器播放。 我想在 BT 扬声器而不是 iphone 扬声器中输出,我认为你需要睡觉。 使用这一个 AVAudioSessionCategoryOptionAllowBluetooth 你对睡眠@Rushi 是对的。我将更新我的帖子,提供有关 iOS 上 BT 设置的更多详细信息,因为它可能会让人感到困惑。我会从更远的地方开始,给你一些关于你能做什么的选择。如果有不清楚的地方,请再次在 cmets 中告诉我。【参考方案3】:

请使用 AVAudioSession 方法。

- (BOOL)setCategory:(NSString *)category 
        withOptions:(AVAudioSessionCategoryOptions)options 
              error:(NSError **)outError 
并设置以下 类别为 AVAudioSessionCategoryPlayAndRecord 或 AVAudioSessionCategoryRecord

选项AVAudioSessionCategoryOptionAllowBluetooth

请记住,它可能仅适用于 A2DP 蓝牙。 然后试试这个 AVAudioSessionCategoryOptionAllowBluetooth

【讨论】:

【参考方案4】:

为了接收蓝牙配件事件,您必须在视图控制器中编写以下代码:

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

[self becomeFirstResponder];

然后我认为将音频会话类别设置为 MultiRoute 可以允许单独路由音频。而我早些时候在 iOS7 中尝试这样做。而且似乎每次您更改输入或输出时,iOS 都会完全更改音频设备。我不确定新版本是否也可以。 但是,您可以使用以下代码获取所有当前可用输入的列表:

// portDesc.portType could be for example - BluetoothHFP, MicrophoneBuiltIn, MicrophoneWired
NSArray *availInputs = [[AVAudioSession sharedInstance] availableInputs];
int count = [availInputs count];
for (int k = 0; k < count; k++) 
    AVAudioSessionPortDescription *portDesc = [availInputs objectAtIndex:k];
    NSLog(@"input%i port type %@", k+1, portDesc.portType);
    NSLog(@"input%i port name %@", k+1, portDesc.portName);

并输出为:

AVAudioSession *session = [AVAudioSession sharedInstance];
NSLog(@"Outputs: %@", [[session currentRoute] outputs]);

祝你好运!!

【讨论】:

以上是关于从无线耳机录制音频并通过蓝牙扬声器播放的主要内容,如果未能解决你的问题,请参考以下文章

iOS 无法在扬声器上播放并将音频会话设置为录制

如何从电话、电话扬声器、耳机或蓝牙设备切换音频输出

Android蓝牙耳机/扬声器音频切换

Android蓝牙耳机/扬声器音频切换

android WebView 通过听筒或蓝牙播放音频

将音频重新路由到蓝牙扬声器