音视频协议详解

RTMP/HTTP-FLV

这两种协议都建立在FLV封装之上,且一般不写入磁盘,仅在内存中交换。

RTMP

  • 用于直播源推流和系统内直播流数据传递
  • 端口号1935,建立TCP长连接
  • 延迟一般为1~3s
  • 推流地址和播放地址相同
  • 存在高并发问题
  • 因浏览器摒弃flash,主要用于直播源推流和CDN推流
  • 强制切片以保证实时性和弱网抵抗能力,但有性能损耗

HTTP-FLV

  • 主要用于客户端观看
  • 是RTMP的HTTP版本
  • 网页需要引入flv.js才能播放

WebRTC协议

基本特性

  • Web Real-Time Communication
  • 允许浏览器之间直接连接
  • 延迟低于1s,使用UDP通道
  • 推拉流地址格式:webrtc://127.0.0.1:8000/live

连接机制

  1. 点对点协议(PPP)
  2. 需要信令服务器作为初始中转
  3. 信令内容包括:
    • 媒体流元数据
    • 网络数据信息

连接方式

  1. 本地局域网直接通信
  2. 通过STUN服务器获取公网IP
  3. TURN服务器作为备选方案

多对多通信模式

  1. Mesh模式

    • 优点:实现简单
    • 缺点:仅支持4-6人
  2. MCU模式

    • 优点:支持多人
    • 缺点:服务器压力大
  3. SFU模式

    • 优点:服务器压力适中
    • 缺点:带宽消耗大
    • 适用于一对多通信

RTSP协议

  • 主要用于摄像头/监控设备
  • 支持TCP/UDP切换
  • 支持推流拉流
  • 支持点播直播
  • 现代浏览器不支持

直播系统架构

工作流程

1
直播源 -> 服务器1 -> 转码处理 -> 服务器2 -> 客户端

功能特性

  • 支持转码处理
  • 支持水印添加
  • 支持清晰度转换
  • 支持码率限制
  • 支持直播录像

封装格式对比

MP4

  • 支持自定义封面
  • 树状结构数据块
  • 主要数据块:
    • ftyp:编码格式信息
    • moov:元数据
    • mdat:音视频数据

FLV

  • 适合网络视频播放
  • 大文件/长时间播放稳定
  • 支持时间戳索引
  • 需要建立I帧索引

HLS

  • 基于HTTP下载
  • 由ts文件和m3u8索引组成
  • 支持二级索引
  • 延迟较大(5~30秒)

H.264编码原理

码流分层

  • VAL:视频编码层
  • NAL:网络提取层

帧类型

  • I帧:完整帧
  • P帧:差异编码
  • B帧:双向参考
  • IDR帧:重置参考
  • GOP组:关键帧组

参数优化

  1. 码率控制
  2. 分辨率/帧率调整
  3. GOP设置:
    • 在线播放:帧率的4-5倍
    • 直播:帧率的1-2倍

推流命令示例

1
.\ffmpeg -re -f dshow -i video="USB2.0 HD UVC WebCam" -vcodec libx264 -acodec aac -f flv -g 60 -bf 0 rtmp://127.0.0.1/live/test

参数说明:

  • -re:按原帧率读取
  • -f dshow:Windows视频获取
  • -g 60:GOP大小
  • -bf 0:禁用B帧