使用媒体源扩展逐帧解码

Frame by frame decode using Media Source Extension

我一直在研究 Internet 上的媒体源扩展示例,但还没有完全找到一种方法来使它们适应我的需要。

我正在寻找本地缓存的 MP4/WebM 视频(带 100% 关键帧和 1:1 clusters/atoms 与关键帧的比率)并且 decode/display 它们不是-顺序(即帧 10、400、2、100 等)并能够以 0-60fps 的速率按需渲染这些非顺序帧。使用 currentTime 属性 的简单非 MSE 方法由于设置此 属性 和显示帧的延迟而失败。

我意识到这完全超出了视频播放的正常预期,但我的应用程序需要这种类型的非顺序高速播放。理想情况下,我可以使用 h264 来实现 GPU 加速,但我意识到可能有一些特定于平台的 GPU 缓冲区需要应对,尽管零帧缓冲区似乎是可能的(参见 here)。我希望 MSE 可以完成这种非连续的高帧率低延迟播放,但我知道我要求很多。

问题:

  1. appendBuffer 是否接受由单个关键帧组成的单个 WebM 集群/MP4 Atom,并且还能够以高频率(60fps)解码?

  2. 你认为我正在尝试做的事情在浏览器中可行吗?

任何帮助、见解或代码 suggestions/examples 将不胜感激。

谢谢!

2016 年 4 月 5 日更新

我能够让 MSE 主要在 Firefox、Edge 和 Chrome 中处理单帧 MP4 片段。但是,Chrome 似乎是 运行 进入上面链接的帧缓冲区问题,我还没有找到一种方法来预处理 MP4 以调用此 "low delay" 模式。如果可以使用 MP4Box 等现有工具创建这样的文件,有人知道吗?

Firefox 和 Edge decode/display 立即显示单个帧,延迟非常小,但是当我将此视频加载到 Three.js WebGL 项目(无视频输出,无错误)时,当然会出现问题。我暂时忽略了这一点,因为我更愿意在 Chrome 上工作,因为我也将以 Android 为目标。

我能够很好地完成这项工作。关键是通过使用修改后的 mp4box 源混合特制的 MP4 文件,让 Chrome 进入其 "low delay" 模式。我在 movie_fragments.c 中添加了一行,所以它显示为:

        if (movie->moov->mvex->mehd && movie->moov->mvex->mehd->fragment_duration) {
            trex->track->Header->duration = 0;
            Media_SetDuration(trex->track);
            movie->moov->mvex->mehd->fragment_duration = 0;
        }

现在创建的每个 MP4 都将 MEHD 片段持续时间设置为 0,这导致 Chrome 将其作为实时流处理。

我还有一个与 timestampOffset 属性 相关的问题,它与媒体片段中设置的 FPS 一起控制播放速度。因为我希望直接控制 FPS,所以我不希望 MSE 播放引擎增加任何延迟。我将 post 在这里提出一个单独的问题来解决这个问题。

谢谢, 达斯汀