Аудио из файла, сгенерированного из-за касания шины AVAudioEngine, имеет другую скорость, чем та, которая воспроизводится на выходе устройства - PullRequest
0 голосов
/ 28 марта 2020

Я генерирую аудио с AVAudioEngine. Затем я устанавливаю сигнал на выходе mainMixerNode двигателя, который обеспечивает AVAudioPCMBuffer, который затем записывается в MPEG4A CC AVAudioFile. Проблема, с которой я столкнулся, заключается в том, что звук, воспроизводимый в результирующем файле .m4a, работает медленнее, чем тот, который вы можете услышать на самом выходе устройства (колонки, наушники). Это код, который я реализую:


// Audio Format
let audioFormat = AVAudioFormat(standardFormatWithSampleRate: 44100, channels: 2)

// Engine
var engine = AVAudioEngine()

// Two AVAudioNodes are hooked up to the AVAudioEngine
engine.connect(myAVAudioNode0, to: engine.mainMixerNode, format: audioFormat)
engine.connect(myAVAudioNode1, to: engine.mainMixerNode, format: audioFormat)

// Function to Write Audio to a File
func writeAudioToFile() {
        // File to write
        let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
        let audioURL = documentsDirectory.appendingPathComponent("share.m4a")

        // Format parameters
        let sampleRate = Int(audioFormat!.sampleRate)
        let channels = Int(audioFormat!.channelCount)

        // Audio File settings
        let settings = [
            AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
            AVSampleRateKey: Int(audioFormat!.sampleRate),
            AVNumberOfChannelsKey: Int(audioFormat!.channelCount),
            AVEncoderAudioQualityKey: AVAudioQuality.max.rawValue
        ]

        // Audio File
        var audioFile = AVAudioFile()
        do {
            audioFile = try AVAudioFile(forWriting: audioURL, settings: settings, commonFormat: .pcmFormatFloat32, interleaved: false)
        }
        catch {
            print ("Failed to open Audio File For Writing: \(error.localizedDescription)")
        }

        // Install Tap on mainMixer
        // Write into buffer and then write buffer into AAC file
        engine.mainMixerNode.installTap(onBus: 0, bufferSize: 8192, format: nil, block: { (pcmBuffer, when) in
            do {
                try audioFile.write(from: pcmBuffer)
            }
            catch {
                print("Failed to write Audio File: \(error.localizedDescription)")
            }
        })
}

1 Ответ

0 голосов
/ 28 марта 2020

Я распечатал формат AVAudioPCMBuffer и обнаружил, что по умолчанию используется частота дискретизации 48000 Гц. Таким образом, изменение следующей строки устраняет проблему:

let audioFormat = AVAudioFormat(standardFormatWithSampleRate: 48000, channels: 2)
...