Linux基于webRTC的二次开发(二) 实现远程桌面共享
webRTC中的desktop_capture模块提供了捕获桌面和捕获窗口的相关功能,而实现远程桌面共享功能需要将desktop_capture捕获的画面作为peerconnection的视频源,下面介绍一下相关的方法
peerconnection添加视频源时调用AddTrack(rtc::scoped_refptr<MediaStreamTrackInterface> track,const std::vector<std::string>& stream_ids);,我们需要传入一个rtc::scoped_refptr<webrtc::VideoTrackInterface>类型作为视频源,使用PeerConnectionFactoryInterface::CreateVideoTrack(const std::string& label,VideoTrackSourceInterface* source)创建。
可以看到,我们需要获得VideoTrackSourceInterface*
webrtc提供了AdaptedVideoTrackSource类,该类继承自VideoTrackSourceInterface。我们需要继承实现AdaptedVideoTrackSource,在其中添加捕获桌面获得的图像,然后将其传入父类的OnFrame函数即可
简单代码如下
class MyDesktopCapture : public rtc::AdaptedVideoTrackSource, public webrtc::DesktopCapturer::Callback
{
public:
explicit MyDesktopCapture();
static rtc::scoped_refptr<MyDesktopCapture> Create();
void OnCaptureResult(webrtc::DesktopCapturer::Result result, std::unique_ptr<webrtc::DesktopFrame> desktopframe) override;
bool is_screencast() const override;
absl::optional<bool> needs_denoising() const override;
webrtc::MediaSourceInterface::SourceState state() const override;
bool remote() const override;
private:
std::unique_ptr<CaptureThread> capture_;
};
其中OnCaptureResult作为DesktopCatpure的回调,在桌面捕获获得图像时会调用该方法
由于桌面捕获获得的DesktopFrame都是RGBA数据,我们需要将其转换成存放I420数据的VideoFrame,然后调用OnFrame
现在新版本的webrtc不提供ConvertToI420方法,我们需要自己用libyuv实现,将RGBA转换为I420
void MyDesktopCapture::OnCaptureResult(webrtc::DesktopCapturer::Result result, std::unique_ptr<webrtc::DesktopFrame> desktopframe)
{
if(result!=webrtc::DesktopCapturer::Result::SUCCESS)
return;
int width=desktopframe->size().width();
int height=desktopframe->size().height();
rtc::scoped_refptr<webrtc::I420Buffer> buffer=webrtc::I420Buffer::Create(width,height);
int stride=width;
uint8_t* yplane=buffer->MutableDataY();
uint8_t* uplane=buffer->MutableDataU();
uint8_t* vplane=buffer->MutableDataV();
libyuv::ConvertToI420(desktopframe->data(),0,
yplane,stride,
uplane,(stride+1)/2,
vplane,(stride+1)/2,
0,0,
width,height,
width,height,
libyuv::kRotate0,libyuv::FOURCC_ARGB);
webrtc::VideoFrame frame=webrtc::VideoFrame(buffer,0,0,webrtc::kVideoRotation_0);
this->OnFrame(frame);
}
最后我们使用该类创建VideoTrack,添加进peerconnection即可
实现效果如下图

