使用selenium python的FFMPEG输出总是损坏
我尝试使用selenium python运行testcase,并希望在每个testcase上录制视频,但当我尝试时,输出总是被破坏。FFMPEG进程正在运行,输出行上没有出现错误。我附上我的代码,请任何人帮助我有什么我需要添加或删除 这是第一个文件,用于记录器:使用selenium python的FFMPEG输出总是损坏,python,selenium,ffmpeg,Python,Selenium,Ffmpeg,我尝试使用selenium python运行testcase,并希望在每个testcase上录制视频,但当我尝试时,输出总是被破坏。FFMPEG进程正在运行,输出行上没有出现错误。我附上我的代码,请任何人帮助我有什么我需要添加或删除 这是第一个文件,用于记录器: import subprocess from subprocess import Popen from subprocess import call class recorderMethod(): videoRecordin
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: 您可以使用以下代码:
导入信号
# ...
# https://stackoverflow.com/questions/9722624/how-to-stop-ffmpeg-remotely
# https://stackoverflow.com/questions/27356837/send-sigint-in-python-to-os-system
def记录器_停止():
如果recorderMethod.videoRecording.poll()为无:
录像机方法。录像。发送信号(signal.CTRL\u\u事件)
睡眠(3)#确保过程结束
用于关闭FFmpeg的代码是:
call('taskkill /F /T /PID ' + str(recorderMethod.videoRecording.pid))
使用taskkill关闭FFmpeg会导致文件损坏。FFmpeg在未将视频流写入输出文件的情况下终止 在旧版本的FFmpeg中,通过按Q停止录制(我不知道有多旧)。
对于新版本,按Ctrl-C键停止录制 假设我们使用的是新版本 发送
信号。CTRL\u C\u事件
相当于按CTRL-C退出
注:
如果希望FFmpeg录制屏幕10秒并终止,可以添加
-t10
(输出)参数,而无需先执行recorder\u stop()
rec_lib = 'ffmpeg -y -rtbufsize 2000M -f dshow -i video="screen-capture-recorder" -s '
rec_lib = 'ffmpeg -y -rtbufsize 2000M -f dshow -i video="screen-capture-recorder" -b:v 512k -r 20 -vcodec libx264 -strict -2 -preset slow -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -f mp4 '
进入这一行
rec_lib = 'ffmpeg -y -rtbufsize 2000M -f dshow -i video="screen-capture-recorder" -s '
rec_lib = 'ffmpeg -y -rtbufsize 2000M -f dshow -i video="screen-capture-recorder" -b:v 512k -r 20 -vcodec libx264 -strict -2 -preset slow -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -f mp4 '
为了停止,我添加了以下内容:
recorderMethod.videoRecording.stdin.write('q'.encode("GBK"))
recorderMethod.videoRecording.communicate()
if recorderMethod.videoRecording.poll() is None:
call('taskkill /F /T /PID ' + str(recorderMethod.videoRecording.pid))
您使用的是哪个版本的Chrome和ChromeDriver?包括您的操作系统版本,甚至可能包括您使用的视频卡,这可能对您的问题有好处。您是对的,我不会在FFMPEG编码文件时优雅地停止它,而且我在开始录制时会更改配置,我会在新的答案上发布