Как получить файл m4a из записанного аудио для API в Swift? - PullRequest
0 голосов
/ 17 февраля 2020

Цель: я хочу записать звук в течение 10 секунд, получить файл аудиозаписи и отправить его в виде пост-запроса.

Что я сделал: я могу записывать звук в течение 10 секунд, используя этот код :

var recordingSession: AVAudioSession!
var audioRecorder: AVAudioRecorder!

func setupAV() {
    recordingSession = AVAudioSession.sharedInstance()

    do {
        try recordingSession.setCategory(.playAndRecord, mode: .default)
        try recordingSession.setActive(true)
        recordingSession.requestRecordPermission() { [unowned self] allowed in
            DispatchQueue.main.async {
                if allowed {
                    self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.recordTapped)))
                } else {
                    // failed to record!
                }
            }
        }
    } catch {
        // failed to record!
    }
}

func getDocumentsDirectory() -> URL {
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    return paths[0]
}

@objc func recordTapped() {
    let audioFilename = getDocumentsDirectory().appendingPathComponent("recording.m4a")

    let settings = [
        AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
        AVSampleRateKey: 12000,
        AVNumberOfChannelsKey: 1,
        AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
    ]

    do {
        audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings)
        audioRecorder.delegate = self
        audioRecorder.record(forDuration: 10)
        print("RECORDING")
    } catch {
        print("audio failed to record")
    }

}

func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
    print("DONE")
}

Что мне нужно сделать: мне нужно получить эту аудиозапись в виде файла m4a и отправить ее в виде почтового запроса. Как я могу это сделать? Пожалуйста, дайте мне знать, если вам нужна другая информация! Спасибо!

1 Ответ

1 голос
/ 18 февраля 2020

Вам необходимо экспортировать запись, используя AVAssetExportSession. Вот хороший метод, который сделает это за вас:

func export(fileType: AVFileType = .m4a, completion: @escaping (() -> Void)) {
    let asset = AVAsset(url: recordingFileURL))
    guard let exportSession = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetAppleM4A) else { return }
    exportSession.outputFileType = fileType
    exportSession.metadata = asset.metadata
    exportSession.shouldOptimizeForNetworkUse = true
    exportSession.outputURL = exportOutputURL
    exportSession.exportAsynchronously {
        print("Export finished.")
        completion()
    }
}

Где exportOutputURL может быть любым URL, который вы создаете в каталоге документов. Например, мы можем определить его как вычисляемое свойство:

var exportOutputURL: URL? {
    let pathURL = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
    return pathURL?.appendingPathComponent("my_exported_recording")
}

Теперь у вас будет экспортированный файл m4a в вашем exportOutputURL.

В зависимости от того, что API ожидает от параметра в быть, вы можете преобразовать в данные следующим образом:

do {
    let data = try Data(contentsOf: exportOutputURL)
} catch { ... }

И в base64 строку:

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