网络音频和视频直播

直播技术通常用于转播体育赛事、音乐会以及更普遍的电视和广播节目。直播通常简称为流媒体,它是将媒体“实时”传输到计算机和设备的过程。这是一个相当复杂且新兴的课题,有很多变量,因此在本文中,我们将向您介绍这个主题,并告诉您如何入门。

将媒体流式传输到浏览器的关键考虑因素是,我们传输的是一个动态创建的文件,而不是播放一个有限的文件,它没有预先确定的开始或结束。

流媒体和静态媒体之间的主要区别

在本例中,我们使用静态媒体来描述由文件表示的媒体,无论是 mp3 还是 WebM 文件。此文件位于服务器上,并且可以像大多数其他文件一样交付到浏览器。这通常称为渐进式下载。

直播媒体没有固定的开始和结束时间,它不是静态文件,而是一系列数据,服务器将其传递到浏览器,并且通常是自适应的(见下文)。通常,我们需要不同的格式和特殊的服务器端软件才能实现这一点。

自适应流媒体

直播的主要优先事项之一是使播放器与流保持同步:自适应流媒体是在低带宽情况下实现此目的的一种技术。其思想是监控数据传输速率,如果看起来跟不上,我们就会降到较低的带宽(以及随之而来的较低质量)流。为了拥有此功能,我们需要使用促进此功能的格式。直播格式通常允许自适应流媒体,方法是将流分成一系列小的片段,并以不同的质量和比特率提供这些片段。

点播音频和视频流媒体

流媒体技术不仅用于直播。它还可以替代传统的渐进式下载方法用于点播音频和视频。

这样做有几个优点:

  • 延迟通常较低,因此媒体将更快地开始播放。
  • 自适应流媒体可在各种设备上提供更好的体验。
  • 媒体是即时下载的,这使得带宽使用更有效率。

流媒体协议

虽然静态媒体通常通过 HTTP 提供服务,但有几种协议用于提供自适应流;让我们看看这些选项。

HTTP

目前,HTTP 是迄今为止最常用的协议,用于传输点播或直播媒体。

RTMP

实时消息传递协议 (RTMP) 是 Macromedia(现为 Adobe)开发的一种专有协议,并由 Adobe Flash 插件支持。RTMP 有多种形式,包括 RTMPE(加密)、RTMPS(通过 TLS/SSL 安全)和 RTMPT(封装在 HTTP 请求中)。

RTSP

注意:实时流协议 (RTSP) 控制端点之间的媒体会话,并且通常与实时传输协议 (RTP) 和实时控制协议 (RTCP) 一起用于媒体流交付。将 RTP 与 RTCP 一起使用可以实现自适应流媒体。这在大多数浏览器中尚不支持。

一些供应商实施专有传输协议,例如 RealNetworks 及其 Real 数据传输 (RDT)。

RTSP 2.0

RTSP 2.0 目前正在开发中,与 RTSP 1.0 不兼容。

警告:尽管<audio><video> 标签与协议无关,但目前没有浏览器支持除 HTTP 之外的任何协议,而无需插件,尽管这种情况看起来即将改变。除 HTTP 之外的协议也可能受到防火墙或代理服务器的阻止。

使用流媒体协议

如果您习惯于通过 HTTP 使用媒体,那么使用各种协议的过程令人欣慰地熟悉。

例如

html
<video src="rtsp://myhost.com/mymedia.format">
  <!-- Fallback here -->
</video>

媒体源扩展 (MSE)

媒体源扩展 是 W3C 的工作草案,计划扩展 HTMLMediaElement 以允许 JavaScript 生成用于播放的媒体流。允许 JavaScript 生成流促进了各种用例,例如自适应流媒体和直播流的时移。

例如,您可以使用 JavaScript 实现 MPEG-DASH,同时将解码卸载到 MSE

注意:时移是指在直播发生一段时间后观看直播流的过程。

视频流媒体文件格式

一些基于 HTTP 的直播视频格式开始在浏览器中获得支持。

注意:您可以在设置自适应流媒体源中找到有关编码 HLS 和 MPEG-DASH 以在 Web 上使用的指南。

MPEG-DASH

DASH 代表动态自适应流媒体 over HTTP。它通过媒体源扩展获得支持,媒体源扩展由诸如 DASH.js 之类的 JavaScript 库使用。这种方法允许我们使用 XHR 下载视频流的块,并将这些块“附加”到 <video> 元素播放的流中。例如,如果我们检测到网络速度缓慢,我们可以开始请求下一段的较低质量(较小)块。此技术还允许将广告片段附加/插入到流中。

HLS

HLS 或 HTTP Live Streaming 是 Apple Inc 发明的一种协议,在 iOS、Safari 和最新版本的 Android 浏览器/Chrome 上受支持。HLS 也是自适应的。

HLS 也可以使用 JavaScript 解码,这意味着我们可以支持最新版本的 Firefox、Chrome 和 Safari。请参阅此HTTP Live Streaming JavaScript 播放器

在流会话开始时,会下载一个扩展的 M3U (m3u8) 播放列表。其中包含所提供的各种子流的元数据。

音频流媒体文件格式

还有一些音频格式:

Opus

Opus 是一种免版税的开放格式,它能够在各种比特率下针对不同类型的音频优化质量。音乐和语音可以通过不同的方式进行优化,Opus 使用 SILK 和 CELT 编解码器来实现这一点。

目前,Firefox 桌面版和移动版以及最新版本的 Chrome 桌面版和 Opera 支持 Opus。

MP3、AAC、Ogg Vorbis

大多数常见的音频格式可以使用特定的服务器端技术进行流式传输。

注意:使用非流媒体格式流式传输音频可能更容易,因为与视频不同,它没有关键帧。

服务器端流媒体技术

为了流式传输实时音频和视频,您需要在服务器上运行特定的流媒体软件或使用第三方服务。

GStreamer

GStreamer 是一个开源的跨平台多媒体框架,允许您创建各种媒体处理组件,包括流媒体组件。通过其插件系统,GStreamer 支持一百多种编解码器(包括 MPEG-1、MPEG-2、MPEG-4、H.261、H.263、H.264、RealVideo、MP3、WMV 和 FLV)。

存在诸如 souphttpclientsinkshout2send 之类的 GStreamer 插件,用于通过 HTTP 流式传输媒体,或者您也可以与 Python 的 Twisted 框架集成。

对于 RTMP 传输,您可以使用 Nginx RTMP 模块

SHOUTcast

对于网页使用,SHOUTcast 流媒体通过 HTTP 传输。

注意:SHOUTcast URL 可能需要附加分号。

Icecast

它由 Xiph.org 基金会维护,通过 SHOUTcast 协议流式传输 Ogg Vorbis/Theora 以及 MP3 和 AAC 格式。

注意:SHOUTcast 和 Icecast 是最成熟和流行的技术之一,但还有许多其他可用的流媒体系统。

流媒体服务

虽然您可以安装像 GStreamer、SHOUTcast 和 Icecast 这样的软件,但您也会发现许多第三方流媒体服务,这些服务可以为您完成大部分工作。

另请参阅