我有一个服务器应用程序,它呈现 30 FPS 视频流,然后将其实时编码和复用到WebM Byte Stream中。
在客户端,HTML5 页面向服务器打开一个 WebSocket,当连接被接受时,服务器开始生成流。发送标头后,每个后续 WebSocket 帧都包含一个 WebM SimpleBlock。每 15 帧出现一个关键帧,当这种情况发生时,将启动一个新的集群。
客户端还创建一个MediaSource,并在从 WS 接收到帧时,将内容附加到其活动缓冲区。附加第一<video>
帧后立即开始播放。
一切都运作良好。我唯一的问题是网络抖动会导致播放位置在一段时间后偏离实际时间。我目前的解决方案是挂钩updateend
事件,检查传入集群上的时间码和时间码之间的差异,video.currentTime
并手动更新currentTime
它是否超出可接受的范围。不幸的是,这会导致播放中出现明显的暂停和跳跃,这是相当不愉快的。
该解决方案也感觉有点奇怪:我确切地知道最新的关键帧在哪里,但我必须将它转换为一整秒(根据 W3C 规范),然后才能将它传递给currentTime
,然后浏览器可能必须绕过并找到最近的关键帧。
我的问题是:有没有办法告诉媒体元素始终寻找可用的最新关键帧,或者保持播放时间与系统时钟时间同步?