webrtc封裝sdk(八)使用webrtc desktop_capture截屏

簡介

webrtc的modules中有一個模塊desktop_capture,該模塊負責截屏,目前只支持windows和mac平臺,android,ios沒有實現。

desktop_capture中有兩種截屏方式,第一種是截單個窗口,叫做WindowCapturer,
第二種是截整個屏幕,叫做ScreenCapturer。
window_capture/screen_capture都繼承于基類DesktopCapturer:

// Abstract interface for screen and window capturers.
class DesktopCapturer {
 public:
 //初始化截屏,設置數據回調
  virtual void Start(Callback* callback) = 0;
  //截一張圖,數據直接進入callback
  virtual void Capture(const DesktopRegion& region) = 0;
};

一、WindowCapture

WindowCapture主要增加了獲取窗口列表,和設置截屏窗口id的接口:

  virtual bool GetWindowList(WindowList* windows);
  virtual bool SelectWindow(WindowId id);

二、ScreenCapture

ScreenCapture主要增加了獲取屏幕列表,和設置截屏屏幕id的接口:

  virtual bool GetScreenList(ScreenList* screens);
  virtual bool SelectScreen(ScreenId id);

三、使用流程

接口都比較簡單,很容易使用,大概的流程如下:

  1. 創建對象
  2. 初始化截屏,設置回調函數
  3. 開啟線程循環截圖
screen_capture_ = webrtc::ScreenCapturer::Create(webrtc::DesktopCaptureOptions::CreateDefault());
screen_capture_->SelectScreen(0);

bool ImageCaptureThreadFunc(void* param)
{
    webrtc::DesktopCapturer* capture = static_cast<webrtc::DesktopCapturer*>(param);
    capture->Capture(webrtc::DesktopRegion(webrtc::DesktopRect()));
    Sleep(100);
    return true;
}

四、截屏數據處理

截屏后得到的數據格式是rgb,需要使用libyuv將數據從rgb轉換為yuv420,然后傳入編碼器和進行本地渲染。
轉換時注意填寫正確的原始數據類型,windows下格式為webrtc::kARGB

void OnCaptureCompleted(webrtc::DesktopFrame* frame) {

    if (frame == NULL) {
        //error,stop capture
        StopImageCapture();
        return;
    }
    int width = frame->size().width();
    int height = frame->size().height();
    int half_width = (width + 1) / 2;

    webrtc::VideoFrame i420frame;
    i420frame.CreateEmptyFrame(width, height, width, half_width, half_width);

    int ret = webrtc::ConvertToI420(webrtc::kARGB, frame->data(), 0, 0, width, height, 4, webrtc::kVideoRotation_0, &i420frame);
    if (ret != 0) {
        return;
    }

    //后續處理
    OnIncomingCapturedFrame(0, i420frame);
    //需要釋放內存
    delete frame;
}

五、傳遞給videoSendStream

通過VideoSendStream的input接口可以把采集到的圖像投遞進去,編碼發送。

video_stream_s_->Input()->IncomingCapturedFrame(videoFrame);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,180評論 4 61
  • 視頻采集模塊在WebRTC數據流水線中負責從視頻源采集視頻數據,推送給流水線下一模塊(本地回顯模塊或者編碼模塊)進...
    weizhenwei閱讀 12,280評論 3 26
  • 想吃掛面 加糖心荷包蛋 加馬可波羅 加西紅柿 加香菜蔥花 加洋蔥圈 加香其醬 …… 加一個家 加一個你
    散人馬丁閱讀 233評論 0 2
  • ps教程(設計丑人說logo) 商業模式新生代 下周計劃 pr,au,教程, 丑人說天天發 不吃白飯不吃肉 多吃青...
    想去歐洲游學的pipi閱讀 240評論 0 0
  • 江山晴好,幸而今我仍年少。可憐喜上枝頭鳥,碧玉結簪,屋后新來笑。 獨倚蘭舟行世道,開心便有青青草。海棠易落春容老,...
    碩果蕾蕾閱讀 335評論 10 18