ios - 将背景音乐 ( itunes ) 优先于 avfoundation 播放器节点

标签 ios swift avfoundation

我正在使用 AVFoundation 框架。每当播放器播放缓冲区时,我的背景音乐就会停止,所以我使用下面的代码让它继续播放,而不管 AVFoundation 播放器如何。

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

它确实有效,但问题是背景音乐的质量会受到显着影响。每当 AVPlayer 播放缓冲区时,音乐就不再具有低音效果。

我希望在使用 AVPlayer 时背景音乐不间断。可能吗?

更新:如果有人想检查,我添加了完整的代码。使用此代码时,可以在打开应用程序或激活 session 后立即感受到背景 itune 音乐的不同。

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)
        }
    }
}

最佳答案

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

try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: [.mixWithOthers,.allowBluetooth, .defaultToSpeaker])

关于ios - 将背景音乐 ( itunes ) 优先于 avfoundation 播放器节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50482515/

相关文章:

ios - 如何通过 numberOfRowsInSection 函数联系发件人?

ios - AVCaptureSession条码扫描

ios - 苹果配置器 : "Lock to app" with ability to open external apps

objective-c - iOS:将图像转换为 PNG 以允许保存

ios - 使用生成功能为图像添加动画

ios - 点击区域时不显示本地通知

ios - pushsharp 将证书推送到 iOS 错误的通知

iOS( swift ): Location of touch event in UIButton programatically

iOS:同步来自相机和运动数据的帧

ios - 使用 AVAssetWriter 在保持相同长度/持续时间的同时降低视频帧速率