Swift和NSTask挂起

And*_*eas 3 xcode nstask swift

我是Mac世界的新手.我正在使用Swift,我正在尝试一次运行一个外部进程.现在一切正常,因为它被调试,我的意思是:在附带调试器的Xcode中运行.

我没有改变任何东西,并尝试在终端窗口中运行它,从它在"Debug"文件夹中的位置.现在外部进程启动但挂起.有一些STDERR输出,我已经关闭了.外部任务有DiskIO.

let video : NSTask = NSTask()
video.launchPath = "./ffmpeg"
video.arguments = ["-i", "\(item)", "-c:v","copy", "-bsf:v", "h264_mp4toannexb", "-an", "-y", "-loglevel", "quiet", "\(path).h264"]

//also tried without the following two lines
video.standardError = NSFileHandle.fileHandleWithStandardError()
video.standardOutput = NSFileHandle.fileHandleWithStandardOutput()

video.launch()
video.waitUntilExit()
Run Code Online (Sandbox Code Playgroud)

是的:我将所有内容复制到当前路径,以便执行起作用.它从终端运行时启动但挂起.

现在问题出现了:为什么?!我在这做错了什么?简单的解决方案是始终在Xcode中运行它,但正如您可能想象的那样,使用命令行工具非常不方便.

Rob*_*ier 5

你需要重定向stdin /dev/null.ffmpeg有一个打开的stdin,正在等待该管道上的更多数据.

video.standardInput = NSFileHandle.fileHandleWithNullDevice()
Run Code Online (Sandbox Code Playgroud)

请注意,您不需要standardError和和分配standardOutput.这些是默认设置.

这适用于Xcode,因为调试器会关闭stdin.

  • @honghaoZhang 请参阅 http://ffmpeg.org/ffmpeg.html 并阅读有关“-stdin”的文档。正如它所指出的,您还可以通过传递 `-nostdin` 作为参数而不是关闭 stdin 来解决此问题。他们列出的“< /dev/null”解决方案与此答案相同(只是 shell 方式而不是 Swift 方式)。 (2认同)