如何使用具有寻找位置的AVAudioEngine录制音频以覆盖声音?

时间:2019-05-30 12:02:45

标签: swift record avaudioengine

Apple的Memos Recorder应用程序可以覆盖以前录制的音频。在录制期间,您可以PAUSE并移回音频并再次录制。我要克隆此功能。

我创建一个AVAudioEngine,并在TAP的输出上安装一个mainMixer,并将PCMBuffer写入文件。我可以将文件保存为不同的线性PCM格式。问题是当我想设置AudioFile.framePosition时会调用EXTAudioFileSeek()函数。苹果公司的文档中提到了该功能:“此功能的行为是打开的文件可以写入。”然后出现以下错误:

EXCEPTION (-66568): "seek to frame in audio file"

这意味着我无法使用此功能在创建用于写入的AudioFile上查找位置。 (我接受)

我想知道我们在Core Audio中是否还有另一个功能可以帮助我从AudioFile上的位置进行书写?

我遵循@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(用于放置第一个提供的数据包的数据包索引。)

您怎么看?任何想法都可以帮助您,谢谢。

0 个答案:

没有答案