跳转至

博客

VR 多人观影

VR 比较常见的一个功能便是拿来看看视频,巨大的屏幕以及可以切换的各种拟真场景,都可以带来非常高的沉浸感。而多人观影,则使得这个功能更近一步。在多人观影应用中,玩家可以创建虚拟房间,别人可以加入这个房间观看同一部电影。在虚拟场景中,玩家可以看到对面的虚拟形象做出的各种动作,也可以听到对面带有方位感的立体的声音,让人感觉对方仿佛就在眼前一样。

对我来说,VR 多人观影的最大优点可能是可以突破时间空间的限制,加强人与人之间的连接。毕竟现实中想要和好友特别是异地的好友一起看电影实在太难了,而在 VR 中却可以轻易做到。 我相信,这种加强人与人的链接,必然是 VR 未来发展的很重要的一个方向。(比如在 VRChat 中,玩家能做到的不仅是一起观影,还能一起玩游戏、一起逛图甚至一起陪伴睡觉。确实能瞥见一点元宇宙的影子)

回到正题,由于目前 VR 还处于一个开拓区,许多应用都没有完全明确的形态。针对 VR 多人观影,并没有非常成熟的应用,不同软件侧重的功能不同。以下是我对试过的一些方案的总结

现有方案总结

  • Pico 视频多人观影
    • 播放内容
      • Pico 视频内的资源
      • 各类支持 tv 投屏的应用。特别的,支持网盘(因此可以投用户下载的资源)
    • 优点
      • 有简易的 avatar(2024/06 Pico 更新 Avatar SDK v2.0.0 后,社区可以上传自定义的模型,数量非常丰富。比如全员使用假面骑士形象看特摄)
      • 支持若干场景切换:电影院、沙滩等
      • 投屏支持 4K,清晰度比较高
      • 头戴端应用,不需要 PC
      • 支持 3d 视频
    • 缺点
      • 只能 DLNA 投屏少数白名单网站:B 站、爱奇艺(目前不支持,之后会支持),百度、阿里(别用了,会被永久封号)、夸克网盘等。并且官方没有将其公布在网上
      • 有内容审查(虽然也算不上缺点,但确实自由度没有那么高)
      • 需要网盘会员才有好体验:网盘投屏方式不充对应软件会员,基本只能 720p 投屏
      • 不支持字幕,视频必须提前将字幕烧录到画面中
      • 没测:不知道是否支持音轨切换
  • VRChat
    • 播放内容
      • 视频直链(类似于http://something.com/video.mp4
      • 各种流媒体网站(如https://youtube.com/watch?v=VIDEOID,原理是使用 yt-dlp 工具解析出视频直链):包含 B 站、youtube、twitch直播等
    • 优点
      • 不只是看电影;无数的 avatar 和 无数的 world(场景)可以选择,在场景中可以有丰富的交互
      • 直链意味着可以自己使用服务器 host 想要分享的视频
      • 没有审查。默认有白名单机制,非白名单的域名默认不会播放,但是用户可以手动关闭白名单
    • 缺点
      • 观感不太清晰
        • VRChat 本身渲染分辨率的缘故,需要很高端的显卡才能提高分辨率
        • 播放器貌似本身也限制分辨率,只有 480p, 720p, 1080p 可选(感觉可能只是一个外观按钮,毕竟自己服务器 streaming 的内容,码率等都是服务端控制的,播放器端不应该会再转码一次)
      • 播放器不完善
        • 不支持外挂字幕,只支持将字幕烧录到视频中。(有项目支持了,但是我没成功)
        • 不支持切换音轨
        • p.s. VLC 播放器使用同样的 url 是均支持的,说明问题是可以解决的,所以未来可期
      • 目前没有 3d 的播放器,只能分享 2d 视频
  • bigscreen:一个专门用于多人观影的软件Steam 上的 Bigscreen Beta (steampowered.com)
    • 播放内容
      • 电脑屏幕
      • 电脑本地视频
      • youtube,twitch 等内容
    • 优点
      • 播放内容很开放,很容易播放自己下载的内容。甚至分享电脑屏幕
      • 场景很丰富:有付费场景和免费场景(其中一个教室场景观感很不错)
      • 支持 3d 视频
    • 缺点
      • 清晰度还是低了点,最高码率为 5m

其实从原理上,上面应用可以分为两类。

  • 一类是应用厂商提供串流服务器的。bigscreen 就属于这种,它的最大优势是用户可以分享自己的屏幕。过程其实是房主将自己的画面推流到 bigscreen 服务器,其它用户再从 bigscreen 获得画面。这本质上是一种直播
  • 另一类就是像 Pico 视频和 VRChat 这种不提供串流服务器的。它们本身不需要服务器存储视频,用户都是通过视频链接访问已有的视频网站,因此成本更低些。

理论上最方便最强大的肯定是 bigscreen 这种,但是由于串流服务器存储和带宽的高昂成本,免费用户必然会受到许多限制。因此我觉得更实际的还是后者。其实对于观看大部分正规正版资源,pico 视频已经没什么问题(要么观看 Pico 视频自带的资源,要么使用其它软件投屏)。然而因为国内的审查政策,导致很多即使正规的内容国内平台不一定引进,引进了也可能删减。因此 VRChat 更加开放这一点还是不可缺少的。

视频链接又可以分为两类

  • 一类是视频直链,也就是链接直接指向 .mp4 或者 .webm视频文件。而要取得这样的链接有许多方法
    • 自己购买服务器存放视频,并创建 HTTP 服务器提供访问(比如使用 nginx)
    • 使用 youtube,bilibili 等流媒体平台的链接。这些链接虽然不指向视频文件,但是 VRC 播放器内部会使用 yt-dlp 工具解析出其中的视频直链。
    • 使用云盘存储视频,并获得直链。虽然云盘通常不提供视频直链,甚至会打击获取直链的插件(比如百度网盘)。但是还是有一些云服务商提供了直链的功能,比如 googledrive
    • 使用一些视频托管网站比如 Vimeo(VRC 官方支持的网站)。用户上传视频到网站,网站提供视频链接。同样,免费用户一般有存储空间限制。
  • 另一类是直播链接。直播链接通常采用 HLS 协议,链接指向一个 m3u8 文件,文件存储了切片后的视频直链(通常封装成 ts 格式)。VRC 播放器(如 USharpVideo)都支持 m3u8 链接的播放,需要在界面选择为 Streaming
    • 直播链接和视频直链的区别在于,视频直链的文件内容是固定的,而直播链接中 m3u8 内容是动态生成的。
    • 以 B 站直播为例,直播者通过 OBS 等软件将画面编码后,通过 RTMP 协议推流到 B 站的服务器( rtmp://dl.live-send.acg.tv/live-dl),B 站可以对视频进行存储(也就是直播回放功能),同时提供 HLS 访问。观看者使用浏览器通过 HLS 协议从 B 站服务器获取直播内容。

以下是它们优缺点的介绍

视频直链

  • 优点
    • 简单直接
    • 自己 host 简单,只需要搭建一个 HTTP 服务器即可
  • 缺点
    • 为了获得最好的兼容性,对视频格式有许多要求。封装格式建议使用 mp4,编码格式建议使用 h264。字幕建议直接烧录到画面中。
    • 无法随时调节视频码率。由于播放器是直接请求视频文件,因此对网络带宽有很高要求。对于下载的码率很高的电影文件,直接播放基本上是不可能的。这也是为什么如今各种云盘为了提供在线播放功能,会对用户上传的视频进行转码,保存 480p, 720p, 1080p 等不同分辨率清晰度的版本。而直播不同,直播源可以随时调节码率

直播链接

  • 优点
    • 兼容性最好,由于直接串流电脑画面,因此使用电脑上的播放器基本可以播放任意视频文件,字幕切换、多音轨都不是问题。
    • 按需调节码率
  • 缺点
    • VRC 中无法随时调节播放进度,需要电脑上操作
    • 画质不如原始视频文件。直播其实是在对画面进行实时编码,通常使用核显或者独显加速。而压制组压制的视频资源是使用 CPU 花费大量时间压出来的,会对各种参数进行调节,二者质量上肯定是后者更高。而且直播通常采用 CBR(固定码率) 或者 VBR(可变码率)编码方式。优化的是码率,而不是画质,因此画质也是不如使用 CRF(Constant Rate Factor)压出来的高码率视频。
      • 但是其实只要抛弃画质有损失这样的想法,直播编码出来的画面是足够观看电影的。

方案介绍

最后经过研究,围绕 VRChat 确实有许多方案。最简单的,使用 twitch 直播电脑画面,当然同样会遇到码率限制等问题。所以最好的还是利用自己的上传带宽,因此可以在家宽上搭建一个 HLS 的服务器。绑定域名,提供给外网访问。可以使用 OBS 将电脑屏幕、视频播放器等画面推流到自己的 HLS 服务器上。

  • 优点
    • 能够播放自己下载的内容,不需要经过网盘
    • 基本不会存在视频兼容性问题,因为推流的是电脑画面
  • 缺点
    • 国内可能有法律问题?相当于在家宽上搭建直播服务器
    • 上传带宽受限(国内家宽目前上行普遍只有20-40Mbps 水平),按照 2.5Mbps 的码率,最多只能 10 人同时观看。想要 8Mbps 码率,就只能 4 人观看了。
    • 没有 cdn 优化,不一定每个地方都有很好的播放体验

再次理解 Cache 设计

涉及虚拟 cache 导致的同名和重名问题;重名问题 bank 和 L2 两种解决方法;进程切换时 TLB 的操作;什么时候需要显示地控制 cache 等。

使用整数位运算计算 div10

使用整数位运算计算 div10,得到舍入到整数的精确值。得到了一个 magic number

unsigned int div10(unsigned short x){
 //return x/10
 unsigned int t = x<<16;
 t = (t>>4) + (t>>5);
 t = t + (t>>4) + (t>>8) + (t>>12) + (t>>16);

 t += 6554;  //should in [409.6, 6553.6]
 unsigned int r;
 r = t>>16;
 return r;
}

井字棋与最大最小值算法

经过昨晚,和今天早上 8 点醒来趴在床上努力的思考。我终于想起了如何使用数学归纳法证明策梅洛定理。然后经过一上午的努力,我成功使用最大最小值算法实现了井字棋 (Tic-Tak-Toe) 的 AI,然后添加到 wwh 的井字棋代码中。