zoukankan      html  css  js  c++  java
  • 利用QT、QWebview、ffmpeg实现的屏幕录制方案

    一:方案需求

    将用户录制的动画和语音录制成视频

    二:分解需求

    视频录制功能
    方案设计:使用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_())

    验证结果:验证成功

    三:需求实现

    功能流程图

  • 相关阅读:
    node.js 与java 的主要的区别是什么
    基于Node.js+MySQL开发的开源微信小程序B2C商城(页面高仿网易严选)
    Linux下SVN安装配置
    Linux查看CPU和内存使用情况
    Linux添加/删除用户和用户组
    java远程调试
    springboot和mybatis集成,自动生成model、mapper,增加mybatis分页功能
    客户端、服务端,跨域访问设置
    HTTP和HTTPS协议
    KMP算法代码
  • 原文地址:https://www.cnblogs.com/li1992/p/10598755.html
Copyright © 2011-2022 走看看