docker-compose 部署 srs视频流服务

docker-compose 部署srs

version: '3.8'
services:
  srs:
    image: registry.cn-hangzhou.aliyuncs.com/ossrs/srs:5
    container_name: srs
    restart: always
    environment:
      - CANDIDATE = 133.145.212.246
      - SRS_RTC_SERVER_TCP_ENABLED = on
      - SRS_RTC_SERVER_PROTOCOL = tcp
    ports:
      - 1935:1935
      - 544:544
      - 1985:1985
      - 8080:8080
      - 8000:8000
    volumes:
      - ./data/conf:/usr/local/srs/conf
      - ./data/objs:/usr/local/srs/objs

docker.conf

# main config for srs.
# @see full.conf for detail config.

listen              1935;
max_connections     100;
#srs_log_tank        file;
#srs_log_file        ./objs/srs.log;
daemon              on;
http_api {
    enabled         on;
    listen          1985;
}

http_server {
    enabled         on;
    listen          8080;
    dir             ./objs/nginx/html;
}
rtc_server {
    enabled on;
    listen 8000; # UDP port
    # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#config-candidate
    candidate $CANDIDATE;
}


vhost __defaultVhost__ {
    hls {
        enabled         on;
    }
    
    rtmp {
        enabled     on;
        listen      1935;
        max_connections 1000;
    }
    
    http_remux {
        enabled     on;
        mount       vhost/app/[stream].flv;
    }
    rtc {
        enabled     on;
        # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtmp-to-rtc
        rtmp_to_rtc on;
        # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtc-to-rtmp
        rtc_to_rtmp on;
    }

    play{
        gop_cache_max_frames 2500;
    }

  exec {
        enabled on;
        publish ./objs/ffmpeg/bin/ffmpeg -re -stream_loop -1 -i /usr/local/srs/localFlv/01.flv -c copy -f flv rtmp://127.0.0.1/live/1;
        publish ./objs/ffmpeg/bin/ffmpeg -re -stream_loop -1 -i /usr/local/srs/localFlv/02.flv -c copy -f flv rtmp://127.0.0.1/live/2;
        publish ./objs/ffmpeg/bin/ffmpeg -re -stream_loop -1 -i /usr/local/srs/localFlv/03.mp4 -c copy -f flv rtmp://127.0.0.1/live/3;
        publish ./objs/ffmpeg/bin/ffmpeg -re -stream_loop -1 -i /usr/local/srs/localFlv/04.mp4 -c copy -f flv rtmp://127.0.0.1/live/4;


  }
}

源码构建

下载源码

进入trunk目录

cd trunk

本地构建(mac)

./configure --osx --x86-64  && make

修改srs.conf配置文件

# main config for srs.
# @see full.conf for detail config.

listen              1935;
max_connections     1000;
#srs_log_tank        file;
#srs_log_file        ./objs/srs.log;
daemon              on;
http_api {
    enabled         on;
    listen          1985;
}
http_server {
    enabled         on;
    listen          8080;
    dir             ./objs/nginx/html;
}
rtc_server {
    enabled on;
    listen 8000; # UDP port
    # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#config-candidate
    candidate $CANDIDATE;
}
vhost __defaultVhost__ {
    hls {
        enabled         on;
    }

    http_remux {
        enabled     on;
        mount       vhost/app/[stream].flv;
    }
    rtc {
        enabled     on;
        # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtmp-to-rtc
        rtmp_to_rtc off;
        # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtc-to-rtmp
        rtc_to_rtmp off;
    }

    play{
        gop_cache_max_frames 2500;
    }
    # 自定义rstp流
    ingest 1{
        enabled      on;
        input {
            type    stream;
            url     rtsp://admin:dmgyz12345@10.13.69.250:554/Streaming/Channels/101;
        }
        ffmpeg      ./objs/ffmpeg/bin/ffmpeg;
        engine {
            enabled          on;
            perfile {
                rtsp_transport tcp;
            }
            vcodec copy;
            acodec copy;
            output          rtmp://127.0.0.1:1935/live/1;
        }
    }

    # 自定义rstp流
    ingest 2{
        enabled      on;
        input {
            type    stream;
            url     rtsp://admin:1qaz@WSX@10.13.68.67:554/profile1;
        }
        ffmpeg      ./objs/ffmpeg/bin/ffmpeg;
        engine {
            enabled          on;
            perfile {
                rtsp_transport tcp;
            }
            vcodec copy;
            acodec copy;
            output          rtmp://127.0.0.1:1935/live/2;
        }
    }


}

本地启动:

