这是本文档旧的修订版!
视频技术
视频透传相关
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
- 测试视频下载站:
- chrome 视频调试:
chrome:media-internals/
===== 学习 ===== * 一个非常好的科普文章,值得翻译:https://github.com/leandromoreira/digital_video_introduction * 简中翻译 https://github.com/leandromoreira/digital_video_introduction/blob/master/README-cn.md * Linux V4L2 * 视频的容器与编码 * web 音视频处理 ===== Container ===== ==== MP4 ==== * MP4 ==== FLV ==== * FLV ==== HLS ==== * https://developer.apple.com/streaming/ * https://github.com/video-dev/hls.js/ ==== m3u8 ==== * https://blog.csdn.net/hpb21/article/details/43410147 * https://blog.csdn.net/tao_627/article/details/22407071 ==== mpeg2-ts ==== * MPEG2-TS Wiki * https://blog.csdn.net/michaeluo/article/details/75263462 ==== RTSP ==== * RTSP * Real Time Streaming Protocol(RTSP):RFC2326 * rtsp → hls(m3u8): https://medium.com/androvideo/convert-rtsp-to-hls-using-ffmpeg-2fe2cdf3a0de ==== ONVIF ==== * Official site: onvif.org ===== Codec ===== ==== H.264/AVC ==== * https://www.itu.int/rec/T-REC-H.264 * nal_unit_type 表格: 文档 7.4.1 Table 7-1 * SPS PPS 的文档位置: H264 文档(T-REC-H.264-202108-I!!PDF-E.pdf)的 7.3.2.1.1 章节 * h.264语法结构分析 这篇讲得不错 * H264 两种format * 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等, * 这篇也不错 – 其实是这个回答的补充翻译。 * https://blog.csdn.net/yue_huang/article/details/75126155 * 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 * SPS PPS 解析参考:https://blog.51cto.com/u_12204415/3804504 * H264 文档(T-REC-H.264-202108-I!!PDF-E.pdf)的 7.3.2.1.1 章节 * 哥伦布编码 ue se 之类的,代码实现参考 bs.h ==== H.265/HEVC ==== * H265 的 nalu type : https://blog.csdn.net/u011003120/article/details/83411445 -
type = (code & 0x7E) » 1-
VPS=32 SPS=33 PPS=34 IDR=19 P=1 B=0<code bash> ① 00 00 00 01 40 01 —> (0x40 & 0x7E)»1 = 32 —> VPS ② 00 00 00 01 42 01 —> (0x42 & 0x7E)»1 = 33 —> SPS ③ 00 00 00 01 44 01 —> (0x44 & 0x7E)»1 = 34 —> PPS ④ 00 00 00 01 26 01 —> (0x26 & 0x7E)»1 = 19 —> IDR </code> === 浏览器硬解 HEVC 设置 === * 苹果电脑目前 Safari 浏览器都支持 HEVC 硬解;以下针对 Windows PC. * 首先确保PC拥有可以解码HEVC的显卡,具体可查看 * AMD GPU Decoder Device Information * NVIDIA GPU Decoder Device Information * Intel GPU Decoder Device Information * 最好安装适配显卡的最新版本驱动 * 安装支持 HEVC 解码的浏览器,具体版本范围见 https://caniuse.com/?search=hevc ,即 chrome 版本在107及以上, edge 版本在 79 以上 * 如果是笔记本电脑等有双显卡混合支持的,要注意设置浏览器使用哪张显卡,设置方法: win+i 打开设置 - 系统 - 屏幕 - 显示卡 - 添加应用-浏览 - 选择浏览器运行exe - 选项选择节能或高性能 * 注:edge 浏览器也需要新添加选择路径,默认列表的edge不是桌面应用。 * edge 浏览器在 windows 上需要安装 HEVC 视屏扩展插件,windows商店里付费安装, 或免费下载安装 * chrome 浏览器:
chrome://gpu查看是否有 hevc * edge 浏览器:
edge://gpu, 查看是否有 hevc * 如果要在B站上硬解HEVC,还需要在edge 浏览器安装User-Agent Switcher and Manager 插件,把UAC 修改为 Safari . B站视频右下角齿轮菜单-更多播放设置-选择HEVC; 右键视频信息里有
hev'' 字样。 ==== WebM ==== * VP8/VP9 * libvpx ==== AV1 ==== * 开放媒体联盟:中文维基介绍 ==== 硬解 ==== * DxVA * D3D11 VA * OpenMAX * MMAL -too old, see rpi mmal * Linux Hardware video acceleration: VA-API、VDPAU、NVDECODE/NVENCODE ===== 库 ===== * nile.js:基于 Torrents 与 WebRTC 的端到端视频流播放技术实现工具。 * V4L2loopback:linux 虚拟摄像头 * MPC-HC * DirectShow * GStreamer * android NDK 编译 * FFmpeg