我正在写一个Swift Process
,它使用FFMPEG和libfdk_aac
连接一系列音频文件。串联可以工作,但是当我通过该过程传递元数据信息时,会出现Unrecognized option 'metadata artist="ff"' ... Option not found
错误。
在调试时,如果我使用断点并使用e print(args.joined(separator: " "))
进行打印,则可以获取准确的输出并将其粘贴到控制台中,FFMPEG会运行并且不会引发错误。
我假设Swift流程的工作方式有些奇怪,但是即使经过测试,我也感到很困惑。我创建了一个ruby脚本,该脚本将args循环并遍历并打印出来,并且没有给脚本带来任何意外。 (下面的输出)
快速过程
private func export() {
guard let ffmpegPath = Bundle.main.path(forResource: "ffmpeg", ofType: "") else { return }
var task = Process()
task.launchPath = ffmpegPath
let args: [String] = [
"-i",
#"concat:"\#(fileContents)""#,
title(),
artist(),
narrator(),
"-c:a",
"libfdk_aac",
"-vn",
#"\#(exportPath)\#(exportFilename)"#
].compactMap { $0 }
task.arguments = args
var pipe = Pipe()
setStdErrPipe(pipe: &pipe, task: &task)
setTerminationNotification(task: task)
task.launch()
}
func title() -> String? {
guard metadata.titleText != "" else {
return nil
}
return #"-metadata title="\#(metadata.titleText)""#
}
func artist() -> String? {
guard metadata.authorText != "" else { return nil }
return #"-metadata artist="\#(metadata.authorText)""#
}
func narrator() -> String? {
guard metadata.narratorText != "" else { return nil }
return #"-metadata album_artist="\#(metadata.narratorText)""#
}
Arg测试器输出
-i
concat:"/Users/sharkmaul/Downloads/Bringing Up BÈbÈ/Bringing Up BÈbÈ-Part01.mp3|/Users/sharkmaul/Downloads/Bringing Up BÈbÈ/Bringing Up BÈbÈ-Part02.mp3"
-metadata title="title"
-metadata artist="author"
-metadata album_artist="narrator"
-c:a
libfdk_aac
-vn
/Users/sharkmaul/Desktop/068F4F43-89EE-47F6-838D-7AD3E02E7F8A.m4a