./objs/srs -c conf/srs.conf
# 查看日志
tail -n 30 -f ./objs/srs.log

支持h265摄像头

./configure --osx --x86-64 --h265=on && make

srs.conf

配置详解-http_hooks

SRS 的 http_hooks 功能可以在特定事件发生时触发 HTTP 请求。具体来说,当有外部推流到 SRS 服务器时,会根据配置触发对应的 HTTP 请求。这些事件包括但不限于:

  • on_connect:当客户端连接到 SRS 服务器时触发。
  • on_close:当客户端断开连接时触发。
  • on_publish:当客户端开始推流时触发。
  • on_unpublish:当客户端停止推流时触发。
  • on_play:当客户端开始播放流时触发。
  • on_stop:当客户端停止播放流时触发。

示例配置

下面是一个配置示例,展示了如何设置 http_hooks 来触发 HTTP 请求:

srs.conf

vhost __defaultVhost__ {
    http_hooks {
        enabled         on;
        on_connect      http://example.com/api/v1/clients/connect;
        on_close        http://example.com/api/v1/clients/close;
        on_publish      http://example.com/api/v1/clients/publish;
        on_unpublish    http://example.com/api/v1/clients/unpublish;
        on_play         http://example.com/api/v1/clients/play;
        on_stop         http://example.com/api/v1/clients/stop;
    }
    # 其他配置...
}

HTTP 请求内容

对于每个事件,SRS 会发送一个 HTTP POST 请求到配置的 URL,并附带事件相关的数据。以 on_publish 为例,SRS 会发送如下数据:

  • client_id:客户端 ID。
  • ip:客户端 IP 地址。
  • vhost:虚拟主机名。
  • app:应用名。
  • stream:流名。
  • param:附加参数。

SRS 的 http_hooks 功能在不同事件触发时发送的参数各不相同。以下是每个典型事件触发时发送的参数详细信息:

1. on_connect 事件

当客户端连接到 SRS 服务器时触发。发送的参数包括:

  • client_id:客户端 ID。
  • ip:客户端 IP 地址。
  • vhost:虚拟主机名。
  • app:应用名。
  • tcUrl:连接的 tcUrl。
  • pageUrl:连接的页面 URL。
  • param:附加参数。

2. on_close 事件

当客户端断开连接时触发。发送的参数包括:

  • client_id:客户端 ID。
  • ip:客户端 IP 地址。
  • vhost:虚拟主机名。
  • app:应用名。
  • param:附加参数。

3. on_publish 事件

当客户端开始推流时触发。发送的参数包括:

  • client_id:客户端 ID。
  • ip:客户端 IP 地址。
  • vhost:虚拟主机名。
  • app:应用名。
  • stream:流名。
  • param:附加参数。

4. on_unpublish 事件

当客户端停止推流时触发。发送的参数包括:

  • client_id:客户端 ID。
  • ip:客户端 IP 地址。
  • vhost:虚拟主机名。
  • app:应用名。
  • stream:流名。
  • param:附加参数。

5. on_play 事件

当客户端开始播放流时触发。发送的参数包括:

  • client_id:客户端 ID。
  • ip:客户端 IP 地址。
  • vhost:虚拟主机名。
  • app:应用名。
  • stream:流名。
  • param:附加参数。

6. on_stop 事件

当客户端停止播放流时触发。发送的参数包括:

  • client_id:客户端 ID。
  • ip:客户端 IP 地址。
  • vhost:虚拟主机名。
  • app:应用名。
  • stream:流名。
  • param:附加参数。

示例请求处理

假设我们有一个 Flask 应用来处理 on_publish 事件:

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/api/v1/clients/publish', methods=['POST'])
def publish():
    data = request.form
    client_id = data.get('client_id')
    ip = data.get('ip')
    vhost = data.get('vhost')
    app = data.get('app')
    stream = data.get('stream')
    param = data.get('param')
    # 处理推流开始事件
    print(f"Stream {stream} started by client {client_id} from IP {ip}")
    return jsonify({"message": "Stream published", "stream": stream}), 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8085)

测试

  1. 启动 Flask 应用
   python app.py
  1. 配置 SRS: 在 SRS 的配置文件中,设置 on_publish 为 Flask 应用的 URL,例如 http://127.0.0.1:8085/api/v1/clients/publish
  2. 启动 SRS 并推流: 当客户端开始推流到 SRS 时,SRS 会发送一个 HTTP POST 请求到 Flask 应用,Flask 应用会输出类似以下内容:
   Stream example_stream started by client 12345 from IP 192.168.1.100

