【问题标题】:Swift and NSTask hangsSwift 和 NSTask 挂起
【发布时间】:2014-09-07 12:23:13
【问题描述】:

我是 Mac 世界的新手。我正在使用 Swift,我正在尝试一次运行一个外部进程。 现在一切正常,只要它经过调试,我的意思是:在 Xcode 中运行并附加调试器。

我没有更改任何内容并尝试在终端窗口中运行它,它位于“调试”文件夹中。现在外部进程启动但挂起。有一些 STDERR 输出,我已经将其关闭。并且有外部Task的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()

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

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

【问题讨论】:

    标签: xcode swift nstask


    【解决方案1】:

    您需要从/dev/null 重定向标准输入。 ffmpeg 有一个开放的标准输入,正在等待该管道上的更多数据。

    video.standardInput = NSFileHandle.fileHandleWithNullDevice()
    

    请注意,您不需要分配给standardErrorstandardOutput。这些是默认设置。

    这在 Xcode 中有效,因为调试器会为您关闭标准输入。

    【讨论】:

    • 感谢您的解决方案,完美运行。我想知道您是否有任何资源来帮助理解为什么关闭standardInput 会解决这个问题?谢谢!
    • @HonghaoZhang 查看ffmpeg.org/ffmpeg.html 并阅读-stdin 上的文档。正如它所指出的,您还可以通过将-nostdin 作为参数而不是关闭标准输入来解决此问题。他们列出的< /dev/null 的解决方案与这个答案相同(只是shell 方式而不是Swift 方式)。
    • 非常感谢!如果进程在后台运行,使用-nostdin 会好得多。
    猜你喜欢
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多