从 Qt 中杀死 ffmpeg 会导致视频文件损坏
Posted
技术标签:
【中文标题】从 Qt 中杀死 ffmpeg 会导致视频文件损坏【英文标题】:Killing ffmpeg from Qt results in a corrupt video file 【发布时间】:2014-08-10 06:16:24 【问题描述】:我正在使用 Qt 在 Windows 7 上记录来自 Mobotix 摄像头的流数据。我使用的命令是:
ffmpeg -f mjpeg -i "http://admin:password@192.168.0.100/control/faststream.jpg?stream=full" -c:v libx264 -preset slow -crf 22 -c:a copy out.mp4
这在命令行中运行良好,当我想停止它时,我只需按 Ctrl-C。但我是通过 QProcess 从使用 Qt 5.2 的应用程序中执行此操作的。 10 分钟后,我想停止录制,所以我尝试了QProcess::terminate(),但这并没有停止。 QProcess::kill() 有效,但无法播放生成的视频。 This answer 建议我这样做是正确的。
我连接到QProcess::finished(),所以当我调用 QProcess::kill() 时,结果是:
int exitCode = 62097 QProcess::ExitStatusexitStatus = QProcess::CrashExitApparently 这是 Qt 在杀死进程时使用的返回码。
那么我有没有其他方法可以优雅地终止进程(与按 Ctrl-C 相同)或通过 ffmpeg 库执行相同的功能以便我可以正确停止它?
【问题讨论】:
你为什么在AVI
容器中使用H.264
视频?您可以尝试输出到.mp4
或.mkv
文件吗?
抱歉,剪切粘贴出错。
【参考方案1】:
我解释了在该线程中处理相同问题的正确方法: http://qt-project.org/forums/viewthread/47654/
它非常简单,您只需发送 q 作为退出信号,这是一个简单的示例:
myProcess->setProcessChannelMode(QProcess::ForwardedChannels);
myProcess->write("q");
myProcess->closeWriteChannel();
请记住,您也必须退出您的父进程...祝您好运。
【讨论】:
【参考方案2】:Qt 没有可移植的方式来做到这一点。但是,您可以使用 QProcess::processId()
来获取您可以使用的本机进程 PID。在POSIX-complitable
系统上,您可以使用kill(pid, SIGINT)
发送Ctrl-C
。只需包括signal.h
和sys/types.h
。在 Windows 上更难,看看这个问题:link
【讨论】:
不幸的是 QProcess::processId() 说“这个功能是在 Qt 5.3 中引入的”,我目前正在使用 Qt 5.2。我必须改用 QProcess::pid()。以上是关于从 Qt 中杀死 ffmpeg 会导致视频文件损坏的主要内容,如果未能解决你的问题,请参考以下文章