为 Ogg 媒体配置服务器

HTML <audio><video> 元素允许媒体呈现,而无需用户安装任何插件或其他软件即可实现。本指南介绍了一些 Web 服务器可能需要进行的服务器配置更改,以便正确地提供 Ogg 媒体文件。如果您遇到服务器尚未配置为识别的其他媒体类型,这些信息也可能有用。

使用正确的 MIME 类型提供媒体

包含视频(当然,可能还包含音频轨道)的 *.ogg*.ogv 文件应使用 video/ogg MIME 类型提供服务。仅包含音频的 *.oga*.ogg 文件应使用 audio/ogg MIME 类型提供服务。

如果您不知道 Ogg 文件包含音频还是视频,您可以使用 MIME 类型 application/ogg 提供服务,浏览器会将其视为视频文件。

大多数服务器默认情况下不会使用正确的 MIME 类型提供 Ogg 媒体服务,因此您可能需要为此添加相应的配置。

对于 Apache,您可以在配置中添加以下内容

AddType audio/ogg .oga
AddType video/ogg .ogv
AddType application/ogg .ogg

您可以在我们全面的 网络媒体类型和格式指南 中找到有关可能的媒体文件类型以及其中使用的编解码器的具体信息。特别是,关于 媒体容器格式 的文章在配置服务器以正确托管媒体时将特别有用。

正确处理 HTTP 1.1 字节范围请求

为了支持查找和播放尚未下载的媒体区域,Firefox 使用 HTTP 1.1 字节范围请求从查找目标位置检索媒体。此外,它使用字节范围请求查找媒体的末尾(假设您提供了 Content-Length 标头),以确定媒体的持续时间。

如果您的服务器可以接受字节范围请求,则应接受 Accept-Ranges: bytes HTTP 标头。它必须返回 206: Partial content 给所有字节范围请求;否则,浏览器无法确定您是否真正支持字节范围请求。您的服务器还必须为请求 Range: bytes=0- 返回 206: Partial Content

有关更多信息,请参阅 HTTP 范围请求

包含常规关键帧

当浏览器在 Ogg 媒体中查找指定时间时,它必须查找查找目标之前的最近关键帧,然后从那里下载并解码视频,直到到达请求的目标时间。关键帧之间的间隔越远,所需时间就越长,因此在定期间隔包含关键帧很有帮助。

默认情况下,ffmpeg2theora 每 64 帧使用一个关键帧(或在每秒 30 帧的情况下大约每 2 秒使用一个关键帧),这效果很好。

注意:当然,您使用的关键帧越多,视频文件就越大,因此您可能需要进行一些实验以在文件大小和查找性能之间取得正确的平衡。

考虑使用 preload 属性

HTML <audio><video> 元素提供 preload 属性,该属性指示浏览器在页面加载时尝试下载整个媒体。如果没有 preload,浏览器只会下载足够的媒体以显示第一帧视频并确定媒体的持续时间。

preload 默认情况下处于关闭状态,因此,如果视频是网页的重点,则在视频元素中包含 preload 可能可以让用户感到满意。使用 preload="metadata" 将预加载媒体文件的元数据以及可能的前几帧视频。将 payload 设置为 auto 会告诉浏览器在页面加载后立即开始下载媒体,假设用户将播放它。

旧版 Firefox 版本的配置

提供 X-Content-Duration 标头

注意:Firefox 41 开始,不再支持 X-Content-Duration 标头。有关更多详细信息,请参阅 Firefox 错误 1160695

Ogg 格式不会封装媒体的持续时间,因此,为了在视频控件上的进度条上显示视频的持续时间,Gecko 需要使用其他方法确定媒体的长度。

Gecko 可以通过两种方式做到这一点。最佳方法是在提供 Ogg 媒体文件时提供 X-Content-Duration 标头。此标头以秒为单位(不是 HH:MM:SS 格式)提供视频的持续时间,作为浮点值。

例如,如果视频长 1 分 32.6 秒,则此标头将为

http
X-Content-Duration: 92.6

如果您的服务器在提供 Ogg 媒体时提供 X-Content-Duration 标头,则 Gecko 不必执行任何额外的 HTTP 请求来查找文件的末尾以计算其持续时间。这使得整个过程更加高效,也更加准确。

作为一种较差的替代方案,Gecko 可以根据 Content-Length 估算视频长度。请参阅下一条。

不要对媒体文件使用 HTTP 压缩

减少 Web 服务器负载的一种常见方法是在提供给支持 Web 浏览器的服务时使用 gzip 或 deflate 压缩

虽然不太可能,但浏览器可能会在请求媒体文件时使用 Accept-Encoding: gzip,deflate 标头声明它支持 HTTP 压缩 (gzip/deflate)。您的服务器应配置为不这样做。媒体文件中的数据已经过压缩,因此您不会从压缩中获得任何实际好处,并且使用压缩会使浏览器无法正确查找视频或确定其持续时间。

允许 HTTP 压缩进行媒体流传输的另一个问题:如果使用 gzip 编码,则 Apache 服务器不会发送 Content-Length 响应标头。

获取 Ogg 媒体的持续时间

您可以使用 oggz-info 工具获取媒体持续时间;此工具包含在 oggz-tools 包中。oggz-info 的输出如下所示

$ oggz-info /g/media/bruce_vs_ironman.ogv
Content-Duration: 00:01:00.046

Skeleton: serialno 1976223438
        4 packets in 3 pages, 1.3 packets/page, 27.508% Ogg overhead
        Presentation-Time: 0.000
        Basetime: 0.000

Theora: serialno 0170995062
        1790 packets in 1068 pages, 1.7 packets/page, 1.049% Ogg overhead
        Video-Framerate: 29.983 fps
        Video-Width: 640
        Video-Height: 360

Vorbis: serialno 0708996688
        4531 packets in 167 pages, 27.1 packets/page, 1.408% Ogg overhead
        Audio-Samplerate: 44100 Hz
        Audio-Channels: 2

请注意,您不能提供 oggz-info 报告的 Content-Duration 行,因为它以 HH:MM:SS 格式报告。您需要将其转换为仅以秒为单位,然后将其作为 X-Content-Duration 值提供服务。只需将 HH、MM 和 SS 解析为数字,然后执行 (HH*3600)+(MM*60)+SS 以获取您应报告的值。

需要注意的是,oggz-info 似乎会对媒体进行读取以计算其持续时间,因此最好存储持续时间值,以避免在每次 HTTP 请求您的 Ogg 媒体时计算该值而导致的长时间延迟。

另请参阅