日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt调用ffmpeg录制屏幕

發布時間:2024/8/1 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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對象

#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QProcess>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_btnStart_clicked();void on_btnStop_clicked();private:Ui::Widget *ui;QProcess m_Process; }; #endif // WIDGET_H

開始錄制與結束錄制

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录制屏幕的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。