windows下srs流媒体服务器使用ffmpeg推流
安装windows版本srs
下载链接:Windows | SRS
执行命令:
ffmpeg推流命令:
ffmpeg -i "rtsp://admin@xxzx@192.168.1.64:554/Streaming/Channels/101" -c:v copy -c:a aac -f flv "rtmp://localhost:1935/live/stream"
1. 推流本地摄像头到流媒体服务器
适用于将本地摄像头实时推流到 RTMP 服务器。
ffmpeg -f v4l2 -i /dev/video0 -f flv rtmp://localhost:1935/live/stream
添加音频(麦克风)
ffmpeg -f v4l2 -i /dev/video0 -f alsa -i hw:0 -f flv rtmp://localhost:1935/live/stream
- 替换
/dev/video0
为摄像头设备路径。 - 替换
hw:0
为音频输入设备路径(可用arecord -l
查看设备列表)。
2. 推流本地视频文件
将本地已有的视频文件推送到流媒体服务器。
ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -f flv rtmp://localhost:1935/live/stream
-re
:以文件的原始播放速度(实时)进行推流。input.mp4
:本地视频文件路径。-c:v libx264
:使用 H.264 编码。-preset veryfast
:优化推流速度。
3. 推流本地屏幕录制
将本地屏幕捕获后推流到流媒体服务器。
Linux
ffmpeg -f x11grab -i :0.0 -f flv rtmp://localhost:1935/live/stream
:0.0
:代表显示器,适用于 X11 系统。
Windows
ffmpeg -f gdigrab -i desktop -f flv rtmp://localhost:1935/live/stream
gdigrab
:Windows 的屏幕捕获接口。
4. 推流网络视频流
将网络上的视频流(如 HTTP 或 RTSP)转推到 RTMP 流媒体服务器。
HTTP 流
ffmpeg -re -i http://example.com/stream.m3u8 -c:v libx264 -f flv rtmp://localhost:1935/live/stream
RTSP 流
ffmpeg -i rtsp://username:password@192.168.1.100:554/stream -f flv rtmp://localhost:1935/live/stream
5. 推流实时生成的视频内容
通过 ffmpeg
自定义生成实时视频并推送到流媒体服务器。
生成一个固定颜色的视频流推送
ffmpeg -f lavfi -i color=c=blue:s=1280x720:r=30 -f flv rtmp://localhost:1935/live/stream
color=c=blue
:生成蓝色画面。s=1280x720
:分辨率为 1280x720。r=30
:帧率为 30 fps。
生成动态噪点视频流
ffmpeg -f lavfi -i testsrc=s=1280x720:r=30 -f flv rtmp://localhost:1935/live/stream
6. 推流实时写入的文件
从一个实时更新的文件中读取内容进行推流。
ffmpeg -re -i fifo_input.mp4 -c:v libx264 -f flv rtmp://localhost:1935/live/stream
- 这里的
fifo_input.mp4
是一个动态写入的文件(例如,后台程序不断更新)。
7. 推流实时摄像头 + 视频叠加
将本地摄像头流与叠加的文字/图片组合后推流。
叠加文字
ffmpeg -f v4l2 -i /dev/video0 -vf "drawtext=text='Live Stream':fontcolor=white:fontsize=24:x=10:y=10" -f flv rtmp://localhost:1935/live/stream
叠加图片
ffmpeg -f v4l2 -i /dev/video0 -i overlay.png -filter_complex "[0:v][1:v] overlay=10:10" -f flv rtmp://localhost:1935/live/stream
8. 推流屏幕+摄像头画中画
将屏幕录制和摄像头画面进行画中画组合后推流。
ffmpeg -f x11grab -i :0.0 -f v4l2 -i /dev/video0 -filter_complex "[0:v][1:v] overlay=W-w-10:H-h-10" -f flv rtmp://localhost:1935/live/stream
W-w-10:H-h-10
:将摄像头画面放置在屏幕画面的右下角。
9. 推流音频(如麦克风或音频文件)
单独推送音频流到服务器。
推流本地麦克风
ffmpeg -f alsa -i hw:0 -f flv rtmp://localhost:1935/live/stream
推流音频文件
ffmpeg -re -i input.mp3 -f flv rtmp://localhost:1935/live/stream
10. 推流实时截取内容
仅截取一段时间内的内容推流。
ffmpeg -re -ss 00:01:00 -t 00:00:30 -i input.mp4 -f flv rtmp://localhost:1935/live/stream
-ss
:指定开始时间(1分钟)。-t
:指定持续时间(30秒)。
11. 转推流
将一个 RTMP 流转发到另一个 RTMP 流服务器。
ffmpeg -i rtmp://source-server/live/stream -c copy -f flv rtmp://target-server/live/stream
-c copy
:不重新编码,直接转发。
12. 推流分辨率/帧率/码率优化
优化分辨率、帧率和码率来控制推流质量。
ffmpeg -f v4l2 -i /dev/video0 -s 1280x720 -r 30 -b:v 1000k -f flv rtmp://localhost:1935/live/stream
-s 1280x720
:设置分辨率为 1280x720。-r 30
:设置帧率为 30 fps。-b:v 1000k
:限制视频码率为 1000 kbps。
FFmpeg解决延迟
1. 降低编码延迟
使用低延迟编码配置
默认编码会注重压缩效率,但会增加延迟。可以使用以下参数降低延迟:
ffmpeg -re -i input.mp4 -c:v libx264 -preset ultrafast -tune zerolatency -f flv rtmp://localhost:1935/live/stream
-preset ultrafast
:使用最快的编码预设(牺牲一些压缩率)。-tune zerolatency
:专为低延迟流媒体优化。-g 30
:设置关键帧间隔(GOP),较小的值可降低延迟,推荐设置为帧率的 1 倍(如 30 fps 时设置为 30)。-r 30
:限制帧率以减轻处理压力。
2. 调整缓冲设置
RTMP 缓冲设置
- RTMP 推流默认会有缓冲,可以通过以下方式减少缓冲区引起的延迟:
ffmpeg -re -i input.mp4 -c:v libx264 -preset ultrafast -tune zerolatency -rtmp_buffer 100 -f flv rtmp://localhost:1935/live/stream
-rtmp_buffer 100
:设置 RTMP 缓冲区为 100 毫秒(默认较高)。-flvflags no_duration_filesize
:不传递文件时长和大小(减少不必要的数据传输)。
3. 减少音频编码延迟
音频的编码和缓冲也可能增加延迟。优化参数如下:
ffmpeg -re -i input.mp4 -c:a aac -b:a 64k -ar 44100 -ac 2 -af aresample=async=1 -f flv rtmp://localhost:1935/live/stream
-c:a aac
:使用 AAC 音频编码。-b:a 64k
:降低音频码率以减小带宽占用。-ar 44100
:设置音频采样率。-af aresample=async=1
:启用音频同步以降低延迟。
4. 优化网络传输
网络传输速度和稳定性直接影响延迟,可以通过以下方式优化:
配置 UDP 推流
如果目标支持,使用 UDP 而非 RTMP,可进一步降低延迟:
ffmpeg -re -i input.mp4 -c:v libx264 -preset ultrafast -tune zerolatency -f mpegts udp://<ip>:<port>
- 替换
<ip>:<port>
为目标服务器的 IP 和端口。
使用自定义 RTMP 超时时间
调整 RTMP 超时设置,减少网络传输的额外延迟:
ffmpeg -re -i input.mp4 -c:v libx264 -preset ultrafast -tune zerolatency -timeout 1000000 -f flv rtmp://localhost:1935/live/stream
-timeout 1000000
:设置网络超时时间(单位:微秒)。
5. 优化服务器端配置
推流的延迟不仅由 ffmpeg
决定,还受服务器(如 Nginx RTMP 或 Wowza)影响。
优化 Nginx RTMP 配置
在 nginx.conf
中优化以下参数:
rtmp { server { listen 1935; chunk_size 4096; # 减小 chunk_size 降低延迟(单位:字节) application live { live on; gop_cache off; # 禁用 GOP 缓存以降低延迟 sync 10ms; # 同步时间戳(低值可降低延迟) publish_notify on; # 启用推流状态通知 } } }
6. 硬件加速
如果你使用的机器性能有限,可以启用硬件加速来减少延迟。
Intel Quick Sync
ffmpeg -re -i input.mp4 -c:v h264_qsv -preset ultrafast -tune zerolatency -f flv rtmp://localhost:1935/live/stream
NVIDIA GPU (NVENC)
ffmpeg -re -i input.mp4 -c:v h264_nvenc -preset p1 -tune ll -f flv rtmp://localhost:1935/live/stream
-preset p1
:最快的 NVENC 预设。-tune ll
:为低延迟优化。
7. 监控延迟效果
可以使用 ffprobe
检测流的延迟:
ffprobe -i rtmp://localhost:1935/live/stream -show_entries frame=pkt_pts_time -select_streams v:0
实时监控帧时间戳,判断延迟效果。
8. 综合低延迟推流示例
整合以上优化,适用于大多数场景的低延迟推流:
ffmpeg -re -i input.mp4 -c:v libx264 -preset ultrafast -tune zerolatency -g 30 -rtmp_buffer 100 \ -c:a aac -b:a 64k -af aresample=async=1 -f flv rtmp://localhost:1935/live/stream