Как записать звук с помощью AVAudioEngine с поиском позиции, чтобы перезаписать звук?

Приложение 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 (индекс пакета для размещения первого предоставленного пакета).

Что вы думаете? Любая идея может помочь, спасибо.


person Esmaeil    schedule 30.05.2019    source источник
comment
Вам нужно будет использовать Audio File Services для поиска и записи, а не добавления. Это самый мощный из API аудиофайлов, но не самый интересный.   -  person dave234    schedule 30.05.2019
comment
Спасибо @ dave234 У меня есть еще один вопрос, могу ли я одновременно использовать AVAudioEngine и Audio File Services?   -  person Esmaeil    schedule 30.05.2019