我一直在研究Internet上的Media Source Extension示例,但还没有找到一种使它们适应我的需求的方法。

我正在寻找一个本地缓存的MP4 / WebM视频(带100%关键帧,簇/原子与关键帧的比例为1:1),并对其进行非顺序解码/显示(例如,第10、400、2、100帧)等),并能够按要求以0-60fps的速率渲染这些非顺序帧。由于设置此属性和显示帧的延迟,使用currentTime属性的简单非MSE方法失败。

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

问题:


appendBuffer是否将接受由单个关键帧组成的单个WebM群集/ MP4 Atom,并且还能够以高频率(60fps)进行解码?
您是否认为我想在浏览器中执行的操作?


任何帮助,见解或代码建议/示例将不胜感激。

谢谢!

更新4/5/16

我能够使MSE主要在Firefox,Edge和Chrome中使用单帧MP4片段。但是,Chrome似乎正在遇到上面链接的帧缓冲区问题,而且我还没有找到一种预处理MP4来调用此“低延迟”模式的方法。如果有可能使用MP4Box之类的现有工具来创建这样的文件,有人有任何线索吗?

Firefox和Edge几乎没有延迟地立即解码/显示单个帧,但是当我将视频加载到Three.js WebGL项目中时,当然会中断(没有视频输出,没有错误)。我现在忽略了这一点,因为我宁愿在Chrome上也能正常工作,因为我也将定位Android。

最佳答案

我能够使它运行得很好。关键是通过使用修改后的mp4box来源混合特制的MP4文件,使Chrome浏览器进入“低延迟”模式。我在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播放引擎增加任何延迟。我将在这里发布一个单独的问题来解决这个问题。

谢谢,
达斯汀

08-03 23:10