我需要能在需要的时候阻止它。我试着用taskkill /im ffmpeg.exe
优雅地终止进程,但是它不起作用。如果我强制使用/f
,那么视频文件就会被破坏。
我认为其他办法可以是:
q
击键发送到在后台运行的进程的stdin,请执行以下操作。这是我用来创建ffmpeg.exe进程的代码(ffmpeg.exe),隐藏着:
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
:
pyinstaller --onefile --noconsole --add-binary ffmpeg.exe;. rec.pyw
我使用了creationflags
参数,因为我已经阅读过,通过一个分离的进程,我可以再次创建窗口。但我还没找到办法。
解决办法
我发现,如果我使用.mkv
而不是.mp4
,那么当从任务管理器中删除ffmpeg进程时,文件不会损坏。
发布于 2020-09-12 14:10:46
下面的链接文章教我如何通过模拟‘q’键键来干净地阻止python中的ffmpeg:
您创建一个空文件,当您准备停止它时,可以将'q‘写到其中。
要用python代码启动ffmpeg流,请执行以下操作:
os.system("<stop /usr/bin/ffmpeg ...")
准备好在python代码中停止ffmpeg时,请执行以下操作:
os.system("echo 'q' >stop")
发布于 2017-07-25 06:33:41
在python脚本中,需要使用except语句捕获信号。我不是一个windows用户,所以我不知道unix信号是如何准确地转换到您要发送的内容的,taskkill
,但是在python中快速搜索一下如何处理它,然后在but块中调用一个函数,该函数可以完成当前帧的编写,知道在写入该帧之后结束,然后进行清理,这可能会或不需要为文件编写更多的头/元数据,然后关闭文件句柄。
发布于 2020-08-30 17:39:57
问题
ffmpeg不会干净地关闭,因为ffmpeg没有在windows上使用窗口句柄运行,而且只有具有窗口句柄的程序才能捕获taskkill
命令发送的taskkill
事件。事实上,ffmpeg的设计根本不是为了捕捉WM_CLOSE
事件,所以即使您使用start
命令为ffmpeg创建窗口句柄,发送taskkill
时它也不会优雅地关闭。
解决方案
唯一真正的解决方案是修改ffmpeg本身,或者创建一个具有窗口句柄并能够捕获WM_CLOSE
事件的包装程序。
我遇到了同样的问题,创建了一个包装程序来处理WM_CLOSE
事件,并优雅地关闭了ffmpeg。它是用nim
编写的,所以您必须编译它,或者可以从发布页面获取一个版本:
您可以使用包装器启动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
https://stackoverflow.com/questions/45294069
复制相似问题