利用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_())

验证结果:验证成功

三:需求实现

功能流程图

posted @ 2019-03-26 10:51  Leslie-x  阅读(2580)  评论(0编辑  收藏  举报