4 votes

Sortie toujours corrompue de FFMPEG en utilisant selenium python

J'essaie d'exécuter un testcase en utilisant Selenium Python et je veux enregistrer une vidéo sur chaque testcase, mais quand j'essaie, la sortie est toujours corrompue. Le processus FFMPEG est en cours d'exécution, aucune erreur n'apparaît sur la ligne de sortie. Je joins mon code, s'il vous plaît quelqu'un peut m'aider s'il y a quelque chose que je dois ajouter ou enlever.

voici le premier fichier, pour enregistreur :

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))

voici le fichier de test principal pour enregistrer la vidéo

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)

2voto

Rotem Points 3340

Vous devez arrêter gracieusement FFmpeg :

Vous pouvez utiliser le code suivant :

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  

Le code que vous utilisez pour fermer FFmpeg est :

call('taskkill /F /T /PID ' + str(recorderMethod.videoRecording.pid))

Fermeture de FFmpeg en utilisant exécution des tâches Il en résulte un fichier corrompu.
FFmpeg se termine sans avoir fini d'écrire le flux vidéo dans le fichier de sortie.

Dans les anciennes versions de FFmpeg, l'enregistrement est arrêté en appuyant sur la touche Q (Je ne sais pas quel âge).
Pour les nouvelles versions, l'enregistrement est arrêté en appuyant sur Ctrl-C .
Supposons que nous utilisons une nouvelle version.

Envoi de signal.CTRL_C_EVENT est équivalent à quitter en appuyant sur Ctrl-C.


Nota:
Dans le cas où vous voulez que FFmpeg enregistre l'écran pendant 10 secondes et se termine, vous pouvez ajouter -t 10 (sortie), sans exécuter recorder_stop() .

0voto

Didit Setiawan Points 55

D'abord je change cette ligne

rec_lib          = 'ffmpeg -y -rtbufsize 2000M -f dshow  -i video="screen-capture-recorder" -s '

dans cette ligne

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 '

et puis pour arrêter j'ajoute ceci :

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))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X