AVAudioRecorder никогда не записывает
Я использую AVAudioRecorder
записать человеческий голос. Мой код выглядит следующим образом:
// Property of Class
var recorder:AVAudioRecorder?
func recordButtonTapped() {
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(AVAudioSessionCategoryRecord)
try audioSession.setActive(true)
if audioSession.recordPermission() != .granted {
audioSession.requestRecordPermission({ (success) in
self.startRecording()
})
}
else {
self.startRecording()
}
} catch {
print("Unable To Set Category")
}
}
func startRecording() {
// libraryPathWith(media) just gets the path to the documents directory
// Like so: Documents/MediaLibrary/Audio/<mediaID>.<mediaExtension>
if let path = MMFileManager.libraryPathWith(media: self.media) {
isRecording = true
do {
let settings = [
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 44100,
AVNumberOfChannelsKey: 1,
AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
]
recorder = try AVAudioRecorder(url: path, settings: settings)
recorder?.delegate = self
if recorder!.prepareToRecord() {
recorder?.record()
}
}
catch {
isRecording = false
}
}
}
func stopRecording() {
self.recordingLabel.text = "Recording Complete"
self.recordingLabel.textColor = UIColor.white
if let rec = recorder {
rec.stop()
recorder = nil
}
isRecording = false
}
AVAudioRecorderDelegate
func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
print("RECORDED AUDIO SUCCESSFULLY \(flag)")
}
func audioRecorderEncodeErrorDidOccur(_ recorder: AVAudioRecorder, error: Error?) {
print("AUDIO RECORDER ERROR \(error?.localizedDescription)")
}
После того, как я вызываю стоп на AVAudioRecorder, audioRecorderEncodeErrorDidOccur
функция никогда не вызывается, но audioRecorderDidFinishRecording
функция делает но flag
всегда false
, Распечатывает "RECORDED AUDIO SUCCESSFULLY false"
ВОПРОС
Когда я делаю запись, используя приведенный выше код, я сохраняю файл в папку с документами в указанном месте. Но этот файл не то, что я могу играть. Он пишет текстовый файл, а не аудиофайл, так как я указываю расширение, которое будет .aac
,
Почему AVAudioRecorder
не записывать аудио? И как мне заставить это сделать?
4 ответа
Проблема была с линией в stopRecording()
функция. Ниже звонка stop()
рекордер я сразу назначаю AVAudioRecorder
экземпляр для nil
, Это освобождает и заканчивает AVAudioRecorder
перед постобработкой для создания аутентичного .aac
файл может быть завершен.
Если вы убедились, что ваш URL имеет расширение "aac", то я подозреваю, что вы просто забыли вызвать stop() на вашем рекордере. Это приводит к незавершенному файлу.
Также напечатайте свои ошибки в блоке catch.
do{
try throwingFunc()
} catch {
print(error)
}
Вот как я это сделал, первый импорт
AVFoundation
и добавьте AVAudioRecorderDelegate в свой ViewController:
class RecordViewController: UIViewController, AVAudioRecorderDelegate
затем создайте глобальный экземпляр AVAudioRecorder:
var audioRecorder : AVAudioRecorder!
Затем я создал кнопку записи, которая начинает запись:
@IBAction func playButton(_ sender: Any) {
let dirPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
let recordingName = "voiceRecording.wav"
let pathArray = [dirPath, recordingName]
let filePath = URL(string: pathArray.joined(separator: "/"))
let session = AVAudioSession.sharedInstance()
try! session.setCategory(AVAudioSessionCategoryPlayAndRecord, with: .defaultToSpeaker)
try! audioRecorder = AVAudioRecorder(url: filePath!, settings: [:])
audioRecorder.delegate = self
audioRecorder.isMeteringEnabled = true
audioRecorder.prepareToRecord()
audioRecorder.record()
}
dirPath находит каталог, в котором будет храниться изображение.
recordingName установит имя фактически записанного файла
filepath объединяет каталог и recordingName для конечного местоположения
Остальные в значительной степени говорят сами за себя.
Затем создайте кнопку паузы, которая проще:
@IBAction func pauseButton(_ sender: Any) {
audioRecorder.stop()
let audioSession = AVAudioSession.sharedInstance()
try! audioSession.setActive(false)
}
Это должно решить, как вы записываете аудио.
Возникла та же проблема. Это произошло потому, что не удалось создать файл, когда я звоню.
[_audioRecorder prepareToRecord];
Исправьте это, создав пустой файл вручную.
// Fix strange prepareToRecord Glich
NSFileManager *fileManager = [NSFileManager defaultManager];
Boolean isFileCreated = [fileManager createFileAtPath:outputFileURL.path contents:NULL attributes:NULL];