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

时间:2015-12-30 06:58:58

标签: ios objective-c bluetooth core-bluetooth wireless

从BT耳机录制音频。录制完成后,切换路由并通过无线BT扬声器播放。

我已经实现但音频是录制和播放相同的耳机或扬声器。记录并播放viseversa?任何解决方案。? 提前致谢

4 个答案:

答案 0 :(得分: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:&error];将恢复到手机的内置扬声器,而不是BT扬声器。

答案 1 :(得分: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 :(得分:1)

请使用AVAudioSession方法。

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

选项为 的 AVAudioSessionCategoryOptionAllowBluetooth

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

答案 3 :(得分: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]);

祝你好运!!