Linux基于webRTC的二次开发(二) 实现远程桌面共享的更多相关文章
- Remmina:一个 Linux 下功能丰富的远程桌面共享工具(转载)
Remmina:一个 Linux 下功能丰富的远程桌面共享工具 作者: Aaron Kili 译者: LCTT geekpi | 2017-05-10 09:05 评论: 2 收藏: 4 Remm ...
- Linux基于webRTC的二次开发(一)
最近在做Linux平台下webRTC的二次开发,一路摸索,中间踩了不少坑,这一篇博客先来简单介绍下Linux上如何使用GCC编译webRTC. 为什么使用GCC编译? 这其实是无奈之举,Linux下w ...
- 基于HTML5的SLG游戏开发( 二):创建HTML5页面
HTML5游戏的开发过程中是在浏览器上进行运行调试的,所以首先我们需要建立一个html页面. 其中,我们把所有的canvas都放到一个viewporter(视图)里面,因此,在body中放置了一个id ...
- Jmeter二次开发——基于Java请求
简述 这近几年,越来越多非http的协议需要进行性能测试,包括不仅限于各类rpc.mq.缓存等.对于这些协议,市面上可能没有现成的工具可以直接使用,这个时候,我们可以自己动手,通过编写相应的JavaS ...
- EasyDSS点播与直播服务器软件-二次开发接口对接说明示列
EasyDSS流媒体服务器软件,提供一站式的转码.点播.直播.时移回放服务,极大地简化了开发和集成的工作.其中,点播版本主要包含:上传.转码.分发.直播版本,主要包含:直播.录像, 直播支持RTMP输 ...
- EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器软件二次开发接口对接说明示列
EasyDSS相关功能 EasyDSS流媒体服务器软件,提供一站式的转码.点播.直播.时移回放服务,极大地简化了开发和集成的工作.其中,点播版本主要包含:上传.转码.分发.直播版本主要包含:直播.录像 ...
- linux系统下,11款常见远程桌面控制软件
linux系统下,11款常见远程桌面控制软件 一. Grdc 它是一个用GTK+编写的,适用于gnome桌面环境的远程桌面访问软件.看图: 常见功能: 1.提供全屏,窗口化的远程控制.支持高分辨率下的 ...
- linux系统下,11款常见远程桌面控制软件(转载)
远程控制能够给人们带来很多便利,本文介绍了11款常见的Linux系统下的远程桌面控制工具,总有一款能适合您. 一. Grdc 它是一个用GTK+编写的,适用于gnome桌面环境的远程桌面访问软件.看图 ...
- Linux的远程桌面配置
一.Ubuntu的远程桌面 Ubuntu默认已安装好VNC服务端组件vino-server,只需要在“系统设置->首选项->桌面共享”中设置即可. 1.设置桌面共享首选项 2.设置好之后, ...
随机推荐
- 【LeetCode刷题】——两数之和.1
---恢复内容开始--- 一直想在leetcode上面刷题,但是java刚刚摸了一下门,所以迟迟没有动手,今天做了第一道题,感觉自己实在菜的不行,但是还是学到了很多东西, 就记录一下遇到的问题. 首先 ...
- nm 命令能够显示目标文件中重载函数的名字改变(C++)
#include <stdio.h> #include <iostream> using std::cout; using std::endl; //这里的两个不同的add函数 ...
- django-orm框架表单的增删改查
08.14自我总结 django-orm框架 一.orm基本配置 1.创建django项目 命令行:cmd先去到django创建目录,然后输入django-admin startproject dja ...
- 【javascript 伪协议】小结
[javascript 伪协议] 将javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中.这个特殊的协议类型声明了URL的主体是任意的javascrip ...
- 机器学习:eclipse中调用weka的Classifier分类器代码Demo
weka中实现了很多机器学习算法,不管实验室研究或者公司研发,都会或多或少的要使用weka,我的理解是weka是在本地的SparkML,SparkML是分布式的大数据处理机器学习算法,数据量不是很大的 ...
- Google研发面试题
今天很开心找到了一个很不错的研发面试题,很考验临时反应能力,特地拿出来和大家分享一下此题以及自己做该题的心得体会!!! 题目: 总共有12个外表都一样的金属球,其中有11个球的重量是相同的,1个球的重 ...
- win10系统plsql卡顿、菜单闪烁解决办法
右键快捷方式--属性--兼容性: 设置为以win7模式运行,以管理员模式运行.如图:
- opencv::霍夫圆变换
霍夫圆检测原理 从平面坐标到极坐标转换三个参数 假设平面坐标的任意一个圆上的点,转换到极坐标中: 处有最大值,霍夫变换正是利用这个原理实现圆的检测. cv::HoughCircles 因为霍夫圆检测对 ...
- go-json类
package main import ( "encoding/json" "fmt" ) /* { "company":"itc ...
- fullpage.js的引入方法
1.先到官网上(https://github.com/alvarotrigo/fullPage.js)下载压缩包 2.引入文件 3.布局基本页面结构 4.实现全屏滚动(JS代码) <script ...