如何解决从Pipestdout获取ffmpeg信息
我想打电话给ffmpeg来获取视频文件的持续时间。在OSX Terminal中使用命令时,一切正常:
ffmpeg -i MyVideo.MOV 2>&1 | grep "Duration"
我明白了:
Duration: 00:01:23.53,start: 0.000000,bitrate: 39822 kb/s
对我来说很完美。但是现在我从代码中尝试了此调用:
func shell(launchPath: String,arguments: [String]) -> String
{
let task = Process()
task.launchPath = launchPath
task.arguments = arguments
let pipe = Pipe()
task.standardOutput = pipe
do {
try task.run()
// task.launch() till 10.12,but now catchable!
} catch let error as NSError {
print(error.localizedDescription)
return ""
}
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output: String = NSString(data: data,encoding: String.Encoding.utf8.rawValue)! as String
return output
}
此代码对所有其他外部命令都适用。但是这里出现错误:
[NULL @ 0x107808800] Unable to find a suitable output format for '2>&1'
2>&1: Invalid argument
我这样定义ffmpeg的参数:
let arguments = ["-i",video.path,"2>&1","|","grep \"Duration\"" ]
即使我将它们全部作为一个较大的字符串放在一个参数中,它也不起作用。使用“ pipe:1”代替“ 2>&1”以及其他参数也会导致错误。
任何想法,我如何使它起作用?
解决方法
2>&1
意味着standardError(Output)中的所有内容都进入了standardOutput。
嗯,您真的不需要那个吗?
为什么不直接读取standardError(Output)而自己做grep?
let pipe = Pipe()
task.standardError = pipe
... //task.run()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output: String = String(data: data,encoding: .utf8)
顺便说一句,让我们避免使用NSString
并将其重新广播到String
中。
我们也自己做grep
。
let durationLine = output.components(separatedBy: .newlines).first(where: { $0.contains("Duration") })
步骤:让我们获得一个新行数组,并找到带有“ Duration”的第一行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。