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

问题描述 投票:0回答:4

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

我已经实现,但音频正在同一耳机或扬声器中录制和播放。反之如何录制和播放?有什么解决办法吗?

ios objective-c bluetooth core-bluetooth
4个回答
2
投票

嘿@Rushi,我认为这段代码将帮助您播放音频,反之亦然

    -(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
,但是 这里是所有播放端口的完整列表

像这样设置:

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

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

这里需要注意的是,

[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
将恢复为手机的内部扬声器,而不是 BT 扬声器。


1
投票

请使用AVAudioSession方法。

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

选项AVAudioSessionCategoryOption允许蓝牙

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


1
投票

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

[[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]);

祝你好运!!

© www.soinside.com 2019 - 2024. All rights reserved.