日常废话
todesk在实验室被墙了,raylink开始收费了,免费版最多支持30fps。用惯了60帧的远控,突然30帧太不适应了,刚好最近在搞ffmpeg,自己搞一个
桌面应用
ui方面用qt简简单单做一个,这一块学的不太好,能看就行。没有用qml是因为与c++之间的交互太麻烦,后续可能考虑用dx11渲染部分组件。
Tarui
之前考虑过使用Tarui做前端,但rust学的也不太好,gxdi截图+ffmpeg编解码回头还要做FIFE让rust调用,太麻烦放弃。
Flutter
考虑过使用flutter做前端,最终也是需要调用c++放弃。
截图
截图目前只给出gxdi的支持,在老笔记本上试过不知道为什么老笔记本win10的系统居然gxdi没有图像,后续会给出其他方式。
gxdi
gxdi是windows给出的高性能截图方案,选择的原因在于对多屏幕支持更好。具体代码百度有好多具体流程,要注意的是在截图后需要释放Frame。
this->m_duplication->AcquireNextFrame(0, &info, &desktop);
// do something
this->m_duplication->ReleaseFrame();
ffmpeg编码
gxdi截图后图像是RGB格式,目前好像没有编码器支持该格式,需要用ffmpeg的sws_scale对格式进行转换,之后再用编码器进行编码。
目前版本参数设置为veryfast,zerolatency,性能测试为每秒40帧左右。
编码流程为截图后获取图片,拷贝出来后放入编码器。若每秒智能编码40帧,假如视频帧率设置为60帧则会导致实际时间15秒,视频时间只有8秒左右。
后续考虑如何提高编解码性能,目前暂时只能稳定30帧。
绘制鼠标
gxdi截图中没有鼠标,需要自己绘制出来。目前采用的是将截图获得的纹理转为Qimage并读取为QPixMap,将鼠标icon绘制在QPixMap中,最后将QPixMap放入QLabel进行实时图像渲染。
性能问题就出现在渲染部分,无法稳定60帧,大约有50多帧左右。