利用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(self, cmd: 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_())
验证结果:验证成功
三:需求实现
功能流程图
Ideal are like the stars --- we never reach them ,but like mariners , we chart our course by them