为 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 属性
旧版 Firefox 版本的配置
提供 X-Content-Duration 标头
注意:从 Firefox 41 开始,不再支持 X-Content-Duration
标头。有关更多详细信息,请参阅 Firefox 错误 1160695。
Ogg 格式不会封装媒体的持续时间,因此,为了在视频控件上的进度条上显示视频的持续时间,Gecko 需要使用其他方法确定媒体的长度。
Gecko 可以通过两种方式做到这一点。最佳方法是在提供 Ogg 媒体文件时提供 X-Content-Duration
标头。此标头以秒为单位(不是 HH:MM:SS 格式)提供视频的持续时间,作为浮点值。
例如,如果视频长 1 分 32.6 秒,则此标头将为
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 媒体时计算该值而导致的长时间延迟。