Как вывести вывод AVAudioPlayer на динамик
-
06-07-2019 - |
Вопрос
Я записываю звук с помощью AVAudioRecorder, как показано на рисунке. Как записать звук на iPhone с помощью AVAudioRecorder?
Затем я использую AVAudioPlayer для воспроизведения записи.Однако звук исходит из динамика уха, а не из громкоговорителя.Как мне перенаправить звук на громкоговоритель?
ТИА!
Решение
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);
Другие советы
Я понимаю, что этот вопрос довольно старый, но когда я боролся с той же проблемой, я нашел простое решение, которое, надеюсь, поможет всем, кто хочет использовать более громкие динамики мультимедиа, а не динамики приемника.Я использовал метод настройки аудиосеанса с помощью параметра DefaultToSpeaker в AVAudioSessionCategoryOptions:
В Swift (при условии, что ваш аудиосеанс называется session
) -
session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions:AVAudioSessionCategoryOptions.DefaultToSpeaker, error: nil)
В Объ-С -
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error: nil];
Свифт 3
Перед записью звука я установил:
AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord)
и перед воспроизведением я установил:
AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)
Цель С
перед записью:
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryRecord error:nil];
перед воспроизведением:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
Это отлично работает для меня в Swift2
let session = AVAudioSession.sharedInstance()
try! session.setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: AVAudioSessionCategoryOptions.DefaultToSpeaker)
Это старый вопрос, но другой ответ мне не помог...Однако я нашел решение, которое публикую для дальнейшего использования на случай, если оно кому-то (или мне самому из будущего!) понадобится.
Решение описано в следующем сообщении блога: iOS:Принудительный вывод звука на динамики при подключенных наушниках .
Вам необходимо создать новый класс Objective-C AudioRouter в вашем проекте.Затем импортируйте AudioRouter.h
в заголовочный файл класса, в котором вы запускаете аудиофункцию.Далее в соответствующем .m
файл добавьте следующие строки внутри viewDidLoad
метод:
AudioRouter *foobar = [[AudioRouter alloc] init];
[foobar initAudioSessionRouting];
[foobar forceOutputToBuiltInSpeakers];
Теперь у вас есть аудио (например.AVAudioPlayer) принудительно выводить на динамик!Обратите внимание: если вы подключаете наушники пока приложение запущено, весь аудиовыход направляется на наушники.
Свифт2:
try session.setCategory(AVAudioSessionCategoryPlayAndRecord,
withOptions:AVAudioSessionCategoryOptions.DefaultToSpeaker)
Свифт 3
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
} catch let error as NSError {
print("Audio Session error: \(error.localizedDescription)")
}
Ответ для 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 _ {
}
}
это ключевая строка для вывода звука в динамик, а не в микрофон.Обратите внимание, что его следует устанавливать во время записи.
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.")
}
}