我可以让 AudioKit appendAsynchronously 创建一个名称不是“.caf”的文件,并以 .mp4 格式输出吗?
Can I get AudioKit appendAsynchronously to create a file with name other than '.caf', and to output in .mp4 format?
我在iOS下有如下AudioKit使用场景:
- 我用麦克风录音。
- 我将声音异步保存到 tmp 目录作为 .mp4 文件。
- 我从麦克风录制第二个声音。
- 我尝试 (a) 检索以前保存的 .mp4 文件,以及 (b) 异步附加第二个麦克风声音。
我的问题是,虽然此过程确实成功,但附加文件以文件名“.caf”保存(字面意思就是这样,扩展名前没有任何内容)。
理想情况下,我希望通过某种方式强制附加文件具有更易于管理的名称。如果附加文件可以是.mp4格式也很好。
以下代码足以重现问题:
导入 SwiftUI
导入 AudioKit
构造 ContentView:视图 {
@State private var mic: AKMicrophone!
@State private var micBooster: AKBooster!
@State private var micRecorder: AKNodeRecorder!
var body: some View {
Button(action: {
self.recordFirstSound()
}) {
Text("Start")
}
}
func recordFirstSound() {
AKAudioFile.cleanTempDirectory()
AKSettings.audioInputEnabled = true
AKSettings.defaultToSpeaker = true
do {
try AKSettings.setSession(category: .multiRoute)
} catch {
print("Failed to set session category to .playAndRecord");
}
AKSettings.bufferLength = .medium
mic = AKMicrophone()
micBooster = AKBooster()
mic >>> micBooster
micBooster.gain = 0.0
do {
micRecorder = try AKNodeRecorder(node: mic)
} catch {
print("Failed to initialise micRecorder")
}
AudioKit.output = micBooster
do {
try AudioKit.start()
} catch {
print("Failed to start AudioKit")
}
do {
try micRecorder.record()
} catch {
print("Failed to start micRecorder")
}
DispatchQueue.main.asyncAfter(deadline: .now() + 5 , execute: {
self.writeRecordingToTmpDir()
})
}
func writeRecordingToTmpDir() {
micRecorder.stop()
if let recorderAudioFile = micRecorder.audioFile {
recorderAudioFile.exportAsynchronously(name: "recording",
baseDir: .temp,
exportFormat: .mp4, callback: callbackAfterInitialExport)
} else {
print("Problem accessing micRecorder audioFile")
}
DispatchQueue.main.asyncAfter(deadline: .now() + 5 , execute: {
self.recordSecondSound()
})
}
func recordSecondSound() {
do {
try micRecorder.reset()
} catch {
print("Failed to reset micRecorder")
}
do {
try micRecorder.record()
} catch {
print("Failed to re-start micRecorder")
}
DispatchQueue.main.asyncAfter(deadline: .now() + 5 , execute: {
self.appendSecondSoundFileToFirstAsynchronously()
})
}
func appendSecondSoundFileToFirstAsynchronously() {
micRecorder.stop()
do {
let existingMp4File = try AKAudioFile(readFileName: "recording.mp4", baseDir: .temp)
if let micRecorderAudioFile = micRecorder.audioFile {
existingMp4File.appendAsynchronously(file: micRecorderAudioFile, completionHandler: callbackAfterAsynchronousAppend)
}
} catch {
print("Failed to read or append recording.mp4")
}
}
func callbackAfterInitialExport(processedFile: AKAudioFile?, error: NSError?) {
if let file = processedFile {
print("Asynchronous export of \(file.fileNamePlusExtension) succeeded")
print("Exported file duration: \(file.duration) seconds")
} else {
print("Asynchronous export failed")
}
}
func callbackAfterAsynchronousAppend(processedFile: AKAudioFile?, error: NSError?) {
if let file = processedFile {
print("Asynchronous append succeeded. New file is \(file.fileNamePlusExtension)")
print("Duration of new file: \(file.duration) seconds")
} else {
print("Asynchronous append failed")
}
}
}
没有为 appendAsynchronously 调用填充适当的参数。调用应该是:
如果让 micRecorderAudioFile = micRecorder.audioFile {
existingMp4File.appendAsynchronously(文件:micRecorderAudioFile,baseDir:.temp,名称:“录音”,completionHandler:callbackAfterAsynchronousAppend)
}
我在iOS下有如下AudioKit使用场景:
- 我用麦克风录音。
- 我将声音异步保存到 tmp 目录作为 .mp4 文件。
- 我从麦克风录制第二个声音。
- 我尝试 (a) 检索以前保存的 .mp4 文件,以及 (b) 异步附加第二个麦克风声音。
我的问题是,虽然此过程确实成功,但附加文件以文件名“.caf”保存(字面意思就是这样,扩展名前没有任何内容)。
理想情况下,我希望通过某种方式强制附加文件具有更易于管理的名称。如果附加文件可以是.mp4格式也很好。
以下代码足以重现问题:
导入 SwiftUI 导入 AudioKit
构造 ContentView:视图 {
@State private var mic: AKMicrophone!
@State private var micBooster: AKBooster!
@State private var micRecorder: AKNodeRecorder!
var body: some View {
Button(action: {
self.recordFirstSound()
}) {
Text("Start")
}
}
func recordFirstSound() {
AKAudioFile.cleanTempDirectory()
AKSettings.audioInputEnabled = true
AKSettings.defaultToSpeaker = true
do {
try AKSettings.setSession(category: .multiRoute)
} catch {
print("Failed to set session category to .playAndRecord");
}
AKSettings.bufferLength = .medium
mic = AKMicrophone()
micBooster = AKBooster()
mic >>> micBooster
micBooster.gain = 0.0
do {
micRecorder = try AKNodeRecorder(node: mic)
} catch {
print("Failed to initialise micRecorder")
}
AudioKit.output = micBooster
do {
try AudioKit.start()
} catch {
print("Failed to start AudioKit")
}
do {
try micRecorder.record()
} catch {
print("Failed to start micRecorder")
}
DispatchQueue.main.asyncAfter(deadline: .now() + 5 , execute: {
self.writeRecordingToTmpDir()
})
}
func writeRecordingToTmpDir() {
micRecorder.stop()
if let recorderAudioFile = micRecorder.audioFile {
recorderAudioFile.exportAsynchronously(name: "recording",
baseDir: .temp,
exportFormat: .mp4, callback: callbackAfterInitialExport)
} else {
print("Problem accessing micRecorder audioFile")
}
DispatchQueue.main.asyncAfter(deadline: .now() + 5 , execute: {
self.recordSecondSound()
})
}
func recordSecondSound() {
do {
try micRecorder.reset()
} catch {
print("Failed to reset micRecorder")
}
do {
try micRecorder.record()
} catch {
print("Failed to re-start micRecorder")
}
DispatchQueue.main.asyncAfter(deadline: .now() + 5 , execute: {
self.appendSecondSoundFileToFirstAsynchronously()
})
}
func appendSecondSoundFileToFirstAsynchronously() {
micRecorder.stop()
do {
let existingMp4File = try AKAudioFile(readFileName: "recording.mp4", baseDir: .temp)
if let micRecorderAudioFile = micRecorder.audioFile {
existingMp4File.appendAsynchronously(file: micRecorderAudioFile, completionHandler: callbackAfterAsynchronousAppend)
}
} catch {
print("Failed to read or append recording.mp4")
}
}
func callbackAfterInitialExport(processedFile: AKAudioFile?, error: NSError?) {
if let file = processedFile {
print("Asynchronous export of \(file.fileNamePlusExtension) succeeded")
print("Exported file duration: \(file.duration) seconds")
} else {
print("Asynchronous export failed")
}
}
func callbackAfterAsynchronousAppend(processedFile: AKAudioFile?, error: NSError?) {
if let file = processedFile {
print("Asynchronous append succeeded. New file is \(file.fileNamePlusExtension)")
print("Duration of new file: \(file.duration) seconds")
} else {
print("Asynchronous append failed")
}
}
}
没有为 appendAsynchronously 调用填充适当的参数。调用应该是:
如果让 micRecorderAudioFile = micRecorder.audioFile { existingMp4File.appendAsynchronously(文件:micRecorderAudioFile,baseDir:.temp,名称:“录音”,completionHandler:callbackAfterAsynchronousAppend) }