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

驗證結果:驗證成功

三:需求實現

功能流程圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM