SteamVR媒体播放器分析(二):文件浏览器、拖放等

最近对 SteamVR 媒体播放器比较感兴趣,简单记录下其技术细节和实现方式(顺带看看它和之前本人从业做过的播放器有何不同)。

前文:SteamVR媒体播放器分析(一):UI 渲染与用户交互

简述

文件浏览器用到的东西不多,文件访问基于 C# System.IO,拖拽外部媒体播放基于 win32 Native 接口,而 UI 是 UGUI,数据保存使用 SQLite。

文件浏览器 UI

文件列表是一个普通的 UGUI ScrollView,且未作任何优化。

切换目录时,若新目录子文件过多,应用会卡住几秒钟,因为此时在生成列表 UI 元素并添加到滑动列表,数量过多,会卡住主线程。

网络映射驱动器

相比于其他播放器,SteamVR 媒体播放器的优点是支持访问网络映射的虚拟磁盘:

当然,C# IO API 本来就支持对网络映射磁盘文件的读取,其他播放器过滤掉这些磁盘才是让人费解的(点名批评 PLAY’A)。

啊,这?

访问网络映射磁盘这点,利用的是 Windows 系统平台的能力:Windows 处理麻烦的 SMB、FTP 连接和转换,应用程序访问权当本地文件处理。

这让我想起了某些 Android 端播放器的做法:对于 SMB,它们先要用一个 SMB 库建立 SMB 访问,之后再建立一个 HTTP 服务器充当中间人供播放器消费,麻烦不说,还经常有断连等 Bug。

Android 侧缺少一个系统级网络磁盘映射的功能,所以开发者没办法,只能自己实现。

拖放外部媒体播放(Drop)

注意,这里的 Drop 是 Windows 对应用程序窗口派发的 Native Drop,而不是 Unity 内部 UGUI EventSystem 那套 Pointer Drop 事件,二者不是一回事。

通过自封装的 Native 插件进行文件拖放监听,和前文的模拟鼠标点击一样,Windows 本就有相关的接口(只不过 Drop 相关的太过混乱)。

Unity 逻辑层每帧查询 Native 插件,看是否有 Drop 发生。若有,则取 Drop 的文件地址,进行播放,并切换文件浏览器的目录到 Drop 文件的目录。

数据存储

对播放过的视频,会把用户设置的视频格式(3D/2D,画面立体方式等)等信息存储起来。

再次播放视频时,会查询已保存的视频信息,用来初始化播放器。

string query = string.Concat(new object[]
{
    "INSERT OR REPLACE INTO ",
    this.m_tableName,
    " ( filenameHash, fileDate, fileSize, layout, format, halfWide, screenSize, fisheyeAngle, fisheyeDir ) VALUES( ",
    ....//略
}

存储使用 SQLite,通过引入的sqlite3.dll进行数据增删改查。

其他值得注意的事情

1. 监听文件夹变化

进入新文件夹后,文件浏览器会通过 Native 插件来监听当前文件夹内容变化,用来在文件夹内容发生改变时刷新 UI。

2. 对窗口尺寸的调整

当窗口尺寸小于 1048 * 768 时,会将窗口尺寸强制设置为 1048 * 768(同样通过自封装 Native 插件)

3. 快捷键

通过对方向键、Home、End、KeypadEnter、Enter、数字键等键盘按键的监听,执行文件浏览器操作、播放控制等。

总结

可以很明显的看出,SteamVR 媒体播放器的做法突出一个大道至简:

  • 对于文件访问,直接利用 C# 已有的能力实现,C# 支持啥,我就支持啥;
  • 完全不理会某些媒体播放器死磕的 SMB、FTP、流媒体访问。

后面的视频解码部分,大道至简的印象会更加突出。

梓喵出没博客(azimiao.com)版权所有,转载请注明链接:https://www.azimiao.com/9885.html
欢迎加入梓喵出没博客交流群:313732000

我来吐槽

*

*