我一直在互联网上挖掘媒体资源扩展示例,并且还没有找到一种方法来根据我的需求调整它们。
我希望采用本地缓存的MP4 / WebM视频(具有100%关键帧和1:1比例的簇/原子与关键帧)并非顺序地解码/显示它们(即第10帧, 400,2,100等)并且能够以0-60fps的速率按需渲染这些非连续帧。由于设置此属性和显示框架的延迟,使用currentTime属性的简单非MSE方法失败。
我意识到这完全超出了正常的视频播放预期,但我的应用需要这种类型的非连续高速播放。理想情况下,我可以使用h264进行GPU加速,但我意识到可能存在一些特定于平台的GPU缓冲区,尽管看起来零帧缓冲区应该是可能的(参见here)。我希望MSE可以完成这种非连续的高帧率低延迟播放,但我知道我要求很多。
问题:
appendBuffer是否会接受由单个关键帧组成的单个WebM群集/ MP4 Atom,并且还能够以高频率(60fps)进行解码?
您认为我可以在浏览器中尝试做什么吗?
非常感谢任何帮助,见解或代码建议/示例。
谢谢!
我能够让MSE主要使用Firefox,Edge和Chrome中的单帧MP4片段。但是,Chrome似乎遇到了上面链接的帧缓冲问题,我还没有找到预处理MP4的方法来调用这个"低延迟"模式。任何人都有任何线索,如果可以使用像MP4Box这样的现有工具创建这样的文件吗?
Firefox和Edge可以在很短的时间内解码/显示各个帧,但是当我将这个视频加载到Three.js WebGL项目(没有视频输出,没有错误)时,当然会出现问题。我现在忽略了这一点,因为我更倾向于在Chrome上运行,因为我也会定位到Android。
答案 0 :(得分:5)
我能够很好地完成这项工作。关键是让Chrome进入“低延迟”模式,通过使用修改后的mp4box源复制特制的MP4文件。我在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播放引擎有任何额外的延迟。我将在这里发布一个单独的问题来解决这个问题。
谢谢, 达斯汀