Приложение Memos Recorder от Apple может перезаписывать ранее записанный звук. Во время записи вы можете PAUSE
вернуться к аудио и снова записать его. Я хочу клонировать эту функцию.
Я создаю AVAudioEngine
и устанавливаю TAP
на выходе mainMixer
и записываю PCMBuffer
в файл. Я могу сохранить файл в различных линейных форматах PCM. Проблема в том, что когда я хочу установить AudioFile.framePosition
, он вызывает функцию EXTAudioFileSeek()
. Эта функция упоминается в документации Apple: «Поведение этой функции с файлами, открытыми для записи, не определено». Затем я получаю следующую ошибку:
EXCEPTION (-66568): "seek to frame in audio file"
Это означает, что я не могу использовать эту функцию для поиска позиции в AudioFile, созданной для записи. (Я принимаю это)
Я хочу знать, есть ли у нас в Core Audio еще одна функция, которая помогает мне писать с позиции в аудиофайле?
Я следую структуре @RomanTsopin, и она работает правильно.
var engine = AVAudioEngine()
var file: AVAudioFile?
var player = AVAudioPlayerNode() // if you need play record later
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
file = AVAudioFile(forWriting: URLFor("my_file.caf")!, settings: engine.inputNode.inputFormatForBus(0).settings, error: nil)
engine.attachNode(player)
engine.connect(player, to: engine.mainMixerNode, format: engine.mainMixerNode.outputFormatForBus(0)) //configure graph
engine.startAndReturnError(nil)
}
@IBAction func record(sender: AnyObject) {
engine.inputNode.installTapOnBus(0, bufferSize: 1024, format: engine.mainMixerNode.outputFormatForBus(0)) { (buffer, time) -> Void in
self.file?.writeFromBuffer(buffer, error: nil)
return
}
}
@IBAction func stop(sender: AnyObject) {
engine.inputNode.removeTapOnBus(0)
}
func URLFor(filename: String) -> NSURL? {
if let dirs : [String] = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String] {
let dir = dirs[0] //documents directory
let path = dir.stringByAppendingPathComponent(filename)
return NSURL(fileURLWithPath: path)
}
return nil
}
После паузы в записи я хочу изменить положение указателя записи и записать с этой позиции в файл.
Я собираюсь попробовать AudioFileWritePackets
, потому что он получает inStartingPacket
(индекс пакета для размещения первого предоставленного пакета).
Что вы думаете? Любая идея может помочь, спасибо.