如何将FLV视频用RTMP协议推送到服务器?,有哪些方法?
- 云服务器
- 2026-07-24
- 11
RTMP协议与FLV视频基础
RTMP(Real-Time Messaging Protocol) 是Adobe开发的实时消息传输协议,基于TCP长连接,支持低延迟的音视频数据流,它通过分块(chunk)方式传输数据,适合直播场景。
FLV(Flash Video) 是一种流行的视频封装格式,内部按Tag(Audio Tag、Video Tag、Script Tag)组织,结构简单,头部信息清晰,RTMP天然支持FLV格式,推流时通常将H.264视频和AAC音频封装成FLV流,再通过RTMP协议传输。

FLV视频通过RTMP推送到服务器的流程
整个流程分为推流端、服务器中间层、播放端三个环节。
推流端
- 采集音视频数据(摄像头、麦克风、屏幕等)。
- 编码为H.264视频和AAC音频(或MP3、Speex等)。
- 封装成FLV格式,按RTMP协议进行分块传输。
- 建立RTMP连接(握手、创建流、发布),持续发送数据。
服务器
- 接收RTMP推流,解析FLV流。
- 可进行转码、录制、分发(RTMP/HLS/HTTP-FLV等)。
- 典型服务器:Nginx-RTMP模块、SRS、Red5、Wowza。
播放端
- 通过RTMP拉流,接收FLV数据并解码播放。
- 或通过服务器转成的HLS/HTTP-FLV观看。
常用推流工具与命令
| 工具 | 说明 | 示例命令 |
|---|---|---|
| OBS Studio | 图形化推流软件,支持RTMP | 设置→推流→自定义服务器:rtmp://your-server/live,串流密钥:stream_key |
| FFmpeg | 命令行工具,灵活推流 | ffmpeg -re -i input.flv -c copy -f flv rtmp://server/live/stream |
| GStreamer | 多媒体框架,可脚本化 | gst-launch-1.0 filesrc location=video.flv ! flvdemux ! rtmp2sink location=rtmp://server/live/stream |
说明:-re 表示以原始帧率读取,确保实时性;-c copy 复制视频流,避免二次编码。
服务器端配置示例
Nginx + nginx-rtmp-module
rtmp { server { listen 1935; application live { live on; record off; # 可开启HLS转封装 hls on; hls_path /tmp/hls; } } }
- 推流地址:rtmp://your-ip/live/streamkey
- 拉流地址:rtmp://your-ip/live/streamkey(或通过HLS观看)
SRS(Simple-Rtmp-Server)
# srs.conf listen 1935; max_connections 1000; vhost __defaultVhost__ { gop_cache on; hls { enabled on; hls_path /usr/local/srs/objs/nginx/html; } }
- 启动:./objs/srs -c conf/srs.conf
- 推流地址:rtmp://your-ip/live/streamkey
相关问题与解答
问题1:RTMP推流时为什么要使用FLV格式,而不直接用H.264裸流?

解答:RTMP协议传输的数据单元是消息(Message),而FLV的Tag结构恰好能映射到RTMP消息中,FLV封装包含了音视频元数据、时间戳、编码信息,便于服务器和播放端解析,直接发送H.264裸流需要额外封装,FLV是RTMP生态中最简洁、最兼容的格式,许多CDN和播放器原生支持FLV over RTMP,兼容性更好。
问题2:推流过程中出现频繁卡顿或断流,可能的原因有哪些?
解答:常见原因包括:
- 上行带宽不足:推流码率超过网络实际可用带宽。
- 服务器负载过高:连接数过多或CPU不够,导致无法及时处理数据。
- 网络抖动:丢包或延迟波动,RTMP基于TCP会重传,加剧延迟。
- 编码设置不合理:如GOP(关键帧间隔)过大,导致播放端卡顿;或使用了非标参数。
- 防火墙/端口限制:RTMP默认使用1935端口,被屏蔽也会导致连接失败。
优化建议:降低推流码率、启用GOP缓存、使用CDN加速、调整服务器缓存策略(如SRS的gop_cache和reuse_port)。
