HTML5 视频,视频数据是如何发送到浏览器的?

HTML5 video, how are the video data sent to the browser?

我正在使用 C++ 实现 HTML5 实时视频服务器。

从摄像头设备 (H264) 读取源流并完成此操作。我还可以将源(h264 编解码器)视频保存到文件中。

我想实现一个 HTML5 实时服务器。但是我找不到任何协议描述。为了简单起见,我只想实现自动播放(no-pause no stop until close the browser)

HTML 协议是如何工作的?浏览器会向我发送 "fake" 文件请求,不是吗?这样我就可以像保存到文件一样开始连续发送实时视频信息了吗?关于 HTML 中的文件传输协议,我有什么可以了解的吗?与普通文件相比,HTML5 视频有什么特别之处吗?

我知道 VLC 可以做到这一点(一些来自 Whosebug 的搜索)但是我的应用程序有点特殊并且需要比 VLC 可以支持的更多的功能。而且我的应用不是一个通用的视频服务器,我只需要支持一个特定的任务,所以实现起来并不难。

谢谢。

根据您是单视频流还是多流(允许根据网络条件在不同大小的流之间切换——即自适应比特率流),细节会有所不同,但一般来说视频播放器在浏览器,或 HTML5/Javascript 视频播放器,将一个接一个地从服务器请求 'chunks' 视频。

如果您在播放视频时查看浏览器控制台的 'network' 部分,您可以看到这一点 - 您应该看到从浏览器到服务器的多个视频块请求(以及音频如果音频是单独的流,则分块)。请参阅下面的示例(Chrome 播放 YouTube 视频):

根据实际使用的协议,browser/player 如何决定请求什么以及如何构建请求会略有不同。例如,最简单的方法之一是服务器在 HTTP 请求中支持 'Range Requests' 或 'Byte Serving' - 这允许服务器仅响应给定 HTTP 请求中范围指定的文件的一部分。

更复杂的自适应比特率流协议,例如 HLS、SmoothStreaming、HDS 和 DASH,通常具有关于可用视频和音频流的某种额外数据的概念,播放器将使用这些数据来选择流和请求块 - 例如 DASH 清单或 'mpd' 文件,其中包含有关流、时间、DRM(如果适用)等信息。它们甚至可能包括允许 'old' 实时流块的机制对于晚开始观看活动的人。无论如何,原理仍然相同 - 视频播放器发送多个单独的视频块请求 and/or 音频,并在本地组装这些块以在浏览器中播放它们。

查看开源视频流服务器之一,看看您是否可以调整它可能是最简单的方法,即使您的要求有点不同。