首页 > 解决方案 > 使用 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)

标签: pythonseleniumffmpeg

解决方案


您需要优雅地停止 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().


推荐阅读