音视频学习(二十三):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;
    }
}
相关推荐
ASKED_201910 分钟前
Langchain学习笔记一 -基础模块以及架构概览
笔记·学习·langchain
(❁´◡`❁)Jimmy(❁´◡`❁)1 小时前
Exgcd 学习笔记
笔记·学习·算法
拾荒的小海螺1 小时前
开源项目:LTX2 高效可控的开源视频生成模型
开源·音视频
云小逸2 小时前
【nmap源码学习】 Nmap网络扫描工具深度解析:从基础参数到核心扫描逻辑
网络·数据库·学习
盐焗西兰花5 小时前
鸿蒙学习实战之路-Reader Kit构建阅读器最佳实践
学习·华为·harmonyos
深蓝海拓5 小时前
PySide6从0开始学习的笔记(二十七) 日志管理
笔记·python·学习·pyqt
慎独4135 小时前
科学赋能,让孩子专注高效爱上学习
学习
LGL6030A5 小时前
Java学习历程26——线程安全
java·开发语言·学习
学历真的很重要6 小时前
【系统架构师】第二章 操作系统知识 - 第二部分:进程管理(详解版)
学习·职场和发展·系统架构·系统架构师
Nebula_g6 小时前
线程进阶: 无人机自动防空平台开发教程(更新)
java·开发语言·数据结构·学习·算法·无人机