利用QT、QWebview、ffmpeg實現的屏幕錄製方案

一:方案需求

將用戶錄製的動畫和語音錄製成視頻 python

二:分解需求

視頻錄製功能
方案設計:使用ffmpeg錄製,視頻格式爲mp4,錄製平臺爲windows
方案驗證:在windows平臺cmd中使用如下命令:ffmpeg -f gdigrab -offset_x 18 -offset_y 90 -video_size 1376x768 -i desktop -f dshow -i audio="virtual-audio-capturer" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -r 24 -y -acodec aac -ac 1 -ar 44100 -ab 64k d:\\out.mp4
驗證結果:錄製成功
定製錄製頁面
方案設計:定製錄製頁面;獲取url中的pk,到後臺請求history渲染
方案驗證:定製錄製頁面路由示例:http://127.0.0.1:8010/screen/capture/?pk=476
驗證結果:驗證成功
利用gearman分佈式任務系統,下發任務
方案設計:實現線上任務下發到本地windows機器中
方案驗證:
client = GearmanClient(['localhost:4730', ])
url = "http://127.0.0.1:8010/screen/shot/?pk=%s" % id
client.submit_job("convert2image", json.dumps(url))

convert_worker =GearmanWorker(['http://127.0.0.1:4730', ])
convert_worker.set_client_id('convert')
convert_worker.register_task('convert2image'self.task_listener)
def task_listener(self, gearman_worker, request):
      print(request.data)

驗證結果:驗證成功
利用Webdriver加載錄製頁面
方案設計:使用Webdriver加載錄製頁面,播放動畫
方案驗證:
option = ChromeOptions()
option.add_argument('--disable-gesture-requirement-for-media-playback')
option.add_argument('--window-size=1366,868')
option.add_argument('--disable-infobars')
driver = Chrome(chromedriver.exe, chrome_options=option)
driver.get("www.baidu.com")
驗證結果:驗證成功
QThread運行gearmanworker接受任務
方案設計:單線程運行woker接受任務
方案驗證:

class Worker(QThread):

    def __init__(self):
        super().__init__()
        self.worker = None

    def run(self):
        self.worker = self.init_worker()
        self.worker.work()

    def init_worker(self):
        convert_worker = GearmanWorker(['http://127.0.0.1:4730', ])
        convert_worker.set_client_id('convert2image')
        convert_worker.register_task('convert2image'self.task_listener)
        return convert_worker

    def task_listener(self, gearman_worker, request):
        print(request.data)

驗證結果:驗證成功
QProcess執行錄製命令
方案設計:調用cmd執行視頻錄製命令,能夠主動中止命令運行
方案驗證:
class RecordProcess(QProcess):
    def start(selfcmd: str, *__args):
        super().start(cmd, *__args)

    def quit(self):
        self.writeData(b'q')
驗證結果:驗證成功
自定義django command啓動任務
方案設計:執行command運行任務
方案驗證:
class Command(BaseCommand):

    def handle(self, *args, **options):
        app = QApplication(sys.argv)
        win = MainWindow()
        win.show()
        app.exit(app.exec_())

驗證結果:驗證成功

三:需求實現

功能流程圖web

相關文章
相關標籤/搜索