SRS视频媒体服务器-docker启动:更换默认端口时的错误

一、概述

在使用srs视频服务器时,一直都是使用默认的端口配置。但是,这些默认端口在某些时候可能已经被占用了,就需要更改端口了。

注意注意注意:使用docker启动srs,在更换端口一定要下面的内容。

二、使用docker启动srs,换端口时错误的方式

网络拓扑图:

SRS视频媒体服务器-docker启动:更换默认端口时的错误_第1张图片

 

启动命令:外部端口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的视频流了。

你可能感兴趣的:(音视频)