AVAudioSession:通过听筒扬声器播放音频

时间:2017-07-31 20:06:38

标签: ios objective-c audio avaudiosession

我正试图通过耳机扬声器播放音频并且工作正常。相同的代码在以下情况下不起作用。

  1. 打开相机录制视频
  2. 取代开始录制,取消它
  3. 然后,尝试通过耳机播放音频不工作。这是通过主要演讲者播放
  4. 这是我通过耳机播放音频的代码。

    -(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];
    }
    

2 个答案:

答案 0 :(得分:3)

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

- (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];
}

答案 1 :(得分: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)在当前的视图控制器viewWillAppears中显示您正在播放音频,请致电:

    configureAudioSessionCategory()

3)如果要在扬声器上放置音频,请调用功能:

    configureAudioSessionToSpeaker()

如果要在麦克风上放置音频,请调用功能:

    configureAudioSessionToEarSpeaker()

*我会做一些标签,因为它是swift 4.2的新标签,在您搜索此主题时在Google或此处很难(或什么也找不到)。

标签:到音频扬声器的音频会议,到顶部扬声器,听筒扬声器,默认扬声器,底部扬声器,扬声器的音频路由。

相关问题