SRS + FFmpeg 直播机 拉流推给本机 SRS 的 RTMP

cat /evideoktv/bin/servicemanager/opu.conf

listen 1935;
max_connections 1000;
vhost __defaultVhost__
{
ingest id1
{
enabled on;
input
{
type stream;
url http://10.22.26.59/hdmi;
}
ffmpeg ./ffmpeg;
engine
{
enabled on;
vcodec copy;
acodec copy;
aparams
{
bsf:a aac_adtstoasc;
}
output rtmp://127.0.0.1:1935/live/10.22.26.59_hdmi;
}
}
}

Response:

我按 SRS 配置层级 从外到内,逐行给你讲清楚这个 conf 在干什么(这是一个用 SRS + FFmpeg 做流拉取转推的典型配置)。


🌐 全局配置

listen 1935;

👉 SRS 监听端口

也就是:

SRS 会在本机开启 RTMP 服务端口 1935

客户端可以这样推/拉流:

rtmp://服务器IP:1935/应用名/流名

max_connections 1000;

👉 最大并发连接数

表示:

SRS 最多允许 1000 个客户端连接

包括:

  • 推流
  • 拉流
  • 内部 ingest

🏠 vhost 虚拟主机

vhost __defaultVhost__
{

👉 默认虚拟主机(类似 nginx 的 default server)

意思是:

如果客户端没指定 vhost,就用这个配置。

通常不用改。


📥 ingest 模块(拉外部流)

ingest id1
{
enabled on;

👉 开启一个 ingest 任务

id1 是任务名(随便取)

作用:

👉 让 SRS 自动去拉一个外部流,并转成 RTMP 推给自己


🎥 输入流源

input
{
type stream;
url http://10.22.26.59/hdmi;
}

含义:

说明
type stream 表示输入是一个实时流
url 外部流地址

也就是说:

👉 SRS 会通过 FFmpeg 拉这个 HTTP 流:

http://10.22.26.59/hdmi

通常可能是:

  • 摄像头
  • 编码器
  • 拉流服务器

⚙️ 指定 FFmpeg

ffmpeg ./ffmpeg;

👉 使用当前目录下的 ffmpeg 可执行文件

如果写:

ffmpeg /usr/bin/ffmpeg;

就是系统自带的。


🚀 engine 转码/转封装引擎

engine
{
enabled on;

👉 开启处理引擎

下面是对流的处理方式。


📦 视频处理

vcodec copy;

👉 视频不重新编码

直接复制码流(省 CPU)

✔ 快
✔ 质量无损
✔ 前提:格式本来就支持 RTMP/FLV


🔊 音频处理

acodec copy;

👉 音频也不重新编码

同样是 直拷贝


🔧 aparams(音频参数处理)

aparams
{
bsf:a aac_adtstoasc;
}

这句很重要 👍

👉 给音频加一个 bitstream filter

bsf:a aac_adtstoasc 是干嘛的?

作用:

把 AAC 音频从:

👉 ADTS 封装格式
转换成:
👉 ASC(RTMP/MP4 需要的格式)

简单说:

⚠ 有些 HTTP 流是 AAC-ADTS(常见于 TS 流)
RTMP 需要 AAC-ASC

这个参数就是 格式修正

否则经常会:

❌ 没声音
❌ 推流失败


📤 输出流

output rtmp://127.0.0.1:1935/live/10.22.26.59_hdmi;

意思:

👉 把处理后的流 推给本机 SRS 的 RTMP 服务

地址拆开看:

部分 含义
127.0.0.1 本机
1935 SRS 监听端口
live 应用名
10.22.26.59_hdmi 流名

最终 RTMP 地址:

rtmp://127.0.0.1:1935/live/10.22.26.59_hdmi

📌 整体工作流程(非常重要)

这套配置干的是:

HTTP流
  ↓
FFmpeg 拉取
  ↓
不转码(只封装)
  ↓
修正AAC格式
  ↓
推成本地 RTMP
  ↓
客户端再从 SRS 拉流

画成图:

http://10.22.26.59/hdmi
        ↓
     FFmpeg
        ↓
SRS ingest
        ↓
rtmp://127.0.0.1/live/10.22.26.59_hdmi
        ↓
  播放器 / 推 CDN

✅ 这个配置的用途总结

✔ 把 HTTP 实时流 转成 RTMP
✔ 几乎不占 CPU(copy 模式)
✔ 适合监控流、采集卡、编码器

常见场景:

  • 摄像头 HTTP 流 → RTMP直播
  • 拉 TS/HLS → RTMP
  • 内网采集 → 直播平台

⚠️ 你之前 FFmpeg 报 DTS 错误的关系

你之前的:

Non-monotonous DTS

👉 很可能是输入流时间戳混乱

SRS ingest + ffmpeg copy 时容易出现:

  • 源流时间戳不规范
  • RTMP 对 DTS 要求严格

有时需要加:

vcodec copy;
acodec copy;

不够,还得在 ffmpeg 参数里加重排时间戳:

例如(高级用法):

engine {
    enabled on;
    vcodec copy;
    acodec copy;
    iformat flv;
}

或者在 SRS 里启用 genpts(看版本支持)


🧠 一句话总结这个配置

👉 SRS 用 FFmpeg 拉一个 HTTP 流
👉 不转码直接封装
👉 修复 AAC 音频格式
👉 推成本地 RTMP 服务供播放


Ingest 模块参考文档

https://github.com/ossrs/srs/wiki/v1_CN_Ingest

posted @ 2026-01-26 16:58  katago  阅读(3)  评论(0)    收藏  举报