Как записать формат FLAC в iOS 11+

Я изменил код в AudioController.swift в:

...
// Set format for mic input (bus 1) on RemoteIO's output scope
var asbd = AudioStreamBasicDescription()
...
asbd.mFormatID = kAudioFormatFLAC
asbd.mFormatFlags = kAppleLosslessFormatFlag_16BitSourceData
...

и SpeechRecognitionService .быстро в

...
// send an initial request message to configure the service
let recognitionConfig = RecognitionConfig()
recognitionConfig.encoding =  .flac
...

Я пытался возиться с AudioStreamBasicDescription.mFormatFlags, но не смог найти правильные флаги для Google Speech API для распознавания формата.

Как заставить iOS записывать FLAC с помощью данного iOS API?


person Raviteja    schedule 21.06.2018    source источник


Ответы (1)


Попробуй это

/// Common Struct 
struct Manager
{    
    //Required Objects - AVFoundation
    ///AVAudio Session
    static var recordingSession: AVAudioSession!

    ///AVAudio Recorder
    static var recorder: AVAudioRecorder?
}

Разрешения

func CheckForPermission() {
    Manager.recordingSession = AVAudioSession.sharedInstance()
    do {
        try Manager.recordingSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: .defaultToSpeaker)
        Manager.recordingSession.requestRecordPermission({ (allowed) in
            if allowed {
                Manager.micAuthorised = true
            }
            else {
                Manager.micAuthorised = false
            }
        })
        DispatchQueue.main.async  {
            //Reload Label text in Home screen
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: "updateLabel"), object: nil)
        }
    }
    catch {
        print("Failed to set Category", error.localizedDescription)
    }
}

Настройка рекордера и запись с помощью flac

func startMainRecording() {
    print("Main Recording session is created")

    //Get unique File Name
    Manager.audioName = getUniqueName()
    let AudioFileName = getDocumentsDirectory().appendingPathComponent("\(Manager.audioName).flac")
    print("New Path: \(AudioFileName)")

    //Recorder Settings
    let settings: [String: Any] = [
        /// Format Flac
        AVFormatIDKey: Int(kAudioFormatFLAC),
        AVSampleRateKey: 16000,
        AVNumberOfChannelsKey: 1,
        AVLinearPCMBitDepthKey: 16,
        AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue,
        AVLinearPCMIsBigEndianKey: false,
        AVLinearPCMIsFloatKey: false,
        ]

    //Handler
    do {
        //Activate session when required

        //try Manager.recordingSession.setPreferredSampleRate(44000)
        try Manager.recordingSession.setActive(true)

        //Start Recording With Audio File name
        Manager.recorder = try AVAudioRecorder(url: AudioFileName, settings: settings)
        Manager.recorder?.delegate = self
        Manager.recorder?.isMeteringEnabled = true
    }
    catch
    {
        //Finish Recording with a Error
        print("Error Handling: \(error.localizedDescription)")
        /// Saved here if any error occur while recording Just case
        self.finishRecording(success: false)
    }
}
person iOS Geek    schedule 27.06.2018
comment
FLAC, если я правильно помню, требует частоты дискретизации 44100, я попробую и посмотрю. - person Raviteja; 27.06.2018
comment
Я использовал низкую частоту дискретизации только для того, чтобы файл был меньше по размеру, так как мне нужно было загрузить его в базу данных. - person iOS Geek; 28.06.2018
comment
Это помогло? - person iOS Geek; 02.07.2018
comment
@iOSGeek Как остановить запись и возможно ли записать видео со звуком в формате flac? - person Varun Naharia; 15.05.2019