Отдайте приоритет фоновой музыке (itunes) над узлом проигрывателя avfoundation - PullRequest
0 голосов
/ 23 мая 2018

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

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

Это работает, нопроблема заключается в том, что качество фоновой музыки сильно пострадало.Музыка больше не имеет басовых эффектов, когда AVPlayer воспроизводит буфер.

Я хочу, чтобы фоновая музыка не прерывалась при использовании AVPlayer.Возможно ли это?

обновление : Я добавил полный код, если кто-то хочет проверить.Может почувствовать разницу в фоновой музыке 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)
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Если это не какая-то странная микшированная причуда, то сообщаемое вами изменение качества может заключаться просто в том, что категории записи заменяют устройство вывода звука по умолчанию на крошечный консервный приемник (потому что телефоны не спрашивают).Переопределите это поведение, добавив .defaultToSpeaker к вашему setCategory() вызову:

try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: [.mixWithOthers,.allowBluetooth, .defaultToSpeaker])
0 голосов
/ 23 мая 2018

Я думаю, вам нужен этот:

try audioSession.setCategory(AVAudioSessionCategoryAmbient)

Документация: https://developer.apple.com/documentation/avfoundation/avaudiosessioncategoryambient

Когда вы используете эту категорию, звук из других приложений смешивается с вашим звуком

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...