RTMP 在直播场景的应用与动手实践
RTMP (Real Time Messaging Protocol)
RTMP(Real Time Messaging Protocol)是一种设计用于实时数据通信的网络协议,主要用于在 Flash/AIR 平台和支持 RTMP 服务器之间流式传输音频、视频和数据。 RTMP 是一种 TCP/IP 协议,通常运行在1935端口上。它维护持久的连接,并允许低延迟通信,使得视频和音频流可以平滑地在用户和服务器之间传输。这种协议非常适合需要低延迟的直播应用,例如直播视频播放或在线游戏。 RTMP 协议之所以适合实时数据通信,是因为它具备以下设计特征和优势: 持久连接:RTMP 在客户端和服务器之间建立了一个持久的 TCP 连接,这种连接方式可以保持数据流的持续和稳定传输,适合视频和音频这样的连续媒体数据。 低延迟:RTMP 协议针对实时性做了优化,能够快速地传递数据,减少缓冲,这对于直播流媒体来说至关重要。 数据分块:RTMP 将数据分成小块传输,这使得即使在网络条件不佳的情况下,也能够实现流畅的播放,因为小块数据更容易快速处理和传输。 流控制:RTMP 允许对数据流进行各种控制,如暂停、播放、停止等操作,这些控制命令可以实时发送,使用户和服务器能够实时交互。 带宽检测和管理:RTMP 协议可以动态检测当前的网络带宽,并调整数据传输速率,以适应不同的网络环境,确保视频流尽可能平滑。 消息类型多样:RTMP 支持多种类型的消息,包括音频、视频、命令和数据消息。这种多样性允许 RTMP 传输各种类型的内容,而不仅仅是媒体数据。 上下行对等:RTMP 支持双向通信,使得客户端和服务器都可以发送和接收数据,这对于交互式应用程序来说是必须的。 灵活性:RTMP 协议可以被封装进其他协议中(例如 RTMPT 是 RTMP 封装在 HTTP 中),使其能够穿透防火墙,增加了它的实用性。 支持 RTMP 协议的软件服务器众多,包含 SRS,Adobe Media Server,Wowza Streaming Engine,Red5,nginx ... ... 其中之一的 Nginx 作为一款高性能的 http 与反向代理服务,通过 RTMP 模块为 Nginx 添加了实时消息传输协议 (RTMP) 的支持,使其能够作为一个完整的流媒体服务器来处理视频和音频流。 Nginx RTMP Module 的主要特点如下: 要使用 Nginx 的 RTMP 模块,通常需要从源代码编译 Nginx,并在编译时添加 RTMP 模块。这是因为大多数预编译的 Nginx 包并不包含该模块。编译 Nginx 时,需要使用 --add-module 配置参数指向 RTMP 模块的源代码目录。 并添加一个 rtmp 块,其中定义了 RTMP 相关的设置。 为了快捷演示,我们使用已经集成 RTMP 模块的 nginx docker 镜像 DockerFile nginx.conf 构建 创建容器 我们这里使用安卓设备来捕获实时拍摄视频并上传到 RTMP 服务器。 常见的RTMP直播客户端 这里以 Streamlabs演示为主,在客户端配置好 RTMP 服务器地址与 stream key,手机端开启直播 使用支持 RTMP 协议的 pc 客户端举例,如 VLC 到此我们就搭建了一台简单的直播服务并完成一场直播。 除了实时直播外,我们还可以通过 FFmpeg 之类的工具来将视频文件实时编码并以 RMTP 协议传输到服务端,实现伪直播。 这个 最初被设计用在 Adobe Flash Platform 上,用于流式传输音视频数据。随着时间的发展,尽管 Flash Player 被逐渐淘汰,RTMP 仍被广泛用于直播流和其他实时应用中,部分原因是它的低延迟特性和对实时互动的良好支持。 低延迟: RTMP 适合需要低延迟交互的应用,比如直播。尽管新协议如 SRT 和 WebRTC 提供更低延迟,但 RTMP 在许多现有系统中已经成熟和稳定。 广泛支持: 许多流媒体平台和编码器仍然支持 RTMP,这意味着它可以与许多现有的技术和基础设施无缝集成。 成熟的生态系统: RTMP 拥有一个成熟的生态系统,包括流服务器(如 Adobe Media Server、Wowza、nginx-rtmp-module)、播放器和开发工具。 简单的服务器端处理: RTMP 服务器可以轻松地接收推流并将其转发或转码成其他格式,如 HLS,以便分发。 随着互联网技术的发展,出现了新的流媒体传输协议,它们旨在解决 RTMP 的一些限制,并提供更高效、更灵活的解决方案。以下列举一些新兴的流媒体协议以及它们带来的好处: HLS (HTTP Live Streaming): 由 Apple 开发的一种流媒体协议,它工作于 HTTP 上,更易于穿越防火墙,并允许内容分发网络(CDN)缓存,从而减少带宽需求和成本。但是,它的延迟性通常高于 RTMP。 DASH (Dynamic Adaptive Streaming over HTTP): 类似于 HLS,DASH 也是一种自适应比特率流技术,它是通过 HTTP 传输的,支持跨平台,并被设计为开放标准。 WebRTC (Web Real-Time Communication): 这是一个提供浏览器间(peer-to-peer)通信的协议和API集合,支持实时视频、音频和数据共享。WebRTC 设计用于极低延迟的通信,适合视频会议和实时互动应用。简介
RTMP 协议的设计特点
RTMP 服务器
安装
配置
rtmp {
server {
listen 1935; # RTMP 默认端口
chunk_size 4096; # 设置 RTMP 分块的大小
application live {
live on; # 开启直播
record off; # 关闭录制功能
# 更多配置...
}
# 其他 application 配置...
}
}动手操作
启动 nginx 与 RTMP 模块
tiangolo/nginx-rtmp 来构建我们的镜像:FROM tiangolo/nginx-rtmp
COPY nginx.conf /etc/nginx/nginx.confuser root;
worker_processes 1; # 根据你的服务器硬件配置调整工作进程的数量
events {
worker_connections 1024; # 每个进程的最大连接数
}
# RTMP 配置
rtmp {
server {
listen 1935; # 监听的端口
chunk_size 4096; # RTMP数据传输的块大小
# RTMP应用配置
application live {
live on; # 允许实时视频流
record off; # 关闭录制功能
}
}➜ docker build -t nginxrtmp:1.0 . ➜ docker run -d -p 1935:1935 -p 8080:8080 nginxrtmp:1.0发布视频流

拉取视频流

文件转视频流
➜ ffmpeg -i jordan.mp4 -c:v libx264 -c:a aac -strict experimental -f flv rtmp://localhost/live/jordan ffmpeg 命令用于将视频文件(在这个例子中是 jordan.mp4)转码并实时通过 RTMP 协议传输到一个本地 nginx-rtmp 服务器。以下是命令中各个参数的详细解释:ffmpeg: 这是调用 ffmpeg 程序的命令。-i jordan.mp4: -i 参数指定输入文件,这里的输入文件是 jordan.mp4。-c:v libx264: -c:v 参数指定视频编码器。这里使用的是 libx264,这是一个非常流行的开源H.264视频编码器。它负责将原始视频数据编码为 H.264 格式。-c:a aac: -c:a 参数指定音频编码器。这里使用的是 aac 编码器,它是一个广泛使用的音频编码格式,与大多数设备和流媒体服务兼容。-strict experimental: 有些 ffmpeg 版本要求使用此参数来启用实验性功能,尤其是在编码某些格式(如 AAC)时。不过,这个参数在新版本的 ffmpeg 中往往不再必要,因为 AAC 编码器已经不是实验性的了。-f flv: -f 参数指定输出格式。这里指定的是 FLV(Flash Video Format),它是与 RTMP 流媒体协议兼容的一种容器格式。rtmp://localhost/live/jordan: 指定了流的目的地。这是一个 RTMP URL,它告诉 ffmpeg 通过 RTMP 协议将流发送到本地服务器。在这个例子中,localhost 表示 RTMP 服务器运行在本地机器上。
RMTP 现状与未来
新生代协议




