Как получить вывод AVAudioPlayer на динамик

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

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

TIA!


person dizy    schedule 21.06.2009    source источник


Ответы (11)


Из 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);
person Community    schedule 07.07.2009
comment
Примечание для других, кто сталкивается с этим ответом: первые две строки в образце кода не имеют значения - и, если вы похожи на OP (который ТАКЖЕ записывает звук), эти строки будут препятствовать правильной работе записи. - person Steve; 06.10.2012
comment
У меня это сработало с одной корректировкой: я изменил sessionCategory на kAudioSessionCategory_PlayAndRecord. - person Jacob; 25.01.2013
comment
Я видел это решение несколько раз, но я просто не знаю, где разместить этот фрагмент кода. Кто-нибудь может мне сказать? - person meda; 01.05.2013
comment
AudioSessionSetProperty устарел в iOS7. Как это сделать сейчас? - person Hubert OG; 11.03.2014
comment
В iOS7 вы можете сделать [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryAmbient error: nil]; - person Ernest; 16.06.2014
comment
Две нижние строчки работали как шарм! Просто добавьте их перед вызовом play. - person Prasad Pawar; 01.02.2016
comment
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayBack error:nil]; сделал это за меня в iOS 9 - person NSNoob; 21.05.2016

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

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

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

В Obj-C -

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error: nil];
person Daniel    schedule 19.05.2015
comment
Работал у меня. Спасибо. - person thecloud_of_unknowing; 22.04.2017

Swift 3

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

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)

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

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)

Цель C

перед записью:

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

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

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
person budiDino    schedule 17.06.2014
comment
Изменяйте категорию только в том случае, если она соответствует вашему пользовательскому случаю. К AVAudioSessionCategoryAmbient , Apple сообщает Категория для приложения, в котором воспроизведение звука не является основным, то есть ваше приложение может успешно использоваться с выключенным звуком. Эта категория также подходит для приложений в стиле «подыгрывать», таких как виртуальное пианино. что пользователь играет во время воспроизведения музыкального приложения. Когда вы используете эту категорию, звук из других приложений смешивается с вашим звуком. Ваш звук отключается блокировкой экрана и переключателем Silent. - person KudoCC; 24.09.2015
comment
Странно, что это единственный, который у меня сработал. Хотя я создаю приложение для записи песен, поэтому я бы предпочел не использовать Ambient, но ни один из других ответов не работает. Это единственное, что заставило использовать динамики устройства вместо телефонного разговора (маленький динамик). Громкость по-прежнему ниже, чем хотелось бы. - person C0D3; 27.09.2020

Это отлично работает для меня в Swift2

let session = AVAudioSession.sharedInstance()
try! session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: AVAudioSessionCategoryOptions.DefaultToSpeaker)
person Spencer Powell    schedule 24.12.2015

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

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

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

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

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

person Simo A.    schedule 19.11.2013

Swift2:

try session.setCategory(AVAudioSessionCategoryPlayAndRecord,
    withOptions:AVAudioSessionCategoryOptions.DefaultToSpeaker)
person Kristian    schedule 05.10.2015

Ответ для 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 _ {
    }
}
person Ali Pishvaee    schedule 01.03.2018

Swift 5

// Get the singleton instance.
let recordingSession = AVAudioSession.sharedInstance()
do {
    // Set the audio session category, mode, and options.
    try recordingSession.setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker])
    try recordingSession.setActive(true)
} catch {
    print("Failed to set audio session category.")
}

Дополнительную информацию о AVAudioSession.CategoryOptions .

person keishinzzz    schedule 11.03.2020

Swift 3

 let audioSession = AVAudioSession.sharedInstance()

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

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

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.")
    }
}
person Spydy    schedule 22.03.2019

Swift 5. Для работы как с Bluetooth-устройствами, так и с динамиком по умолчанию используйте следующее:

let recordingSession = AVAudioSession.sharedInstance()
try recordingSession.setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .allowBluetooth])
person anas.p    schedule 13.01.2021