Swift 4调用mediainfo获取视频帧率时参数无效问题求助
解决Swift中调用mediainfo时参数无效的问题
嘿,这个问题我碰到过!问题出在你给arguments里的参数加了多余的引号,导致mediainfo没法正确识别这个--Inform参数。
为什么原来的写法不对?
在终端里用引号包裹--Inform="Video;%FrameRate%",是因为shell会把分号当成命令分隔符,引号的作用是告诉shell把整个字符串作为一个独立参数。但Swift的Process是直接把数组里的每个元素作为独立参数传递给目标程序,完全不需要经过shell解析——所以你加的引号会被当成参数的一部分传给mediainfo,也就是说mediainfo收到的参数是--Inform=\"Video;%FrameRate%\"(带引号),而不是它期望的--Inform=Video;%FrameRate%,自然就会忽略这个无效参数。
正确的写法
只需要去掉参数里的引号,直接传递格式正确的参数即可:
let taskfindfps = Process() taskfindfps.launchPath = "/Users/Lorenzo/mediainfo" // 去掉多余的引号,直接传递参数 taskfindfps.arguments = ["--Inform=Video;%FrameRate%", myVideo] let pipefindfps = Pipe() taskfindfps.standardOutput = pipefindfps // 启动任务并处理输出 taskfindfps.launch() taskfindfps.waitUntilExit() // 读取并解析帧率结果 let outputData = pipefindfps.fileHandleForReading.readDataToEndOfFile() if let frameRateStr = String(data: outputData, encoding: .utf8) { let cleanFrameRate = frameRateStr.trimmingCharacters(in: .whitespacesAndNewlines) print("视频帧率:\(cleanFrameRate)") }
补充小提示
- 你可以通过
taskfindfps.terminationStatus判断任务是否执行成功,如果返回非0值,说明可能有错误,可以读取standardError的内容排查问题。 - Swift 4里用
launchPath和arguments是完全没问题的,后续版本虽然有新的API,但这个写法依然兼容。
内容的提问来源于stack exchange,提问作者DePa
相关产品推荐
相关产品推荐

