跳到主要内容

RTMP 缩写代表“Real-Time-Messaging-Protocal”。RTMPS 意即TLS、SSL之上的RTMP协议。

RTMP 最初由 Macromedia 创建,用于在 Flash 服务器之间进行音视频流传输。 现在,收购了 Macromedia 的 Adobe 已经开放了这个专有协议供公众使用。

2020 年,它仍然是在 Facebook、Instagram、YouTube、Twitch、Twitter Periscope 和许多其他平台上视频直播的标准格式。

FFMPEG 可以直接将媒体内容流式传输到 RTMP/RTMPS 服务器。

流式传输预先录制的内容

将预先录制的视频流式传输到 RTMP 服务器的方法有很多,第一种方法是将原始录制文件作为输入并将其实时转换为 RTMP 协议的标准格式,FLV。此方法将导致CPU占用率变高,因为它会实时处理输入文件,以便对其进行转换和流式传输。 对于实时流媒体或 VOD(视频点播)服务,需要生成遵循特定“关键帧间隔”的流,这意味着相邻两个 I 帧之间的间隔必须遵守特定值,来为观众提供最佳的用户体验。

例如:YouTube直播要求关键帧频率为 2 秒,不超过 4 秒。

Facebook直播要求 2 秒的关键帧间隔。

Twitch 也要求 2 秒的关键帧间隔。

YouTube 直播的流媒体

如前所述,YouTube Live 有一些要求才能在其平台上传输您的信号。 例如,对于 HD 1080p 流,您需要遵守以下要求:

  • 分辨率:1920x1080
  • 视频比特率范围:3000-6000 Kbps
  • 视频编解码器:H.264,4.1 级,最高 1080p 30 FPS 或 4.2 级,60 FPS
  • 关键帧频率:2 秒
  • 音频编解码器:AAC 或 Mp3
  • 比特率编码:CBR(恒定比特率)

考虑到所有这些,假设要在 YouTube 上直播全高清 1080p 25 FPS 视频,示例命令将是:

ffmpeg -re -i INPUT.mp4 -c:v libx264 -profile:v high -level:v 4.1 -preset veryfast -b:v 3000k -maxrate 3000k -bufsize 6000k -pix_fmt yuv420p -g 50 -keyint_min 50 -sc_threshold 0 -c:a aac -b:a 128k -ac 2 -ar 44100 -f flv "rtmp://a.rtmp.youtube.com/ live2/YOUR_STREAMING_KEY"

让我们分解上面的命令:

ffmpeg -re -i input.mp4:这是输入命令。 -re 选项(在 -i 之前)将指示 FFMPEG 以原始帧速率读取源文件。 这会减慢流媒体传输速度以模拟实时流媒体,并缓解直播中断带来的内存缓冲占用过大的问题。

-c:v libx264 -profile:v high -level:v 4.1 -preset veryfast:这将指示 FFMPEG 使用 libx264以High Profile生成优化的 h264 文件,High Profile是广播和 光盘存储应用程序主要配置文件,特别是高清电视应用程序,也适用于 HD DVD 和蓝光光盘。

-b:v 3000k -maxrate 3000k -bufsize 6000k:这将指示 FFMPEG 生成一个保持在 YouTube 要求的 3000-6000 视频比特率范围内的文件。 更具体地说,-b:v 选项指定视频比特率(您可以键入 3000k 或 3M),-maxrate 代表要流式传输的最大比特率,而 -bufsize(缓冲区大小)选项将计算产生的平均比特率。

-pix_fmt yuv420p:这将指示 FFMPEG 使用名为4:2:0 planar的色度二次采样方案。 出于兼容性原因指定此指令,因为您的输出必须可在不同的播放器和平台上播放。 色度二次采样(Chroma Subsampling)是通过对色度信息实施比亮度信息更低的分辨率来编码图像的做法,利用人类视觉系统对色差的敏锐度低于对亮度的敏锐度。 “YUV”是一种视频信号,由三个独立的信号组成:一个用于亮度(luminance,brightness),两个用于色度(chrominance、colours)。

-g 50:为了遵守所需的 2 秒关键帧间隔,这将设置值 50 GOP,图片组。 这里50只是一个例子。 要根据实际情况确定该值,只需将输出帧速率乘以 2。例如,如果您的原始输入以 24 FPS 运行,那么您将使用 -g 48。

-keyint_min value 50:这将指定 I 帧之间的最小距离,并且必须与 -g 值相同

-sc_threshold 0:这代表场景更改阈值。 FFmpeg 默认的关键帧间隔为 250 帧,并在场景变化时插入关键帧。 此选项将确保在图片内容发生更改时不添加任何新的关键帧。

-c:a aac -b:a 160k -ac 2 -ar 44100:使用此说明,您将使用内置的高级音频编解码器 (-c:a aac) 对音频进行 FFMPEG 编码,比特率为 160 Kbps ( -b:a 160k),立体声(“-ac 2”代表立体声),音频采样率为 44.100 kHz (-ar 44100)。

-f flv rtmp://a.rtmp.youtube.com/live2/[YOUR_STREAM_KEY]:这将指示 FFMPEG 将所有内容以所需的 FLV 格式输出到 YouTube RTMP 服务器。

请注意,上述命令将对您的输入源进行实时转换。 如果您的机器速度很慢并且无法处理实时编码过程,例如在全高清视频或 4K 或更高版本的情况下,可以在流式传输之前对文件进行预处理。

只需使用与上述相同的命令创建一个文件,但具有不同的目标(文件),例如在此示例中为全高清 1080p/25fps 视频:

ffmpeg -i INPUT.mp4 -c:v libx264 -profile:v high -level:v 4.1 -preset veryfast -b:v 3000k -maxrate 3000k -bufsize 6000k -pix_fmt yuv420p -g 50 -keyint_min 50 -sc_threshold 0 -c:a aac -b:a 128k -ac 2 -ar 44100 OUTPUT.mp4

也可以将预设调整为较慢的预设,以获得更好的压缩效果。

然后,您只需要将文件“流式复制”到 YouTube 或另一个 RTMP 目的地,例如:

ffmpeg -re -i OUTPUT.mp4 -c copy -f flv "rtmp://a.rtmp.youtube.com/live2/YOUR_STREAMING_KEY"

使视频无限循环:

ffmpeg -re -stream_loop -1 -i OUTPUT.mp4 -c copy -f flv "rtmp://a.rtmp.youtube.com/live2/YOUR_STREAMING_KEY"

循环一定次数(例如 4 次)

ffmpeg -re -stream_loop 4 -i OUTPUT.mp4 -c copy -f flv "rtmp://a.rtmp.youtube.com/live2/YOUR_STREAMING_KEY"

每个主流社交媒体平台都有技术指南,以便为最终用户提供最佳体验。

YouTube直播参数:https://support.google.com/youtube/answer/2853702?hl=zh-Hans

Twitter的Periscope直播参数:https://help.twitter.com/content/dam/help-twitter/periscope/periscopeproducer.pdf

Twitch直播参数:https://stream.twitch.tv/encoding/