这是本文档旧的修订版!
视频技术
视频透传相关
MF的视频重定向
- 结论:适合windows视频播放新架构MF的视频重定向的可行性方式有两种:一种是 hook; 一种是基于WDDM驱动;
- hook方式:
- 基于Hook技术的视频重定向技术是指在播放器调用Windows函数时截获视频数据。当播放器解码视频数据时,一般会使用系统提供的解码函数,使用Hook技术在播放器调用解码函数时将视频数据截获,然后传输到客户端解码显示。由于在Windows的解码函数层次截获视频数据,该技术支持大多数的播放器。
- 可通过 MF架构里的 Media Sources 来截取流;具体为 Hook 住MFCreateRemoteDesktopPlugin API,并指定触发Hook函数的动作为打开视频文件,即当Hook函数捕获到虚拟机内WMP播放器打开视频文件的动作后,执行Hook函数内的进程。
- 缺点:由于要 Hook 视频播放进度控制信息,需要独立适配每个播放器;
- 问题:hook方式怎么截获渲染层渲染? 实际得截获渲染层,让播放区域不刷新才能降低虚拟机消耗。
- 基于WDDM驱动:
- 基于WDDM驱动的视频重定向技术原理主要是通过截获D3D Runtime对WDDM驱动中的函数的调用情况,也就是协议服务器端通过从虚拟XPDM/WDDM显示驱动中获取到的图形数据,然后在协议客户端上重新执行复现。如果直接发送到协议客户端,其数据量也是非常大的,所以为了有效捕获传输的视频数据,厂家一般都会开发一个WDDM驱动。在WDDM驱动有一类函数用于向上层提供多媒体编码&解码功能,这类函数总体称为视频硬件加速技术(即:DirectX VideoAcceleration,也就是DXVA)。同时还需要加入许多优化处理,减少传输数据,通常的优化手段有:数据压缩、指令合并、数据缓存。
- 在实际的使用过程中,基于WDDM的视频重定向技术对H.264编码的视频文件有较好的支持,而对于Megp2和VC1编码的文件支持就一般,主要原因是Megp2编码过程跟标准编码过程不同,因此会导致编码过程异常,从而出现花屏的现象。其次播放器自身也存在差异行,如:射手影音本身就对VC1不支持,根本就无法调动硬解码。
- 缺点:研发难度高
浏览器视频重定向
- 结论:浏览器视频重定向可行方式有两种,一是自建浏览器在解码层拦截;二是以插件方式拦截视频标签;
- 自建浏览器:
- 可参考 这篇文章
Tools
- 测试视频下载站:
学习
- 一个非常好的科普文章,值得翻译:https://github.com/leandromoreira/digital_video_introduction
Container
HLS
m3u8
mpeg2-ts
RTSP
- Real Time Streaming Protocol(RTSP):RFC2326
ONVIF
- Official site: onvif.org
Codec
H.264
- h.264语法结构分析 这篇讲得不错
-
- Annex B 模式(Annex B Byte stream format 可在T-REC-H.264文档里查看 Annex B 章节)。文件后缀为 .264, .h264,或者 ts 流。
- AVCC 模式(ISO Base Media File Format)(ISO/IEC 14496-15 NAL unit structured video 查找 AVCDecoderConfigurationRecord)。文件后缀为.mp4, .mkv, .flv等,
- ffmpeg 解包AVCC时,会把h264的SEI信息与第一个关键帧放一起,如果手动把AVCC转AnnexB时,需按长度来判断是否含有多个帧。
- 分辨率与最佳码率的对应关系:https://www.lighterra.com/papers/videoencodingh264/
Name | Resolution | Link(Mbps) | Bitrate(Mbps) | Video(kbps) | Audio(kbps) |
---|---|---|---|---|---|
240p | 424×240 | 1.0 | 0.64 | 576 | 64 |
360p | 640×360 | 1.5 | 0.96 | 896 | 64 |
432p | 768×432 | 1.8 | 1.15 | 1088 | 64 |
480p | 848×480 | 2.0 | 1.28 | 1216 | 64 |
480p HQ | 848×480 | 2.5 | 1.60 | 1536 | 64 |
576p | 1024×576 | 3.0 | 1.92 | 1856 | 64 |
576p HQ | 1024×576 | 3.5 | 2.24 | 2176 | 64 |
720p | 1280×720 | 4.0 | 2.56 | 2496 | 64 |
720p HQ | 1280×720 | 5.0 | 3.20 | 3072 | 128 |
1080p | 1920×1080 | 8.0 | 5.12 | 4992 | 128 |
1080p HQ | 1920×1080 | 12.0 | 7.68 | 7552 | 128 |
1080p Superbit | 1920×1080 | N/A | 20.32 | 20000 | 320 |
WebM
- VP8/VP9
AV1
硬解
库
- nile.js:基于 Torrents 与 WebRTC 的端到端视频流播放技术实现工具。
- V4L2loopback:linux 虚拟摄像头
-