基于FFmpeg的直播流二次转发实战:从拉流到推流的技术实现

张开发
2026/4/21 8:13:48 15 分钟阅读

分享文章

基于FFmpeg的直播流二次转发实战:从拉流到推流的技术实现
1. 直播流二次转发的基本概念第一次接触直播流二次转发时我和大多数人一样一脸懵。简单来说这就像是在两个快递站点之间转运包裹从A站点取件拉流然后把包裹原封不动送到B站点推流。只不过这里运送的不是实物包裹而是实时的音视频数据流。FFmpeg在这个过程中扮演着万能快递员的角色。它可以从各种直播平台比如RTMP服务器获取直播流然后重新投递到另一个直播平台。这种技术在实际应用中非常常见比如将多个直播平台的画面聚合到自己的服务器为直播内容添加水印或转码后再分发搭建自己的直播中继节点我第一次用FFmpeg做二次转发时用的就是这个基础命令ffmpeg -i 输入流地址 -vcodec copy -acodec copy -f flv 输出流地址这个命令看起来简单但每个参数都很关键-i指定输入流地址-vcodec copy表示视频流直接复制不重新编码-acodec copy表示音频流直接复制-f flv指定输出格式为FLV直播常用格式2. FFmpeg环境配置与基础命令2.1 安装FFmpeg在Ubuntu上安装FFmpeg最简单的方式是sudo apt update sudo apt install ffmpegWindows用户可以直接从官网下载编译好的二进制包解压后把ffmpeg.exe所在目录加入系统PATH。安装完成后运行ffmpeg -version验证是否成功。2.2 基础拉流与推流先测试最简单的拉流播放ffplay 直播流地址这个命令会用FFmpeg自带的播放器显示直播内容。如果能看到画面说明拉流地址是正确的。接下来尝试转发ffmpeg -i rtmp://input.server/live/stream -c copy -f flv rtmp://output.server/live/stream这里有几个容易踩的坑输入输出地址协议要匹配都是RTMP或都是HTTP-FLV推流地址需要有写入权限通常需要包含鉴权密钥网络防火墙要放行相关端口默认RTMP用19353. 直播流处理进阶技巧3.1 流质量监控与重连实际运营中网络波动会导致拉流中断。可以添加这些参数增强稳定性ffmpeg -re -i 输入地址 -c copy -f flv -flvflags no_duration_filesize 输出地址 \ -rw_timeout 5000000 -stimeout 2000000-rw_timeout设置网络超时微秒-stimeout设置TCP超时-re以原始速率读取输入3.2 多平台同步推流如果需要同时推送到多个平台可以使用tee协议ffmpeg -i 输入地址 -c copy -f tee \ [fflv]rtmp://平台1地址|[fflv]rtmp://平台2地址4. 实战搭建Python中转服务用Python封装FFmpeg可以实现更灵活的控制。这是我用过的一个可靠方案import subprocess import threading class StreamForwarder: def __init__(self): self.process None def start(self, input_url, output_url): cmd [ ffmpeg, -i, input_url, -c, copy, -f, flv, output_url ] self.process subprocess.Popen( cmd, stdoutsubprocess.PIPE, stderrsubprocess.PIPE ) # 启动监控线程 threading.Thread(targetself._monitor).start() def _monitor(self): while True: retcode self.process.poll() if retcode is not None: print(fFFmpeg进程已结束返回值: {retcode}) break这个类实现了异步启动FFmpeg进程实时监控进程状态异常自动退出在实际项目中我还添加了推流质量监控、自动重连和报警通知等功能。经过多次优化现在这个服务已经稳定运行了两年多每天处理超过5000小时的直播流转发。

更多文章