python - 使用 selenium python 从 FFMPEG 输出总是损坏
问题描述
我尝试使用 selenium python 运行测试用例,并希望在每个测试用例上录制视频,但是当我尝试时输出总是损坏。FFMPEG 进程正在运行,输出行上没有出现错误。我附上了我的代码,请任何人帮助我是否需要添加或删除任何内容
这是第一个文件,用于记录器:
import subprocess
from subprocess import Popen
from subprocess import call
class recorderMethod():
videoRecording = None
@staticmethod
def recorder_start(res,name):
rec_lib = 'ffmpeg -y -rtbufsize 2000M -f dshow -i video="screen-capture-recorder" -s '
resolution = res
buffer = ' -b:v 512k -r 20 -vcodec libx264 '
filename = name
extension = '.mp4'
complete_command = rec_lib+resolution+buffer+filename+extension
recorderMethod.videoRecording = Popen(str(complete_command))
@staticmethod
def recorder_stop():
if recorderMethod.videoRecording.poll() is None:
call('taskkill /F /T /PID ' + str(recorderMethod.videoRecording.pid))
这是录制视频的主要测试文件
import unittest
import recorder_main
from selenium import webdriver
from time import sleep
class recordingTest(unittest.TestCase):
#init test
browser = webdriver.Chrome()
baseurl = 'http://www.facebook.com/'
record = recorder_main.recorderMethod
#setup
def setUp(self):
#declare to use browser
self.driver = recordingTest.browser
#make variable for easy access
driver = self.driver
#maximize Firefox
driver.maximize_window()
#go to maukerja
driver.get(recordingTest.baseurl)
#test001
def test_001_record(self):
#start recording
recordingTest.record.recorder_start('1920x1080','Test_Sleep')
sleep(10)
#stop_recording
recordingTest.record.recorder_stop()
#teardown
def test_999_ShutDownTest(self):
self.driver.close()
if __name__ == '__main__':
unittest.main(exit=False)
解决方案
您需要优雅地停止 FFmpeg:
您可以使用以下代码:
import signal
# ...
# https://stackoverflow.com/questions/9722624/how-to-stop-ffmpeg-remotely
# https://stackoverflow.com/questions/27356837/send-sigint-in-python-to-os-system
def recorder_stop():
if recorderMethod.videoRecording.poll() is None:
recorderMethod.videoRecording.send_signal(signal.CTRL_C_EVENT)
sleep(3) # To be sure that the process ends
您用于关闭 FFmpeg 的代码是:
call('taskkill /F /T /PID ' + str(recorderMethod.videoRecording.pid))
使用taskkill关闭 FFmpeg会导致文件损坏。
FFmpeg 未完成将视频流写入输出文件就终止。
在旧版本的 FFmpeg 中,按Q停止录制(我不知道几岁)。
对于新版本,按Ctrl-C停止录制。
假设我们使用的是新版本。
发送signal.CTRL_C_EVENT
相当于按 Ctrl-C 退出。
注意:
如果您希望 FFmpeg 记录屏幕 10 秒并终止,您可以添加-t 10
(输出)参数,而不执行recorder_stop()
.
推荐阅读
- javascript - 具有最大高度溢出的 CSS 过渡隐藏“模拟”过渡
- sql - 连接存储在同一列中的多行整数?
- spring-boot - 连接超时:在 docker 容器中使用 SSL 调试 RestTemplate API GET 请求
- symfony - Doctrine QueryBuilder 计数和选民
- reactjs - 如何使用样式化组件来定位 Material UI Dialog 的背景颜色属性?
- javascript - Tizen 可穿戴网络应用程序弹出按钮图像未显示
- c# - 在 docker 上获取 asp.net 核心 Web API 应用程序的值的问题
- python-3.x - 如何订购这种类型的元素的双重列表:[[1,2,3],[a,b,c]]?
- ruby-on-rails - Rails 4 Params 允许以数组为值的对象数组
- android - 从子节点跳转到 Firebase 父节点