Qt调用ffmpeg录制屏幕
使用ffmpeg命令行可以進行屏幕錄制,命令行如下:
ffmpeg -f gdigrab -i desktop -framerate 60 -offset_x 0 -offset_y 0 -video_size 1600x900 -pix_fmt yuv420p -vcodec libx264 -crf 18 D:/out1.mp4命令介紹:
- gdigrab:表明我們是通過gdi抓屏的方式;
- framerate 30:表示我錄制的幀率為30;
- offset_x :左上偏移量X;
- offset_y :左上偏移量Y;
- video_size:需要錄制的寬度和高度,這是我是整個屏幕;
- desktop:告訴ffmpeg我們錄的是屏幕,而不是一個窗口
- crf:該參數來控制轉碼,這個參數的取值范圍為0–51,其中0為無損模式,數值越大,畫質越差,生成的文件卻越小。從主觀上講,18~28是一個合理的范圍。18被認為是視覺無損的(從技術角度上看當然還是有損的),它的輸出視頻質量和輸入視頻相當。
代碼
界面如下:
??下面介紹如何使用Qt來調用ffmpeg命令行進行錄屏
??Qt調用其它進程需要用到QProcess類,在頭文件聲明一個QProcess對象
開始錄制與結束錄制
void Widget::on_btnStart_clicked() {m_Process.setProcessChannelMode(QProcess::MergedChannels);QString cmd = "ffmpeg -f gdigrab -i desktop -framerate 60 -offset_x 0 -offset_y 0 -video_size 1600x900 -pix_fmt yuv420p -vcodec libx264 -crf 18 D:/out1.mp4";m_Process.start(cmd); }void Widget::on_btnStop_clicked() {if (m_Process.isOpen()){m_Process.write("q");} }執行q結束錄制。
??由于我是把ffmpeg直接添加到了環境變量,所以可以直接調用,在項目里面使用時,可以把ffmpeg放到exe目錄,用絕對路徑獲取。
??關于ffmpeg的編譯可以看這篇博客【vs2019編譯ffmpeg】.
ffmpeg錄屏的缺陷
(1)使用ffmpeg命令行錄制有一些限制,例如無法錄制聲音,如果想錄制聲音需要使用screen capture recorder,下載鏈接: https://sourceforge.net/projects/screencapturer/
(2)聲音的錄制稍微麻煩一些,分為系統聲音和麥克風采集進來的聲音,一般筆記本都有內置麥克風,如果使用者插入了外部麥克風,那么得識別出來,此時用ffmpeg就不是很友好了。下面是聲音錄制的命令行:
# 只錄制系統聲音 ffmpeg -f dshow -i audio="virtual-audio-capturer" out.mp3# 同時錄制屏幕+系統聲音 ffmpeg -f dshow -i audio="virtual-audio-capturer":video="screen-capture-recorder" -pix_fmt yuv420p out.mp4# 同時錄制屏幕+系統聲音+麥克風 ffmpeg -f dshow -i audio="麥克風 (Realtek High Definition Audio)" -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=0 -f dshow -i video="screen-capture-recorder" -pix_fmt yuv420p out.mp4# 顯示可用的設備 ffmpeg -list_devices true -f dshow -i dummy(3)另外由于ffmpeg使用gdi錄屏,并沒有處理鼠標的重繪,導致鼠標會閃爍,給使用者的體驗不太好,如果需要消除鼠標閃爍,則需要在錄制時,對每一幀視頻數據的鼠標進行重繪,顯然這使用命令是做不到的,需要使用代碼來實現。
(4)窗口錄制,當指定窗口錄制時,如果屏幕分辨率不是100%,由于屏幕擴大了,導致窗口錄制不完整。
??以上這幾條,用ffmpeg命令行基本都是很難解決的。
如何解決ffmpeg錄屏缺陷
??obs有完整的錄屏方案,可以參考obs的源/碼來錄制屏幕、聲音、制定窗口錄制,推流、直播等操作,關于桌面錄制的其它內容可以參考我的【obs源碼分析專欄】。
總結
以上是生活随笔為你收集整理的Qt调用ffmpeg录制屏幕的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 宠物店管理系统
- 下一篇: 初学RFID-破解学校水卡