windows下srs流媒体服务器使用ffmpeg推流

发布于:2024-12-23 ⋅ 阅读:(18) ⋅ 点赞:(0)

安装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

 


网站公告

今日签到

点亮在社区的每一天
去签到