使用 FFmpeg 推流

  1. 1. FFmpeg 推流会用到的参数
  2. 2. 推送流数据至 RTMP 服务器
    1. 2.1. 视频
    2. 2.2. 音频
    3. 2.3. 播放列表
    4. 2.4. 网络视频流

FFmpeg 推流会用到的参数

-re 推流
-i 输入文件
-rtsp_transport tcp TCP 推流,UDP 推流缺省即可
-stream_loop -1 循环次数,-1为无限循环
-c:v libx264 以 H.264 进行重新编码
-c:a aac 以 AAC 编码输出音频
-b:v 1m 输出视频码率
-b:a 320k 输出音频码率
-r 25 输出帧率
-ar 44100 输出音频采样率
-ac 2 输出音频声道数
-f flv 以 FLV 格式输出

推送流数据至 RTMP 服务器

RTMP 的封装格式为 FLV,视频流格式为 H.264,音频流格式为 AAC

RTMP 链接说明

视频

如果原视频的格式匹配,可以直接推送原视频:

1
ffmpeg -re -i "video.mp4" -c copy -f flv "rtmp://127.0.0.1/stream/12345678"

如果考虑到带宽不足等因素,可以对视频进行重新编码,但这样会消耗较多计算资源:

1
ffmpeg -re -i "video.mp4" -vcodec libx264 -acodec aac -b:v 1m -b:a 320k -f flv "rtmp://127.0.0.1/stream/12345678"

效果

音频

由于大多数直播平台都不支持音频流,所以需要将音频流转换为视频流,这里使用 lavfi 生成一段白色的视频流,然后将音频流和视频流进行混合推流:

1
ffmpeg -f lavfi -re -i "color=s=1920x1080:r=25:c='#FFFFFF':d=5" -f flac -re -stream_loop -1 -i "audio.flac" -c:v libx264 -b:v 320k -c:a aac -b:a 320k -f flv "rtmp://127.0.0.1/stream/12345678"

播放列表

FFmpeg 支持播放列表,只需要通过 -i 参数将播放列表文件输入。
创建播放列表文件 playlist.txt

1
2
3
file 'video1.mp4'
file 'video2.mp4'
file 'video3.mp4'

在格式相同的情况下可以直接通过一条命令推流:

1
ffmpeg -re -i "playlist.txt" -c copy -f flv "rtmp://127.0.0.1/stream/12345678"

网络视频流

FFmpeg 的 -i 参数输入的可以是视频流或 m3u8 文件,这样可以实现转播网络视频流:

1
ffmpeg -re -i "http://127.0.0.1/stream/12345678/play.m3u8" -c copy -f flv "rtmp://127.0.0.1/stream/12345678"