AVAudioEngine нет звука - PullRequest
       1

AVAudioEngine нет звука

0 голосов
/ 13 февраля 2019

Я уже некоторое время пытаюсь воспроизвести аудио в режиме реального времени из данных, предоставленных из URLSessionDataTask в iOS.

Я объявил пользовательский класс для управления действиями проигрывателя, и он выглядит следующим образом:

import UIKit
import AVFoundation


class AudioDataPlayer: NSObject {

    //MARK:- Variables
    //MARK: Constants
    enum Status{
        case playing
        case notPlaying
    }

    let audioPlayerQueue = DispatchQueue(label: "audioPlayerQueue", qos: DispatchQoS.userInteractive)


    //MARK: Vars
    private (set) var currentStatus:Status = .notPlaying

    private var audioEngine: AVAudioEngine = AVAudioEngine()
    private var streamingAudioPlayerNode: AVAudioPlayerNode = AVAudioPlayerNode()
    private (set) var streamingAudioFormat: AVAudioFormat = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: 48000, channels: 2, interleaved: false)!



    //MARK:- Constructor
    override init() {
        super.init()

    }



    //MARK:- Private methods



    //MARK:- Public methods
    func processData(_ data:Data) throws{

        if currentStatus == .notPlaying{

            do{

                try AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default, options: [.allowAirPlay])
                try AVAudioSession.sharedInstance().setActive(true)

                if #available(iOS 11.0, *) {
                    try audioEngine.enableManualRenderingMode(.realtime, format: streamingAudioFormat, maximumFrameCount: 3072)
                }

                audioEngine.attach(streamingAudioPlayerNode)
                audioEngine.connect(streamingAudioPlayerNode, to: audioEngine.mainMixerNode, format: streamingAudioFormat)

                currentStatus = .playing

            }
            catch{

                print("\(logClassName) ERROR -> \(error.localizedDescription)")

            }

        }

        audioPlayerQueue.async {

            if let audioPCMBuffer = data.makePCMBuffer(format: self.streamingAudioFormat){

                self.streamingAudioPlayerNode.scheduleBuffer(audioPCMBuffer, completionHandler: {

                   //TODO
                })

                if !self.audioEngine.isRunning{

                    try! self.audioEngine.start()
                    self.streamingAudioPlayerNode.play()

                }

            }
            else{

                print("\(self.logClassName) TEST -> Ignoring data to play ...")

            }

        }

    }

    func stop(){

        audioEngine.stop()
        audioEngine.detach(streamingAudioPlayerNode)
        currentStatus = .notPlaying

    }


}

Функция, которая управляет входящими данными, называется «processData (_ data: Data)», и она вызывается так из другого класса:

let processingQueue = DispatchQueue(label: "processingQueue", qos: DispatchQoS.userInteractive)

var audioDataPlayer:AudioDataPlayer = AudioDataPlayer()

func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {

    processingQueue.async {

        try! self.audioDataPlayer.processData(data)

    }

}

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

Аудиоданные имеют формат 48K, 16 бит и 2 канала.

Любыеидеи?

1 Ответ

0 голосов
/ 13 февраля 2019

Если ваши аудиоданные 16-битные (целое число, можно было бы предположить), вам нужно инициализировать AVAudioFormat с pcmFormatInt16 вместо pcmFormatFloat32.

. И не чередование кажется немного странным дляэтот формат, поэтому вам, возможно, придется установить interleaved на true.

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