Записывайте Opus с помощью AVAudioRecorder iOS - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь записать формат Opus в iOS.Когда я тестирую записывающее устройство с форматом LinearPCM, т.е. функции wav, AVAudioRecorderDelegate и updateMeters вызывается правильно, и в URL записывающего устройства сохранен действительный файл, сохраненный по заданному пути.Вот конфигурация, которую я использую для перекодирования.

let fileMgr = FileManager.default
let dirPaths = fileMgr.urls(for: .documentDirectory,
                                in: .userDomainMask)
let soundFileURL = dirPaths[0].appendingPathComponent("audio.wav")
let recordSettings =
        [AVEncoderAudioQualityKey: AVAudioQuality.low.rawValue,
         AVEncoderBitRateKey: 16,
         AVNumberOfChannelsKey: 1,
         AVFormatIDKey : kAudioFormatLinearPCM,
         AVSampleRateKey: 44100.0] as [String : Any]

Затем я попытался проверить его на Opus со следующими конфигурациями, но функции делегата не вызываются, значение метров постоянно -160db (тишина), а audioRecorder url nil, потому что я могу 'получить его в функции делегата:

func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
    print(audioRecorder!.currentTime)
    self.audioFileUrl = audioRecorder!.url
}

Конфигурации Opus, которые я использую:

let soundFileURL = dirPaths[0].appendingPathComponent("audio.opus")
    let recordSettings =
        [AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue,
         AVEncoderBitRateKey: 16,
         AVNumberOfChannelsKey: 1,
         AVFormatIDKey : kAudioFormatOpus,
         AVSampleRateKey: 44100.0] as [String : Any]

Как правильно настроить конфигурации для записи формата Opus для моего приложения для работы с аудио в социальных сетях,Что было бы лучше всего для 30-ти секундной загрузки аудио сообщений и прослушивания на стороне других пользователей.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Работали следующие конфигурации для перекодирования формата Opus.это не работает на 44100 Гц.Работает только для 16000 или 24000 Гц.

let recordSettings =
        [AVNumberOfChannelsKey: 1,
         AVFormatIDKey : kAudioFormatOpus,
         AVSampleRateKey: 24000.0] as [String : Any]

Больше ничего не меняется, файл сохраняется правильно и теперь вызывается didFinishRecoding.

0 голосов
/ 22 мая 2018

Попробуйте:

var recordSettings = Dictionary() as [String: Any]
var audioRecorder: AVAudioRecorder?

func recordAudio() {
    let fileMgr = FileManager.default
    let dirPaths = fileMgr.urls(for: .documentDirectory,
                                in: .userDomainMask)
    let soundFileURL = dirPaths[0].appendingPathComponent("audio.wav")
    recordSettings =
        [AVEncoderAudioQualityKey: AVAudioQuality.low.rawValue,
         AVEncoderBitRateKey: 16,
         AVNumberOfChannelsKey: 1,
         AVFormatIDKey : kAudioFormatLinearPCM,
         AVSampleRateKey: 44100.0] as [String : Any]

    do {
        audioRecorder = try AVAudioRecorder(url: soundFileURL, settings: recordSettings)
    } catch {
        print(error.localizedDescription)
    }

    audioRecorder?.delegate = self
    audioRecorder?.prepareToRecord()

    // call record method when you want to start recording
    audioRecorder?.record()
}

func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {

    print(recorder.currentTime)
    do {
        audioPlayer = try AVAudioPlayer(contentsOf: recorder.url)
    } catch {
        print(error)
    }
    audioPlayer?.play()
}

Вам нужно позвонить audioRecorder?.stop(), если вы хотите остановить запись.Это даст вам обратный вызов в методе audioRecorderDidFinishRecording(_ recorder:.Надеюсь, это поможет.

...