首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AVCaptureSession + AVAudioEngine + AVPlayer=Low音频来自接收器和扬声器,而不是扬声器

AVCaptureSession + AVAudioEngine + AVPlayer=Low音频来自接收器和扬声器,而不是扬声器
EN

Stack Overflow用户
提问于 2021-07-24 20:00:15
回答 1查看 225关注 0票数 2

我已经设置了一个AVCaptureSession和AVAudiEngine来录制视频和音频。我正在播放AVPlayer的结果,除了音频问题之外,它工作得很好。

这个问题只出现在我的iPhone上,iPad工作正常(可能是因为它没有接收器)。问题是,当我这样设置我的AVAudioSession时:

代码语言:javascript
运行
复制
do {
        try AVAudioSession.sharedInstance().setCategory(.playAndRecord, options: [.defaultToSpeaker])
        try AVAudioSession.sharedInstance().setActive(true, options: .notifyOthersOnDeactivation)
    } catch {
        NSLog(logPrefix + "Could not set the category.")
    }

音频来自接收器和扬声器,几乎听不见。如果我省略了这些选项,音频就会从接收器中出来(正如预期的那样)。如果我包括一个模式(voiceChat或videoChat),iPad不喜欢它(采样率没有同步)。

你知道有什么诡计能让它在扬声器上大声播放吗?

EN

回答 1

Stack Overflow用户

发布于 2021-12-11 00:27:01

虽然很奇怪,但对我有效的解决方案涉及两个关键步骤:

  1. 在其输入节点上创建AVAudioEngine并设置语音处理。当AVPlayer加载时,重写输出端口.

代码:

代码语言:javascript
运行
复制
let audioSession = AVAudioSession.sharedInstance()
try audioSession.setCategory(.playAndRecord,
                    mode: .videoChat,
                    options: [.defaultToSpeaker,
                              .allowAirPlay,
                              .allowBluetooth])
try audioSession.setActive(true)

let engine = AVAudioEngine()
try engine.inputNode.setVoiceProcessingEnabled(true)

let playerItem = AVPlayerItem(url: ...)
let player = AVPlayer(playerItem: playerItem)
var observer: NSKeyValueObservation? = nil

observer = playerItem.observe(\.status, options:  [.new, .old], changeHandler: { (playerItem, change) in
       if playerItem.status == .readyToPlay {
             try? audioSession.overrideOutputAudioPort(.speaker)
       }
}
player.play()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68513409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档