音视频学习(二十三):srs+ffmpeg实现rtmp的推拉流

rtmp协议:https://blog.csdn.net/www_dong/article/details/131026072

rtmp收流:https://blog.csdn.net/www_dong/article/details/135073488

rtmp发流:https://blog.csdn.net/www_dong/article/details/135254847

安装和配置SRS服务器

  1. 克隆 SRS 源码并进入目录:
bash 复制代码
git clone -b develop https://github.com/ossrs/srs.git
cd srs
  1. 配置并编译 SRS
bash 复制代码
./configure
make
  1. 编译完成后,SRS 可执行文件将位于 objs 目录中。

  2. 启动srs(默认)

bash 复制代码
./objs/srs -c conf/rtmp.conf

默认情况下,SRS 会监听 RTMP 端口 1935

配置 SRS 实现 RTMP 推流与拉流

conf/rtmp.conf 文件中,你可以使用以下配置来启用 RTMP 推流和拉流:

ini 复制代码
listen              1935;          # RTMP 监听端口
max_connections     1000;          # 最大连接数

vhost __defaultVhost__ {
    enabled         on;            # 启用 RTMP
    chunk_size      60000;         # 每个数据块的大小

    # 配置推流和拉流
    # 推流和拉流的 URL 为 rtmp://<server-ip>/live/stream
    # 例如: rtmp://localhost/live/stream
}

保存文件后,重新启动 SRS 服务:

bash 复制代码
./objs/srs -c conf/rtmp.conf

使用 FFmpeg 推流到 SRS

将本地视频文件 input.mp4 推流到 rtmp://localhost/live/stream

bash 复制代码
# 方式一
ffmpeg -re -i input.mp4 -c:v libx264 -preset fast -c:a aac -f flv rtmp://localhost/live/stream

# 方式二
ffmpeg -re -i input.mp4 -c copy -f flv -y rtmp://localhost/live/stream
  • -re:表示以实时速度发送视频数据(有助于模拟实时推流)。

  • -i input.mp4:输入文件路径。

  • -c:v libx264:使用 libx264 编解码器进行视频编码。

  • -c:a aac:使用 aac 编解码器进行音频编码。

  • -f flv:使用 FLV 格式进行推流。

  • rtmp://localhost/live/stream:RTMP 推流的目标地址。

推流时常见问题

  1. 推流地址错误 :确认推流 URL 是否正确(如 rtmp://localhost/live/stream)。
  2. 推流端口被防火墙阻塞 :确保防火墙允许通过 RTMP 默认端口(1935)进行通信。

使用 FFmpeg 从 SRS 拉流

可以使用 FFmpeg 拉取 SRS 服务器上的 RTMP 流,并保存到本地文件。

bash 复制代码
ffmpeg -i rtmp://localhost/live/stream -c copy output.mp4
  • -i rtmp://localhost/live/stream:RTMP 流的输入 URL。

  • -c copy:直接复制音视频流,不进行重新编码。

实时播放 RTMP 流

如果希望实时播放流,可以将 RTMP 流发送给 VLC 播放器进行实时播放。

bash 复制代码
ffmpeg -i rtmp://localhost/live/stream -f flv - | vlc -

高级配置与优化

启用 HLS

除了 RTMP,SRS 还支持 HLS(HTTP Live Streaming)。你可以在 SRS 配置文件中启用 HLS 功能,以便通过 HTTP 播放 RTMP 流。

conf/rtmp.conf 中,添加以下配置来启用 HLS:

ini 复制代码
vhost __defaultVhost__ {
    hls {
        enabled         on;
        hls_path        ./objs/nginx/html;    # 设置 HLS 输出路径
        hls_fragment    10;                   # 设置 HLS 分片大小(秒)
    }
}

保存后,重启 SRS。

此时,可以通过以下 URL 拉取 HLS 流:

arduino 复制代码
http://localhost/live/stream.m3u8

推流鉴权

如果你希望为推流设置鉴权(例如限制谁能推流到 SRS),可以配置 HTTP 鉴权:

ini 复制代码
vhost __defaultVhost__ {
    http_hooks {
        enabled         on;
        on_publish      http://your-server/auth/publish;
    }
}
相关推荐
音视频牛哥12 分钟前
从云平台到系统内核:SmartMediakit如何重构实时视频系统
计算机视觉·音视频·gb28181对接·rtsp播放器rtmp播放器·smartmediakit·智能机器人低延迟播放方案·rtmp摄像头同屏推流
小年糕是糕手43 分钟前
【数据结构】常见的排序算法 -- 插入排序
c语言·开发语言·数据结构·学习·算法·leetcode·排序算法
我先去打把游戏先1 小时前
ESP32C3开发指南(基于IDF):console控制台命令行交互功能
笔记·嵌入式硬件·mcu·物联网·学习·esp32·交互
QT 小鲜肉3 小时前
【QT/C++】Qt网络编程进阶:TCP网络编程的基本原理和实际应用(超详细)
c语言·开发语言·网络·c++·qt·学习·tcp/ip
浮游本尊3 小时前
React 18.x 学习计划 - 第六天:React路由和导航
前端·学习·react.js
yuxb734 小时前
Zabbix企业级分布式监控系统(上)
笔记·学习·zabbix
Chloeis Syntax12 小时前
MySQL初阶学习日记(1)--- 数据库的基本操作
数据库·学习·mysql
ACP广源盛1392462567312 小时前
(ACP广源盛)GSV6172---MIPI/LVDS 信号转换为 Type-C/DisplayPort 1.4/HDMI 2.0 并集成嵌入式 MCU
c语言·开发语言·单片机·嵌入式硬件·音视频
musenh12 小时前
css样式学习
css·学习·css3
Larry_Yanan13 小时前
QML学习笔记(五十)QML与C++交互:QML中单例C++对象
开发语言·c++·笔记·qt·学习·ui·交互