SRS视频媒体服务器-docker启动:更换默认端口时的错误
一、概述
在使用srs视频服务器时,一直都是使用默认的端口配置。但是,这些默认端口在某些时候可能已经被占用了,就需要更改端口了。
注意注意注意:使用docker启动srs,在更换端口一定要下面的内容。
二、使用docker启动srs,换端口时错误的方式
网络拓扑图:
启动命令:外部端口1936映射内部1935 和 外部端口8001映射内部8000端口
docker run -it --name srs4.0-test --restart=always -v C:\5G\5GApi\static\DVR-video:/usr/local/srs/static/DVR-video -p 1936:1935 -p 1985:1985 -p 8080:8080 -p 10080:10080/udp -p 8001:8000/udp registry.cn-hangzhou.aliyuncs.com/ossrs/srs:4 ./objs/srs -c conf/rtmp2rtc.conf
修改rtmp2rtc.conf配置文件:
1、给容器安装vim
#查看运行的docker docker ps
#新开一个终端进入docker容器 docker exec -it srs4.0-test /bin/bash
#先更新apt-get apt-get update
#安装vim apt-get install vim -y
2、配置容器可以访问宿主机的域名
进入下面的目录: C:\Windows\System32\drivers\etc
修改hosts文件:添加 127.0.0.1 host.docker.internal
#就可以在容器中通过 http://host.docker.internal:8888 访问到宿主机上部署的服务了
3、修改srs的配置文件
docker exec -it srs4.0 /bin/bash
#修改配置文件(修改步骤1中默认的配置文件)
vi conf/rtmp2rtc.conf
#配置文件内容
listen 1935; #必须有,rtmp协议,公网必须开放这个端口
max_connections 1000;
daemon off;
srs_log_tank console;
http_api {
enabled on;
#必须有,webrtc播放需要,可以在nginx配置转发,location /rtc {},无需开放该端口
listen 1985;
}
http_server {
enabled on;
listen 8080;
#开发阶段需要,这个是srs自带的web页面,可以使用nginx代理
dir ./objs/nginx/html;
}
rtc_server { #webrtc服务,必须开放公网8000端口
enabled on;
listen 8000;
candidate 公网IP地址;
}
# @doc https://github.com/ossrs/srs/issues/1147#issuecomment-577607026
vhost __defaultVhost__ {
#这个是rtc配置,开启rtmp转rtc
rtc {
enabled on;
rtmp_to_rtc on;
rtc_to_rtmp on;
}
#开启http-flv
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
#rtmp的低时延配置
tcp_nodelay on;
min_latency on;
play {
gop_cache off;
queue_length 10;
mw_latency 100;
}
publish {
mr off;
}
#视频录制功能
dvr {
enabled on;
dvr_path /usr/local/srs/static/DVR-video/[app]/[01]-[2006]/[02]-day/[stream]-[2006]-[01]-[02]_[15]_[04]_[05].mp4;
dvr_plan session; #存一次推流中的所有的视频
dvr_duration 30;
dvr_wait_keyframe on;
}
http_hooks {
#回调函数,on是启动,off是中止
enabled off;
on_dvr http://host.docker.internal:8888/srs/dvr;
#视频录制的回调函数,一个视频录制完成后,会向给url发起post请求
on_publish http://host.docker.internal:8888/srs/publish;
on_unpublish http://host.docker.internal:8888/srs/un_publish;
on_play http://host.docker.internal:8888/srs/play;
on_stop http://host.docker.internal:8888/srs/stop;
}
}
此时推流rtmp到srs服务器时,在使用srs自带的播放器拉取webrtc流,就会发现拉取不到,你可以停止推流rtmp。
到:C:\5G\5GApi\static\DVR-video 目录下查看是否有录制的视频,发现有该视频。
总结:
1、这种配置,可以录制,但是不能播放。
2、具体原因在于公网IP只将8001和1936端口映射个宿主机,而宿主机又是将8001和1936映射给srs容器的8000和1935,最致命的是srs服务器是根据配置文件中的8000和1935端口来生成对应可以播放webrtc流的验证数据,导致无法播放
三、正确的方法
1、启动srs容器:宿主机端口和容器端口映射时,保持端口一致
docker run -it --name srs4.0-test --restart=always -v C:\5G\5GApi\static\DVR-video:/usr/local/srs/static/DVR-video -p 1936:1936 -p 1985:1985 -p 8080:8080 -p 10080:10080/udp -p 8001:8001/udp registry.cn-hangzhou.aliyuncs.com/ossrs/srs:4 ./objs/srs -c conf/rtmp2rtc.conf
2、配置srs配置文件:使用宿主机端口启动
listen 1936; #必须有,rtmp协议,公网必须开放这个端口
max_connections 1000;
daemon off;
srs_log_tank console;
http_api {
enabled on;
#必须有,webrtc播放需要,可以在nginx配置转发,location /rtc {},无需开放该端口
listen 1985;
}
http_server {
enabled on;
listen 8080;
#开发阶段需要,这个是srs自带的web页面,可以播放webrtc等视频,公网无需开发这个端口
dir ./objs/nginx/html;
}
srt_server { #没有使用到srt服务,无需开发10080端口
enabled on;
listen 10080;
maxbw 1000000000;
connect_timeout 4000;
latency 20;
peerlatency 20;
recvlatency 20;
}
rtc_server { #webrtc服务,必须开放公网8000端口
enabled on;
listen 8001;
candidate 112.94.31.117;
}
# @doc https://github.com/ossrs/srs/issues/1147#issuecomment-577607026
vhost __defaultVhost__ {
#这个是rtc配置,开启rtmp转rtc
rtc {
enabled on;
rtmp_to_rtc on;
rtc_to_rtmp on;
}
#开启http-flv
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
#rtmp的低时延配置
tcp_nodelay on;
min_latency on;
play {
gop_cache off;
queue_length 10;
mw_latency 100;
}
publish {
mr off;
}
#视频录制功能
dvr {
enabled on;
dvr_path /usr/local/srs/static/DVR-video/[app]/[01]-[2006]/[02]-day/[stream]-[2006]-[01]-[02]_[15]_[04]_[05].mp4;
dvr_plan session; #存一次推流中的所有的视频
dvr_duration 30;
dvr_wait_keyframe on;
}
http_hooks {
#回调函数,on是启动,off是中止
enabled off;
on_dvr http://host.docker.internal:8888/srs/dvr;
#视频录制的回调函数,一个视频录制完成后,会向给url发起post请求
on_publish http://host.docker.internal:8888/srs/publish;
on_unpublish http://host.docker.internal:8888/srs/un_publish;
on_play http://host.docker.internal:8888/srs/play;
on_stop http://host.docker.internal:8888/srs/stop;
}
}
这样配置时,就可以正常拉取webrtc的视频流了。