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
(用于放置第一个提供的数据包的数据包索引。)
您怎么看?任何想法都可以帮助您,谢谢。