public:it:spice

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
public:it:spice [2020/12/03 11:06] oakfirepublic:it:spice [2022/08/03 09:04] (当前版本) – [1.3 流传输] oakfire
行 1: 行 1:
 ====== SPICE====== ====== SPICE======
   * [[https://www.spice-space.org/|spice-space.org]]   * [[https://www.spice-space.org/|spice-space.org]]
-  * [[https://www.jianshu.com/p/8bfc1bc2fa9f|SPICE 协议的理解]]+  * [[https://gitlab.freedesktop.org/spice/spice-protocol|SPICE 协议文档]]
   * [[https://markrepo.github.io/protocol/2018/08/02/spice-architecture/|SPICE 架构与特性]]   * [[https://markrepo.github.io/protocol/2018/08/02/spice-architecture/|SPICE 架构与特性]]
   * [[https://blog.csdn.net/xx306/article/details/80160889|流媒体重定向的技术方案]]   * [[https://blog.csdn.net/xx306/article/details/80160889|流媒体重定向的技术方案]]
 +  * {{ :public:it:基于spice的vdi实现原理概述v44.doc |}}
 +
 +===== 1.流媒体重定向 =====
 +==== 1.1 重定向原理 ====
 +
 +  * SPICE VDI虚拟机视频播放流程:{{ :public:it:云桌面视频播放流程_2_.png |}}
 +  * 理想的重定向流程:{{ :public:it:云桌面视频重定向.png |}}
 +==== 1.2 截流的可行性 ====
 +
 +=== 1.2.1 视频播放器 ===
 +
 +  * 利用directshow架构开源播放器来自制:便于在解码时截流,便于修改播放区域渲染,但用户只能使用此播放器播放视频
 +  * 自制directshow解码器并hook或修改流行播放器的解码器设置:便于截流、修改渲染,但需对每一款播放器进行研究适配,大概率需要侵入式修改(杀软会报警)
 +  * Hook MF架构里的 Media Sources 来截取流:只适用使用MF架构的wmp播放器(国内基本没人用), 不方便修改播放区域渲染
 +  * 基于WDDM驱动实现虚拟 DXVA 硬解:适用所有播放器(仍然需针对播放器来设置解码器), 不方便修改播放区域渲染,实现有一定难度
 +=== 1.2.2 浏览器 ===
 +
 +  * 利用chrome开源浏览器来自制浏览器,在解码层进行截流,并方便修改播放区域渲染,但难度大
 +    * chrome 播放标签video的架构:https://github.com/chromium/chromium/tree/master/media#playback
 +  * 利用chrome插件截流:便于实现
 +    * m3u8 等未加密流可直接获取源地址
 +    * 从 [[https://developer.mozilla.org/zh-CN/docs/Web/API/SourceBuffer|MediaSource]] 截取视频数据,可参考 [[https://chrome.google.com/webstore/detail/vmware-horizon-html5-redi/ljmaegmnepbgjekghdfkgegbckolmcok|vmware 的 chrome 插件]], {{ :public:it:vmware_horizon_html5_重定向扩展程序.zip |}}
 +
 +==== 1.3 流传输 ====
 +
 +  * 虚拟机与客户端(盒子)可 tcp 连接:直接推流
 +  * 不可连接:映射usb字符设备进行流传输,或开辟 spice 新通道 (未实现)
 +    * [[https://www.spice-space.org/api/spice-gtk/SpicePortChannel.html|spice port channel]]
 +    * 参考 [[https://gitlab.gnome.org/GNOME/phodav|spice webdavd]] 在 windows 下的传输
 +    * 参考 [[https://gitlab.com/virt-viewer/virt-viewer| virt-viewer remote-viewer]] 下关于 webdav 使用 spice port channel 的代码
 +    * [[.:spice:codec-agent-trans]]
 +    * [[.:spice:browser-content-redir]]
 +
 +
 +===== 2.代码解析 =====
 +==== 2.1 spice-streaming-agent ====
 +  * [[https://gitlab.freedesktop.org/spice/spice-streaming-agent|repo]]
 +  * host服务器端要使用spice-server >= 0.14.1,如果版本没升级,其它都配置了,运行spice-streaming-agent时也会报错:<code bash>spice-streaming-agent[2223]: Reading message from device failed: read() returned 0, device is closed.</code>
 +  * windows spice client(virt-viewer) 的 display2 会显示为黑屏,原因参考[[https://gitlab.com/virt-viewer/virt-viewer/-/issues/5|这个issue]], 只能在linux (remote-viewer) 上演示。
 +
 +=== 2.1.1 编译 ===
 +  * Ubuntu20.04
 +  * 安装 meson: <code bash> 
 +sudo apt install python3 python3-pip ninja-build 
 +sudo pip3 install meson
 +sudo pip3 install pyparsing
 +</code>
 +  * 安装依赖库: <code bash>
 +sudo apt install build-essential libspice-protocol-dev libssl-dev libglib2.0-dev libpixman-1-dev libopus-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libjpeg-dev libdrm-dev libxcb-xfixes0-dev libxrandr-dev
 +</code>
 +  * 编译 <code bash>
 +git clone https://gitlab.freedesktop.org/spice/spice-streaming-agent.git
 +cd spice-streaming-agent
 +git submodule update --init --recursive
 +meson build && cd build
 +ninja
 +# 生成 build/src/spice-streaming-agent
 +</code>
 +  * spice-common 的 meson.build 里对 python 模块 pyparsing 的检查代码需要修改,详见 [[https://gitlab.freedesktop.org/spice/spice-common/-/commit/a7b5474bf808934cf0ee1107a58d5f4d97b9afbf|这个commit]], 否则在 meson build 时会错误报告缺失pyparing模块
 +
 +
  
  • public/it/spice.1606964799.txt.gz
  • 最后更改: 2020/12/03 11:06
  • oakfire