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)
测试
- 启动 Flask 应用:
python app.py
- 配置 SRS:
在 SRS 的配置文件中,设置
on_publish
为 Flask 应用的 URL,例如http://127.0.0.1:8085/api/v1/clients/publish
。 - 启动 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