为 Ogg 媒体配置服务器

HTML 的 <audio><video> 元素允许无需用户安装扩展程序或其他软件即可呈现媒体。本指南涵盖了正确提供 Ogg 媒体文件可能需要的服务器配置。如果您遇到服务器尚未配置为识别的其他媒体类型,这些信息也可能很有用。

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

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

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

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

对于 Apache,您可以将以下内容添加到您的配置中

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

关于媒体容器格式的文章在正确配置服务器托管媒体时特别有帮助。

正确处理范围请求

为了支持在尚未下载的媒体区域进行跳转和播放,您可以使用范围请求从跳转目标位置检索媒体。此外,它使用字节范围请求跳转到媒体末尾(假设您提供了Content-Length标头)以确定媒体的时长。

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

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

包含常规关键帧

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

默认情况下,ffmpeg2theora 每 64 帧使用一个关键帧(或在 30 帧/秒的情况下大约每 2 秒一个),效果相当不错。

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

考虑使用 preload 属性

HTML 的 <audio><video> 元素提供了 preload 属性,它告诉浏览器在页面加载时尝试下载整个媒体。没有 preload,浏览器只会下载足够的媒体来显示第一个视频帧并确定媒体的时长。

  • preload 默认是关闭的,所以如果视频是您网页的重点,您的用户可能会很感激您在视频元素中包含 preload
  • 使用 preload="metadata" 将预加载媒体文件的元数据,可能还有视频的前几帧。将 payload 设置为 auto 会告知浏览器在页面加载后立即开始自动下载媒体,假设用户会播放它。

不要对 Ogg 媒体使用 HTTP 压缩

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

尽管不太可能,但当请求媒体文件时,浏览器可能通过 Accept-Encoding: gzip,deflate 标头声明它支持 HTTP 压缩(gzip/deflate)。您的服务器不应该配置成这样做。媒体文件中的数据已经过压缩,因此您不会获得任何实际的压缩收益,并且使用压缩将导致浏览器无法正确跳转视频或确定其时长。

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

获取 Ogg 媒体的时长

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

bash
$ 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 值提供。您可以通过解析 HHMMSS 分段,然后将其转换为 (HH * 3600) + (MM * 60) + SS 作为您应该报告的值来实现。

重要的是要注意,oggz-info 似乎会进行一次读取过程来计算媒体时长,因此最好将时长值存储起来,以避免在每次请求 Ogg 媒体的 HTTP 请求计算该值时出现长时间延迟。

另见