首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在不破坏编码视频文件的情况下优雅地关闭在后台运行的ffmpeg进程?

如何在不破坏编码视频文件的情况下优雅地关闭在后台运行的ffmpeg进程?
EN

Stack Overflow用户
提问于 2017-07-25 04:40:41
回答 3查看 4.9K关注 0票数 2

我需要能在需要的时候阻止它。我试着用taskkill /im ffmpeg.exe优雅地终止进程,但是它不起作用。如果我强制使用/f,那么视频文件就会被破坏。

我认为其他办法可以是:

  • 若要获取进程句柄,然后将q击键发送到在后台运行的进程的stdin,请执行以下操作。
  • 再次获得控制台,这样我就可以从控制台发送输入。
  • 若要使用PyHooks和/或Win32Api读取按键,如果按下组合,则写入进程的stdin。

这是我用来创建ffmpeg.exe进程的代码(ffmpeg.exe),隐藏着:

代码语言:javascript
运行
复制
import subprocess
import sys
import os

# Creation flags
DETACHED_PROCESS = 0x00000008
CREATE_NO_WINDOW = 0x08000000
CREATE_NEW_PROCESS_GROUP = 0x00000200

cmd = sys._MEIPASS + os.sep + 'ffmpeg.exe -f dshow -i video=screen-capture-recorder -vcodec libx264 -qp 0 -crf 0 -vf scale=1280x720 -preset ultrafast -an -y out.mp4'
r = subprocess.call(cmd.split(), shell=True) #creationflags=

然后,我使用pyinstaller创建了一个exe文件,其中绑定了ffmpeg

代码语言:javascript
运行
复制
pyinstaller --onefile --noconsole --add-binary ffmpeg.exe;. rec.pyw

我使用了creationflags参数,因为我已经阅读过,通过一个分离的进程,我可以再次创建窗口。但我还没找到办法。

解决办法

我发现,如果我使用.mkv而不是.mp4,那么当从任务管理器中删除ffmpeg进程时,文件不会损坏。

EN

回答 3

Stack Overflow用户

发布于 2020-09-12 14:10:46

下面的链接文章教我如何通过模拟‘q’键键来干净地阻止python中的ffmpeg:

How to stop ffmpeg remotely?

您创建一个空文件,当您准备停止它时,可以将'q‘写到其中。

要用python代码启动ffmpeg流,请执行以下操作:

代码语言:javascript
运行
复制
os.system("<stop /usr/bin/ffmpeg ...") 

准备好在python代码中停止ffmpeg时,请执行以下操作:

代码语言:javascript
运行
复制
os.system("echo 'q' >stop") 
票数 1
EN

Stack Overflow用户

发布于 2017-07-25 06:33:41

在python脚本中,需要使用except语句捕获信号。我不是一个windows用户,所以我不知道unix信号是如何准确地转换到您要发送的内容的,taskkill,但是在python中快速搜索一下如何处理它,然后在but块中调用一个函数,该函数可以完成当前帧的编写,知道在写入该帧之后结束,然后进行清理,这可能会或不需要为文件编写更多的头/元数据,然后关闭文件句柄。

票数 0
EN

Stack Overflow用户

发布于 2020-08-30 17:39:57

问题

ffmpeg不会干净地关闭,因为ffmpeg没有在windows上使用窗口句柄运行,而且只有具有窗口句柄的程序才能捕获taskkill命令发送的taskkill事件。事实上,ffmpeg的设计根本不是为了捕捉WM_CLOSE事件,所以即使您使用start命令为ffmpeg创建窗口句柄,发送taskkill时它也不会优雅地关闭。

解决方案

唯一真正的解决方案是修改ffmpeg本身,或者创建一个具有窗口句柄并能够捕获WM_CLOSE事件的包装程序。

我遇到了同样的问题,创建了一个包装程序来处理WM_CLOSE事件,并优雅地关闭了ffmpeg。它是用nim编写的,所以您必须编译它,或者可以从发布页面获取一个版本:

wrapper

您可以使用包装器启动ffmpeg,并使用taskkill关闭包装程序的PID。当包装器获得WM_CLOSE事件时,它优雅地关闭ffmpeg进程。您可以使用mp4或任何您需要的编码。

ffmpeg_wrap.exe ffmpeg.exe -rtbufsize 150M -f gdigrab -framerate 30 -offset_x 448 -offset_y 240 -video_size 1024x600 -draw_mouse 1 -show_region 1 -i desktop -r 30 -preset ultrafast -tune zerolatency -movflags +faststart screen-recording.mp4

运行它并打开任务管理器,获取ffmpeg_wrap.exe进程的ffmpeg_wrap.exe并发送taskkill

要在python中使用它,只需启动ffmpeg_wrap进程并获取PID,然后在PID上运行taskkill (您可以在相同的脚本中这样做),当您希望它优雅地关闭ffmpeg时。

抓到

此程序依赖于python文件。我对nim很陌生,我知道如何在不挂起的情况下打开ffmpeg进程的唯一方法是使用pythonsubprocess模块。任何具有subprocess模块的python文件都应该可以工作。我使用python3.8.dll,所以这绝对是可行的。此文件应位于:

C:/Users/username/AppData/Local/Microsoft/WindowsApps

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45294069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档