有关 RTMP、FMS、HLS 等概念,可以参看 Adobe Flash Media Server 使用的基本概念一文。

使用 Simple RTMP Server (以下简称 SRS)可以对 RTMP 流进行分发,实现当下非常流行的视频直播功能。记录几个小细节,以便以后翻阅。

1. SRS 的安装非常简单,只需要按照文档一步一步做即可

根据配置好的 RTMP 地址,直播流生产者和消费者都使用同一个地址来推送流和观看流(需要把 IP 换成实际的 IP 地址):

rtmp://192.168.1.170/live/livestream

至于如何生成 RTMP 流,可以有多个方法,比如说使用 FFmpeg 从视频文件里读取流并推送到指定的 RTMP 地址:

D:\OpenSource\ffmpeg\bin>ffmpeg.exe -re -i G:\movie\source.200kbps.768x320.flv -vcodec copy -acodec copy -f flv -y rtmp://192.168.31.185/live/livestream

或者你可以使用 OBS/XSplit/FFSplit 之类的软件来推流。

2. 为什么使用 RTMP 流而不使用其它的 RTSP 或是 HLS 之类的方式呢?

主要是 RTMP 的延时低、浏览器里支持好等决定的,详情查阅 RTMP 与 HLS 分发方式的对比

RTSP 主要使用在安防领域,在互联网上使用不广。要知道当初 RTMP 流行起来,主要拜 YouTube 所赐,慢慢地也就成了事实上的工业标准,大部分的浏览器都可兼容这个协议,从而使得在浏览器里浏览视频变得统一。一旦事实的标准形成,就很难再给其它协议机会了。

补充一个 RTMP 与 RTSP 的区别:

The Real Time Streaming Protocol (RTSP) is a network control protocol designed for use in entertainment and communications systems to control streaming media servers. The protocol is used for establishing and controlling media sessions between end points. Clients of media servers issue VCR-like commands, such as play and pause, to facilitate real-time control of playback of media files from the server.

Real Time Messaging Protocol (RTMP) was initially a proprietary protocol developed by Macromedia for streaming audio, video and data over the Internet, between a Flash player and a server.

RTSP 一开始就是一个公开的标准,而 RTMP 最早是 Adobe 制定的、后来才开放的标准。

像 Android 手机啥的,一般都支持 RTSP 流的播放;而对于 RTMP,则可能需要自己开发。RTMP 主要的优势是 Flash Player 的支持比较好,从而可以轻松地在浏览器里观看。

HDS/HLS 在 PC 上如果使用客户端来看,都需要库支持,折腾起来很麻烦。

HLS 和 RTMP 两种分发方式,就可以支持所有的终端。

HLS 作为流媒体协议非常简单,Apple 支持得也很完善。Android 对 HLS 的支持也会越来越完善,现在也有专门的公司在 Android 上开发 HLS 播放器。

3. SRS 应该使用了 FFmpeg 等多个库来作为支撑,在编译的时候需要指定相应的编译参数

SRS 有大量的编译选项,这个可以通过不同的参数来配置,比如说 FFmpeg 这些就需要通过 –with-ffmpeg 参数来 configure 一把,才会编译出来。参看编译SRS一节。

比如说使用下面的配置命令:

./configure --rtmp-hls --with-http-api --demo --with-ffmpeg
make

就基本上可以使用

./scripts/run.sh

来测试 HLS 和 RTMP 流。

4. SRS-librtmp 方便编写推流客户端

据 SRS 说,原本的 librtmp 库很烂,所以它提供了一个更好的实现:SRS-librtmp,这个可以用在客户端上来进行推流操作。