#swift #avfoundation #ios8 #beta
#swift #avfoundation #ios8 #бета
Вопрос:
У меня возникла проблема с записью данных с использованием AVAudioEngine и AVAudioFile с использованием новой платформы AVFoundation в бета-версии iOS 8.
Я хотел бы записывать данные, используя нажатие на входной узел, используя формат m4a. Однако выходной файл, похоже, поврежден, но формат файла изменен на .aac с точно такими же настройками файл правильно сформирован и может быть успешно воспроизведен:
import Foundation
import AVFoundation
func captureMicrophoneInput() {
var error : NSError?
var audioFileSettings = Dictionary<NSObject, AnyObject>()
audioFileSettings[AVFormatIDKey] = kAudioFormatMPEG4AAC
audioFileSettings[AVNumberOfChannelsKey] = 1
audioFileSettings[AVSampleRateKey] = 44100.0
audioFileSettings[AVEncoderBitRatePerChannelKey] = 16
audioFileSettings[AVEncoderAudioQualityKey] = AVAudioQuality.Medium.toRaw()
let audioEngine = AVAudioEngine()
let inputNode = audioEngine.inputNode
// by using .acc the output file can be played successfully
let url : CFURL = NSURL.fileURLWithPath("/path/to/outputdir/myFileWithProblematicExtension.m4a") as CFURL
var audioFile = AVAudioFile(forWriting: url, settings: audioFileSettings, error: amp;error)
if error != nil {
println("AVAudioFile error")
println(error)
return
}
// Write the output of the input node to disk
inputNode.installTapOnBus(0, bufferSize: 4096,
format: inputNode.outputFormatForBus(0),
block: { (audioPCMBuffer : AVAudioPCMBuffer!, audioTime : AVAudioTime!) in
audioFile.writeFromBuffer(audioPCMBuffer, error: amp;error)
if error != nil {
println("AVAudioFile error")
println(error)
return
}
})
audioEngine.startAndReturnError(amp;error)
}
Я был бы рад, если бы кто-нибудь мог внести свой вклад в это. Спасибо!
Комментарии:
1. Ошибка с идентификатором 17495706 была отправлена в Apple.
2. Вы изменили свои настройки, чтобы использовать kAudioFormatAppleLossless для AVFormatIDKey?
3. Вам когда-нибудь удавалось решить эту проблему? У меня такая же проблема. Использование .acc работает нормально, а .m4a — нет
Ответ №1:
Мой код Swift также не может записывать в формат MPEG4AAC, начиная с XCode 6.0 / Swift 1.0 GM. По-видимому, константа kAudioFormatMPEG4AAC по-прежнему определена неправильно. Файл создан, но не заполнен никакими звуковыми образцами.
Единственным обходным путем, который я смог найти, было создание словаря настроек в вспомогательной функции Objective C.:
(NSDictionary *)getRecorderSettings
{
return @{AVFormatIDKey: @(kAudioFormatMPEG4AAC),
AVNumberOfChannelsKey: @(1),
AVSampleRateKey:@(22050),
AVEncoderAudioQualityKey: @(AVAudioQualityHigh)};
}
и передайте это обратно в код Swift для инициализации AVAudioRecorder:
_recorder = AVAudioRecorder(URL: fileURL, settings: recsettings, error: amp;initRecorderError)
Комментарии:
1. Ваш обходной путь не нужен: вы также можете создать NSNumber из кода swift. например, что-то вроде [AVFormatIDKey: NSNumber(unsignedInt: kAudioFormatMPEG4AAC), AVNumberOfChannelsKey: NSNumber(unsignedInt:2), AVSampleRateKey: NSNumber(double: 44100.0)] отлично работает для я.
2. Вам не нужно создавать AVAudioRecorder для получения аудиоданных, он просто касается микрофона.