SRS 入门:HTTP-FLV 框架、配置与拉流

对应视频:

  • 142--07-SRS流媒体服务器-HTTP-FLV框架分析.mp4
  • 143--08-1-SRS流媒体服务器-HTTP-FLV-配置文件.mp4
  • 144--08-2-SRS流媒体服务器-HTTP-FLV拉流.mp4

这篇讲 HTTP-FLV 是什么、它和 RTMP 的关系、SRS 如何配置和处理 HTTP-FLV 拉流。

1. HTTP-FLV 是什么

HTTP-FLV 是通过 HTTP 连接传输 FLV 数据的一种直播方式。

它的 URL 通常长这样:

http://server-ip:8080/live/livestream.flv

和 RTMP 相比:

项目RTMPHTTP-FLV
传输协议RTMP over TCPHTTP over TCP
浏览器友好度原生不友好更容易被 Web 播放器接入
延迟较低较低,通常也适合直播
数据封装RTMP message/chunkFLV tag 持续输出

HTTP-FLV 在 SRS 中的位置

2. HTTP-FLV 的关键原理

普通 HTTP 响应通常有明确长度,例如 Content-Length。浏览器收到指定长度的数据后,请求就结束。

直播不一样:服务端不知道直播什么时候结束,所以 HTTP-FLV 会保持 HTTP 连接,不断往响应体里写 FLV 数据。

课程里强调的点:

HTTP 响应头先返回
不固定 Content-Length
后面持续发送 FLV tag
客户端边收边播
连接断开才结束

HTTP-FLV 技术实现说明

典型响应头:

HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Type: video/x-flv
Transfer-Encoding: chunked

3. HTTP-FLV 和 RTMP 的关系

HTTP-FLV 不一定需要新的推流协议。常见场景是:

推流端 --RTMP--> SRS --HTTP-FLV--> 播放器

也就是说,推流仍然可以是 RTMP。SRS 收到音视频数据后,把同一路 SrsSource 转换成 FLV tag,通过 HTTP 发给客户端。

简化流程:

RTMP 推流进入 SrsSource
HTTP 客户端请求 .flv
SRS 创建 HTTP-FLV consumer
发送 FLV header
发送 metadata
发送 audio/video FLV tag

HTTP-FLV 框架和流向

4. SRS 配置文件

要使用 HTTP-FLV,需要关注两类配置:

  1. HTTP server 是否开启。
  2. HTTP-FLV live stream 是否开启、挂载路径是什么。

HTTP-FLV 配置文件

入门可以先理解成:

http_server:
    enabled on
    listen 8080

http_remux:
    enabled on
    mount [vhost]/[app]/[stream].flv

具体配置以课程使用的 SRS 版本为准,但核心意思不变:

5. HTTP-FLV URL

如果 RTMP 推流 URL 是:

rtmp://192.168.1.10/live/livestream

HTTP-FLV 拉流 URL 可能是:

http://192.168.1.10:8080/live/livestream.flv

HTTP-FLV URL 和映射关系

新手最容易错的地方:

6. HTTP-FLV 拉流源码流程

HTTP-FLV 拉流本质上是 HTTP 请求进入 SRS 后,找到对应流,然后持续写 FLV 数据。

简化源码路径:

HTTP client 请求 /live/livestream.flv
SRS HTTP server 接收请求
匹配 HTTP-FLV handler
解析 app/stream
找到 SrsSource
创建 consumer
发送 FLV header
循环读取 consumer 消息
转换成 FLV tag
写入 HTTP response

HTTP-FLV 拉流相关类

HTTP-FLV 拉流代码

7. FLV Tag 入门

FLV 文件或流由 FLV header 和一系列 tag 组成。

FLV Header
PreviousTagSize0
Tag1
PreviousTagSize1
Tag2
PreviousTagSize2
...

常见 tag 类型:

Tag含义
Script Tag元数据,例如宽高、编码、帧率
Video Tag视频数据,例如 H.264
Audio Tag音频数据,例如 AAC

HTTP-FLV 直播就是把这些 tag 源源不断写到 HTTP 响应体里。

HTTP-FLV 发送代码路径

8. 调试顺序

如果 HTTP-FLV 拉不到流,按这个顺序排查:

1. RTMP 推流是否成功
2. SRS 是否创建了对应 SrsSource
3. HTTP server 端口是否开启
4. HTTP-FLV/remux 是否开启
5. URL 的 app/stream 是否和推流一致
6. 浏览器或播放器是否收到 HTTP 200
7. 响应 Content-Type 是否是 video/x-flv
8. 后续是否持续有 FLV tag 输出

如果能打开 HTTP 连接但不播放,重点查:

最后记住:

HTTP-FLV = HTTP 长连接 + FLV header + 持续输出 FLV tag。

评论

...

正在读取评论。