从 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::CrashExit

Apparently 这是 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.hsys/types.h。在 Windows 上更难,看看这个问题:link

【讨论】:

不幸的是 QProcess::processId() 说“这个功能是在 Qt 5.3 中引入的”,我目前正在使用 Qt 5.2。我必须改用 QProcess::pid()。

以上是关于从 Qt 中杀死 ffmpeg 会导致视频文件损坏的主要内容,如果未能解决你的问题,请参考以下文章

QT+ffmpeg+多线程的视频播放器的基本使用

Qt音视频开发09-ffmpeg内核音视频同步

使用 FFmpeg 将一个视频处理为多个输出会导致最后一个输出中没有音频

FFMPEG 转码器产生损坏的视频

FFmpeg+Qt视频进度条控制——点击跳转和拖动跳转

一Windows 音视频开发环境搭建