【问题标题】:AVAudioSession : Playing audio through earpiece speakerAVAudioSession : 通过听筒播放音频
【发布时间】:2017-07-31 20:06:38
【问题描述】:

我正在尝试通过听筒扬声器播放音频,它工作正常。相同的代码在以下情况下不起作用。

  1. 打开相机录制视频
  2. 不要开始录制,而是取消它
  3. 然后,尝试通过听筒播放音频不起作用。它正在通过主扬声器播放

这是我通过耳机播放音频的代码。

-(void)initialAVaudioPlayer
{
    if (player==nil) {
        NSError *error = nil;
        AVAudioSession *session = [AVAudioSession sharedInstance];
        [session setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
        [session setActive: YES error:nil];

        AVAudioSessionPortDescription *routePort = session.currentRoute.outputs.firstObject;
        NSString *portType = routePort.portType;

        if ([portType isEqualToString:@"Receiver"]) {
            [session  overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
        } else {
            [session  overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:&error];
        }        


        NSString *path;
        NSError *err;
        NSString *name;
        name = @"referenceaudio";
        path = [[NSBundle mainBundle] pathForResource:name ofType:@"wav"];
        if ([[NSFileManager defaultManager]fileExistsAtPath:path]) {
            NSURL *url = [NSURL fileURLWithPath:path];
            player = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:&err];
            if (!err) {
                player.numberOfLoops = -1;

            }
            else{
                //NSLog(@"%@",[err description]);
            }

        }
    }
}

这是代码,当用户按下取消时,

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    NSLog(@"here");
    [self dismissViewControllerAnimated:YES completion:nil];
}

【问题讨论】:

标签: ios objective-c audio avaudiosession


【解决方案1】:

这是使 AVAudioSession 路由到 Ear Speaker(内置扬声器)或 Swift 4.2、iOS 12、SDK 11 的底部扬声器的解决方案:

1) 在您的项目中创建一个名为 AudioSession 的文件并实现这 3 个功能。

import AVFoundation
import UIKit

let audioSession = AVAudioSession.sharedInstance()

func configureAudioSessionCategory() {
  print("Configuring audio session")
  do {
    try audioSession.setCategory(AVAudioSession.Category.playAndRecord, mode: AVAudioSession.Mode.voiceChat)
    try audioSession.overrideOutputAudioPort(AVAudioSession.PortOverride.none)
    print("AVAudio Session out options: ", audioSession.currentRoute)
    print("Successfully configured audio session.")
  } catch (let error) {
    print("Error while configuring audio session: \(error)")
  }
}

func configureAudioSessionToSpeaker(){
    do {
        try audioSession.overrideOutputAudioPort(AVAudioSession.PortOverride.speaker)
        try audioSession.setActive(true)
        print("Successfully configured audio session (SPEAKER-Bottom).", "\nCurrent audio route: ",audioSession.currentRoute.outputs)
    } catch let error as NSError {
        print("#configureAudioSessionToSpeaker Error \(error.localizedDescription)")
    }
}

func configureAudioSessionToEarSpeaker(){

    let audioSession:AVAudioSession = AVAudioSession.sharedInstance()
    do { ///Audio Session: Set on Speaker
        try audioSession.overrideOutputAudioPort(AVAudioSession.PortOverride.none)
        try audioSession.setActive(true)

        print("Successfully configured audio session (EAR-Speaker).", "\nCurrent audio route: ",audioSession.currentRoute.outputs)
    }
    catch{
        print("#configureAudioSessionToEarSpeaker Error \(error.localizedDescription)")
    }
}

2) 在您当前的视图控制器 viewWillAppear 中,您播放音频,调用:

    configureAudioSessionCategory()

3)如果你想在扬声器上放音频,调用函数:

    configureAudioSessionToSpeaker()

如果你想在麦克风上放音频,调用函数:

    configureAudioSessionToEarSpeaker()

*我会制作一些标签,因为它是 swift 4.2 的新标签,并且在您搜索此主题时很难(或没有)在 google 或此处找到。

标签:到耳机的 avaudio 会话、到顶部扬声器的音频路由、听筒扬声器、聋哑扬声器、底部扬声器、外放扬声器。

【讨论】:

  • ValidateRequiredFields: 未知选择的端口接收器数据源(类型:接收器)
  • @Doca 它始终只保持活跃的主扬声器。我使用了您提供的相同代码。
  • 我也在使用相同的代码,但它只用于主扬声器。
  • 但对我来说,耳机始终处于活动状态。在 iOS 14 上进行测试。
【解决方案2】:

更改取消按钮的音频路由解决问题

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    NSError *error = nil;
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategoryPlayback error:&error];
    [session  overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
    [session setActive: YES error:nil];

    videoPicker = nil;
    [self dismissViewControllerAnimated:YES completion:nil];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2012-12-07
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多