Изменить версию формата кодера - PullRequest
4 голосов
/ 24 июня 2019

В течение прошлой недели я пытался взять звук с микрофона (на iOS), записать его и записать в файл .aac.

Я наконец-то получилточка, где он почти работает

let inputNode = audioEngine.inputNode
let inputFormat = inputNode.outputFormat(forBus: 0)

let bufferSize = UInt32(4096)
//let sampleRate = 44100.0
let sampleRate = 8000
let bitRate = sampleRate * 16

let fileUrl = url(appending: "NewRecording.aac")

print("Write to \(fileUrl)")
do {
    outputFile = try AVAudioFile(forWriting: fileUrl,
                                 settings: [
                                     AVFormatIDKey: kAudioFormatMPEG4AAC,
                                     AVSampleRateKey: sampleRate,
                                     AVEncoderBitRateKey: bitRate,
                                     AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue,
                                     AVNumberOfChannelsKey: 1],
                                 commonFormat: .pcmFormatFloat32,
                                 interleaved: false)
} catch let error {
    print("Failed to create audio file for \(fileUrl): \(error)")
    return
}

recordButton.setImage(RecordingStyleKit.imageOfMicrophone(fill: .red), for: [])

// Down sample the audio to 8kHz
let fmt = AVAudioFormat(commonFormat: .pcmFormatFloat32, sampleRate: Double(sampleRate), channels: 1, interleaved: false)!
let converter = AVAudioConverter(from: inputFormat, to: fmt)!

inputNode.installTap(onBus: 0, bufferSize: AVAudioFrameCount(bufferSize), format: inputFormat) { (buffer, time) in

    let inputCallback: AVAudioConverterInputBlock = { inNumPackets, outStatus in
        outStatus.pointee = AVAudioConverterInputStatus.haveData
        return buffer
    }
    let convertedBuffer = AVAudioPCMBuffer(pcmFormat: fmt,
                                                                                 frameCapacity: AVAudioFrameCount(fmt.sampleRate) * buffer.frameLength / AVAudioFrameCount(buffer.format.sampleRate))!
    var error: NSError? = nil
    let status = converter.convert(to: convertedBuffer, error: &error, withInputFrom: inputCallback)
    assert(status != .error)

    if let outputFile = self.outputFile {
        do {
            try outputFile.write(from: convertedBuffer)
        }
        catch let error {
            print("Write failed: \(error)")
        }
    }
}

audioEngine.prepare()
do {
    try audioEngine.start()
}
catch {
    print(error.localizedDescription)
}

Проблема в том, что полученный файл ДОЛЖЕН быть в формате MPEG ADTS, AAC, v4 LC, 8 kHz, monaural, но приведенный выше код генерирует только MPEG ADTS, AAC, v2 LC, 8 kHz, monaural

То есть ДОЛЖЕН бытьv4, а не v2 (у меня нет выбора)

(Этот результат генерируется с помощью file {name} в командной строке для вывода его свойств. Я также использую MediaInfo дляпредоставить дополнительную информацию)

Я пытался выяснить, есть ли какой-либо способ предоставить подсказку или параметр AVAudioFile, который изменит версию LC (Low Complexity) с 2 на 4?

Я просматривал документы и примеры, но не могу найти никаких предложений

...