Как получить выход AVAudioPlayer на динамик - PullRequest
27 голосов
/ 21 июня 2009

Я записываю звук с помощью AVAudioRecorder, как показано в Как записать звук на iPhone с AVAudioRecorder?

Затем я использую AVAudioPlayer для воспроизведения записи. Однако звук исходит из динамика, а не из динамика. Как мне перенаправить звук на громкоговоритель?

ТИА!

Ответы [ 9 ]

27 голосов
/ 19 мая 2015

Я понимаю, что этот вопрос довольно старый, но когда я боролся с той же проблемой, я нашел простое решение, которое, мы надеемся, поможет всем, кто хочет использовать более громкие мультимедийные колонки, а не колонки ресивера. Метод, который я использовал, настраивал аудио сеанс с параметром DefaultToSpeaker в AVAudioSessionCategoryOptions:

В Swift (при условии, что ваш аудио сеанс называется session) -

session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions:AVAudioSessionCategoryOptions.DefaultToSpeaker, error: nil)

В Obj-C -

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error: nil];
18 голосов
/ 07 июля 2009

С http://www.iphonedevsdk.com/forum/iphone-sdk-development-advanced-discussion/12890-audiosessionsetproperty-problem-playing-sound-listening-mic.html -

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);    
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);
14 голосов
/ 17 июня 2014

Swift 3

Перед записью звука я установил:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)

и перед воспроизведением я установил:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)

Цель C

до записи:

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryRecord error:nil];

перед воспроизведением:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
11 голосов
/ 24 декабря 2015

Это прекрасно работает для меня в Swift2

let session = AVAudioSession.sharedInstance()
try! session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: AVAudioSessionCategoryOptions.DefaultToSpeaker)
6 голосов
/ 05 октября 2015

Swift2:

try session.setCategory(AVAudioSessionCategoryPlayAndRecord,
    withOptions:AVAudioSessionCategoryOptions.DefaultToSpeaker)
6 голосов
/ 19 ноября 2013

Это старый вопрос, но другой ответ мне не помог ... Однако я нашел решение, которое выкладываю для дальнейшего использования, если кому-то (или мне из будущего!) Это понадобится.

Решение описывается в следующем сообщении в блоге: iOS: принудительно выводить звук на динамики, когда наушники подключены .

Вам необходимо создать новый класс AudioRouter класса Objective C в вашем проекте. Затем импортируйте AudioRouter.h в заголовочный файл класса, в котором вы запускаете аудиофункцию. Затем в соответствующий файл .m добавьте следующие строки в методе viewDidLoad:

AudioRouter *foobar = [[AudioRouter alloc] init];
[foobar initAudioSessionRouting];
[foobar forceOutputToBuiltInSpeakers];

Теперь у вас есть звук (например, AVAudioPlayer), выводимый на громкоговоритель! Обратите внимание, что если вы подключите наушники во время работы приложения , то весь аудиовыход будет направлен на наушники.

1 голос
/ 22 марта 2019

это ключевая строка для вывода auido в динамик вместо микрофона. Обратите внимание, что это должно быть установлено во время записи

try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)

Ниже приведена полная функция настройки записи

private func setupRecorder() {

    if isAudioRecordingGranted {
        let session = AVAudioSession.sharedInstance()
        do {

            if #available(iOS 10.0, *) {
                try! session.setCategory(.playAndRecord, mode:.spokenAudio)
            }
            else {
                // Workaround until https://forums.swift.org/t/using-methods-marked-unavailable-in-swift-4-2/14949 isn't fixed
               session.perform(NSSelectorFromString("setCategory:error:"), with: AVAudioSession.Category.playback)
            }
            try session.setActive(true)
            try session.overrideOutputAudioPort(AVAudioSession.PortOverride.speaker)

            let settings = [
                AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
                AVSampleRateKey: 44100,
                AVNumberOfChannelsKey: 2,
                AVEncoderAudioQualityKey:AVAudioQuality.high.rawValue
            ]
            audioRecorder = try AVAudioRecorder(url: fileUrl(), settings: settings)
            audioRecorder.delegate = self
            audioRecorder.isMeteringEnabled = true
            audioRecorder.prepareToRecord()
            self.recorderState = .Ready
        }
        catch let error {
            recorderState = .error(error)
        }
    }
    else {
        recorderState = .Failed("Don't have access to use your microphone.")
    }
}
1 голос
/ 01 марта 2018

Ответ за Swift 4.0

func SetSessionPlayerOn()
{
    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)
    } catch _ {
    }
    do {
        try AVAudioSession.sharedInstance().setActive(true)
    } catch _ {
    }
    do {
        try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
    } catch _ {
    }
}
func SetSessionPlayerOff()
{
    do {
        try AVAudioSession.sharedInstance().setActive(false)
    } catch _ {
    }
}
1 голос
/ 03 апреля 2017

Swift 3

 let audioSession = AVAudioSession.sharedInstance()

    do {
        try audioSession.overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
    } catch let error as NSError {
        print("Audio Session error: \(error.localizedDescription)")
    }
...