我将 installTap 缓冲区写入 AVAudioFile 似乎失败了 data-wise
My writing the installTap buffer to an AVAudioFile seems to fail data-wise
我正在尝试将 installTap 的缓冲区保存到一个文件中。我以 10 个为一组进行,所以我会得到一个更大的文件。当我尝试播放写入的文件(来自模拟器的目录)时,QuickTime 说它不兼容。
我检查了错误的 m4a 文件和一个有效的文件。开头的坏文件中有很多零,然后是很多数据。但是,这两个文件似乎具有相同的 header.
很多人提到我必须将 AudioFile 设为 nil,但是:
audioFile = 无
不是有效语法,我也无法在 AudioFile 中提交关闭方法。
这是完整的代码,已编辑成一个工作文件:
import UIKit
import AVFoundation
class ViewController: UIViewController {
let audioEngine = AVAudioEngine()
var audioFile = AVAudioFile()
var x = 0
override func viewDidLoad() {
super.viewDidLoad()
record()
// Do any additional setup after loading the view.
}
func makeFile(format: AVAudioFormat) {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
do {
_ = try FileManager.default.contentsOfDirectory(at: paths!, includingPropertiesForKeys: nil)
} catch { print ("error")}
let destinationPath = paths!.appendingPathComponent("audioT.m4a")
print ("\(destinationPath)")
do {
audioFile = try AVAudioFile(forWriting: destinationPath,
settings: format.settings)
print ("file created")
} catch { print ("error creating file")}
}
func record(){
let node = audioEngine.inputNode
let recordingFormat = node.inputFormat(forBus: 0)
makeFile(format: recordingFormat)
node.installTap(onBus: 0, bufferSize: 8192, format: recordingFormat, block: { [self]
(buffer, _) in
do {
try audioFile.write(from: buffer);
print ("buffer filled");
x += 1;
print("wrote \(x)")
if x > 9 {
endThis()
}
} catch {return};})
audioEngine.prepare()
do {
try audioEngine.start()
} catch let error {
print ("oh catch")
}
}
func endThis(){
audioEngine.stop()
audioEngine.inputNode.removeTap(onBus: 0)
}
}
你需要让你的 AVAudioFile
超出范围(nil
在某些时候),这就是你调用 AVAudioFile
的 close()
方法的方式,它大概写完头信息了。
我正在尝试将 installTap 的缓冲区保存到一个文件中。我以 10 个为一组进行,所以我会得到一个更大的文件。当我尝试播放写入的文件(来自模拟器的目录)时,QuickTime 说它不兼容。
我检查了错误的 m4a 文件和一个有效的文件。开头的坏文件中有很多零,然后是很多数据。但是,这两个文件似乎具有相同的 header.
很多人提到我必须将 AudioFile 设为 nil,但是:
audioFile = 无
不是有效语法,我也无法在 AudioFile 中提交关闭方法。
这是完整的代码,已编辑成一个工作文件:
import UIKit
import AVFoundation
class ViewController: UIViewController {
let audioEngine = AVAudioEngine()
var audioFile = AVAudioFile()
var x = 0
override func viewDidLoad() {
super.viewDidLoad()
record()
// Do any additional setup after loading the view.
}
func makeFile(format: AVAudioFormat) {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
do {
_ = try FileManager.default.contentsOfDirectory(at: paths!, includingPropertiesForKeys: nil)
} catch { print ("error")}
let destinationPath = paths!.appendingPathComponent("audioT.m4a")
print ("\(destinationPath)")
do {
audioFile = try AVAudioFile(forWriting: destinationPath,
settings: format.settings)
print ("file created")
} catch { print ("error creating file")}
}
func record(){
let node = audioEngine.inputNode
let recordingFormat = node.inputFormat(forBus: 0)
makeFile(format: recordingFormat)
node.installTap(onBus: 0, bufferSize: 8192, format: recordingFormat, block: { [self]
(buffer, _) in
do {
try audioFile.write(from: buffer);
print ("buffer filled");
x += 1;
print("wrote \(x)")
if x > 9 {
endThis()
}
} catch {return};})
audioEngine.prepare()
do {
try audioEngine.start()
} catch let error {
print ("oh catch")
}
}
func endThis(){
audioEngine.stop()
audioEngine.inputNode.removeTap(onBus: 0)
}
}
你需要让你的 AVAudioFile
超出范围(nil
在某些时候),这就是你调用 AVAudioFile
的 close()
方法的方式,它大概写完头信息了。