首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优先考虑背景音乐( itunes )而不是avfoundation节点

优先考虑背景音乐( itunes )而不是avfoundation节点
EN

Stack Overflow用户
提问于 2018-05-23 07:38:30
回答 2查看 368关注 0票数 3

我使用的是AVFoundation框架。每当播放器播放缓冲区时,我的背景音乐就会被停止,所以我使用下面的代码允许它继续播放,而不管AVFoundation播放器是什么。

代码语言:javascript
复制
try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: [.mixWithOthers,.allowBluetooth])
try audioSession.setMode(AVAudioSessionModeDefault)
try audioSession.setActive(true)

它确实有效,但问题是背景音乐的质量受到了极大的影响。当AVPlayer播放缓冲器时,音乐不再有低音效果。

我想在使用AVPlayer时不受干扰地播放背景音乐。有可能吗?

update:如果有人想检查,我添加了完整的代码。在使用此代码时,一旦应用程序打开或会话被激活,就可以感觉到背景itune音乐的差异。

代码语言:javascript
复制
class ViewCosdfntroller: UIViewController  {

    var engine = AVAudioEngine()
    let audioSession = AVAudioSession.sharedInstance()
    let player = AVAudioPlayerNode()
    let mixer = AVAudioMixerNode()

    override func viewDidLoad() {
        super.viewDidLoad()

        do {
            try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: [.mixWithOthers,.allowBluetooth])
            try audioSession.setMode(AVAudioSessionModeDefault)
            try audioSession.setActive(true)
        } catch {
        }

        let input = engine.inputNode
        let bus = 0
        let inputFormat = input.outputFormat(forBus: bus)
        let recordingFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: 11025.0, channels: 1, interleaved: false)

        engine.attach(player)
        engine.attach(mixer)
        engine.connect(input, to: mixer, format: input.outputFormat(forBus: 0))
        engine.connect(player, to: engine.mainMixerNode, format: recordingFormat)
        mixer.installTap(onBus: bus, bufferSize: AVAudioFrameCount(inputFormat.sampleRate * 0.4), format: inputFormat, block: { (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in

            let Converter:AVAudioConverter = AVAudioConverter.init(from: inputFormat, to: recordingFormat!)!
            let newbuffer = AVAudioPCMBuffer(pcmFormat: recordingFormat!,frameCapacity: AVAudioFrameCount((recordingFormat?.sampleRate)! * 0.4))
            let inputBlock : AVAudioConverterInputBlock = { (inNumPackets, outStatus) -> AVAudioBuffer? in
                outStatus.pointee = AVAudioConverterInputStatus.haveData
                let audioBuffer : AVAudioBuffer = buffer
                return audioBuffer
            }
            var error : NSError?
            Converter.convert(to: newbuffer!, error: &error, withInputFrom: inputBlock)
            self.player.scheduleBuffer(newbuffer!)

        })
        do {
            try! engine.start()
            player.play()
        } catch {
            print(error)
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-23 16:39:32

除非这是一些奇怪的混合怪癖,否则您报告的质量变化可能只是记录类别将默认的音频输出设备更改为微小的、微小的接收器(因为电话,不要问)。通过将.defaultToSpeaker添加到setCategory()调用中,重写此行为:

代码语言:javascript
复制
try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: [.mixWithOthers,.allowBluetooth, .defaultToSpeaker])
票数 0
EN

Stack Overflow用户

发布于 2018-05-23 07:43:45

我想你需要这个:

代码语言:javascript
复制
try audioSession.setCategory(AVAudioSessionCategoryAmbient)

文档:https://developer.apple.com/documentation/avfoundation/avaudiosessioncategoryambient

当您使用此类别时,来自其他应用程序的音频与您的音频混合。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50482515

复制
相关文章

相似问题

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