通过这种方式,你可以灵活地在推流事件发生时执行相应的操作,包括记录日志、触发其他服务、监控流状态等。

配置 exec 模块

如果你有多个文件需要推送,可以在 exec 配置中使用多个publish指令来推送每个文件。

srs.conf

vhost __defaultVhost__ {
    # 配置自定义的文件流
    exec {
         enabled on;
         publish ./objs/ffmpeg/bin/ffmpeg -re -stream_loop -1 -i /Users/wuhuaming/Downloads/motrix/01.flv -c copy -f flv rtmp://127.0.0.1/live/11;
         publish ./objs/ffmpeg/bin/ffmpeg -re -stream_loop -1 -i /Users/wuhuaming/Downloads/motrix/02.flv -c copy -f flv rtmp://127.0.0.1/live/12;
         publish ./objs/ffmpeg/bin/ffmpeg -re -stream_loop -1 -i /Users/wuhuaming/Downloads/motrix/12.flv -c copy -f flv rtmp://127.0.0.1/live/13;
    }

}

配置 stream_caster

stream_caster配置可以支持以http的方式推送视频文件以实现推流的方式

srs.conf

# Push FLV by HTTP POST to SRS.
stream_caster {
    enabled on;
    caster flv;
    output rtmp://127.0.0.1:1935/app/stream;
    listen 8936;
}

这里的 /app/stream 是动态参数和post 的请求路径有关

apifox请求:

通过VLC播放器就可以播放 rtmp://localhost/live/12 视频流了,但是当这个请求结束以后rtmp流也将结束

ingest 配置

ingest主要是用来配置在srs启动的时候可以支持自动推送 rtsp流

srs.conf

vhost __defaultVhost__ {
    hls {
        enabled         on;
    }

    http_remux {
        enabled     on;
        mount       vhost/app/[stream].flv;
    }
    rtc {
        enabled     on;
        # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtmp-to-rtc
        rtmp_to_rtc off;
        # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtc-to-rtmp
        rtc_to_rtmp off;
    }

    play{
        gop_cache_max_frames 2500;
    }
    # 自定义rstp流
    ingest 1{
        enabled      on;
        input {
            type    stream;
            url     rtsp://admin:dmgyz!CMXKH3.01@10.13.69.250:554/Streaming/Channels/101;
        }
        ffmpeg      ./objs/ffmpeg/bin/ffmpeg;
        engine {
            enabled          on;
            perfile {
                rtsp_transport tcp;
            }
            vcodec copy;
            acodec copy;
            output          rtmp://127.0.0.1:1935/live/1;
        }
    }

    # 自定义rstp流
    ingest 2{
        enabled      on;
        input {
            type    stream;
            url     rtsp://admin:1qaz@WSX@10.13.68.67:554/profile1;
        }
        ffmpeg      ./objs/ffmpeg/bin/ffmpeg;
        engine {
            enabled          on;
            perfile {
                rtsp_transport tcp;
            }
            vcodec copy;
            acodec copy;
            output          rtmp://127.0.0.1:1935/live/2;
        }
    }

}

push_stream.sh

#!/bin/bash

# 定义视频文件路径和流地址
VIDEO_FILES=(
"/usr/local/srs/localFlv/01.flv"
"/usr/local/srs/localFlv/02.flv"
"/usr/local/srs/localFlv/04.mp4"
)

STREAM_URLS=(
"rtmp://127.0.0.1/live/1"
"rtmp://127.0.0.1/live/2"
"rtmp://127.0.0.1/live/4"
)

FFMPEG_PATH="/usr/local/srs/objs/ffmpeg/bin/ffmpeg"

# 检查 ffmpeg 是否存在
if [ ! -f "$FFMPEG_PATH" ]; then
echo "ffmpeg not found at $FFMPEG_PATH"
exit 1
fi

# 推流函数
push_stream() {
local video_file=$1
local stream_url=$2

    echo "Pushing stream: $video_file to $stream_url"
    $FFMPEG_PATH -re -stream_loop -1 -i $video_file -c copy  -f flv $stream_url > /tmp/ffmpeg-$(basename $video_file .flv).log 2>&1 &
}

# 循环推流
for i in "${!VIDEO_FILES[@]}"; do
push_stream "${VIDEO_FILES[$i]}" "${STREAM_URLS[$i]}"
done

# 保持脚本运行,防止容器退出
wait

如果只想推送视频不推送音频,可以修改ffmpeg的配置,将-c copy改成-c:v copy -an

nohup bash push_stream.sh & > null
0%