网络音频和视频直播
直播技术通常用于转播体育赛事、音乐会以及更普遍的电视和广播节目。直播通常简称为流媒体,它是将媒体“实时”传输到计算机和设备的过程。这是一个相当复杂且新兴的课题,有很多变量,因此在本文中,我们将向您介绍这个主题,并告诉您如何入门。
将媒体流式传输到浏览器的关键考虑因素是,我们传输的是一个动态创建的文件,而不是播放一个有限的文件,它没有预先确定的开始或结束。
流媒体和静态媒体之间的主要区别
在本例中,我们使用静态媒体来描述由文件表示的媒体,无论是 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
使用流媒体协议
如果您习惯于通过 HTTP 使用媒体,那么使用各种协议的过程令人欣慰地熟悉。
例如
<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>
元素播放的流中。例如,如果我们检测到网络速度缓慢,我们可以开始请求下一段的较低质量(较小)块。此技术还允许将广告片段附加/插入到流中。
注意:您还可以将 WebM 与 MPEG DASH 自适应流媒体系统一起使用。
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)。
存在诸如 souphttpclientsink 和 shout2send 之类的 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 这样的软件,但您也会发现许多第三方流媒体服务,这些服务可以为您完成大部分工作。
另请参阅
- HTTP 实时流
- HLS 浏览器支持
- HTTP 实时流 JavaScript 播放器
- HTTP 实时流的基础知识
- HTML 5 视频的 DASH 自适应流媒体
- 基于 HTTP 的动态自适应流 (MPEG-DASH)
- MPEG-DASH 媒体源演示
- DASH 参考客户端
- 通过 HTTP 进行动态流式传输
- MPEG-DASH 部署现状
- 无需插件:使用 Media Source Extensions 和 MPEG-DASH 进行浏览器实时流
- 媒体源扩展 (W3C)
- Icecast
- SHOUTcast
- GStreamer
- 通过 HTTP 流式传输 GStreamer 管道
- GStreamer 和树莓派
- 流媒体系统比较
- Mozilla Hacks - 使用媒体源扩展点播流媒体