【发布时间】:2014-06-11 15:53:57
【问题描述】:
我有一个服务器应用程序,它渲染一个 30 FPS 的视频流,然后将其实时编码和复用到 WebM Byte Stream。
在客户端,HTML5 页面向服务器打开一个 WebSocket,服务器在接受连接时开始生成流。发送标头后,每个后续 WebSocket 帧都由一个 WebM SimpleBlock 组成。每 15 帧出现一个关键帧,当这种情况发生时,会启动一个新的集群。
客户端还创建一个MediaSource,并在接收到来自 WS 的帧时,将内容附加到其活动缓冲区。 <video> 在添加第一帧后立即开始播放。
一切运行良好。我唯一的问题是网络抖动会导致播放位置在一段时间后偏离实际时间。我目前的解决方案是挂钩updateend 事件,检查video.currentTime 和传入集群上的时间码之间的差异,如果它超出可接受的范围,则手动更新currentTime。不幸的是,这会导致播放中出现明显的暂停和跳跃,这非常令人不快。
这个解决方案也感觉有点奇怪:我确切地知道最新的关键帧在哪里,但我必须将它转换成一整秒(根据 W3C 规范),然后才能将它传递给浏览器的currentTime大概必须四处寻找最近的关键帧。
我的问题是:有没有办法告诉媒体元素始终寻找可用的最新关键帧,或者保持播放时间与系统时钟时间同步?
【问题讨论】:
-
你找到解决办法了吗?
-
我已经意识到您更改 currentTime 的解决方案是最好的,它导致的故障是可以接受的,因为在此之前网络故障导致缓冲区增加,所以另一个故障来修复它是正常的...只有在流期间出现连续连接问题时才会出现故障。
-
有什么方法可以将 WebM SimpleBlock 转换为带有 header 的独立 webm 文件?
标签: javascript html video-streaming html5-video media-source