srs更改端口号导致webrtc播放异常

使用srs4做server,使用配置文件rtmp2rtc.conf,用ffmpeg推流rtmp,用户用webrtc播放。
在本机localhost环境演示都没遇到意外,在一个闲置的服务器上使用的时候,遇到了一点挫折,花了几个小时才解决。
具体使用是这样的,我更改了srs默认端口号,换成了5位数的端口号,前面都加了4。8000端口没有更改。
其中最关键的一个,API端口号1985,我改成了41985。
http_api {
    enabled         on;
    listen          41985; //default 1985
}
于是,从我PC推流:
ffmpeg -threads 2 -re -fflags +genpts -stream_loop -1 -i ./test.mp4 -vcodec copy -acodec aac -ar 16000 -ac 1 -f flv rtmp://mydomain:41935/live/livestream
接着在PC上播放rtmp流,正常:
ffplay rtmp://mydomain:41935/live/livestream
....................
  Duration: N/A, start: 0.000000, bitrate: 918 kb/s
    Stream #0:0: Data: none
    Stream #0:1: Audio: aac (LC), 16000 Hz, mono, fltp, 69 kb/s
    Stream #0:2: Video: h264 (Constrained Baseline), yuv420p(progressive), 1024x576 [SAR 1:1 DAR 16:9], 849 kb/s, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc
   2.89 A-V: -0.023 fd=   0 aq=    6KB vq=  121KB sq=    0B f=0/0
再来用谷歌浏览器播放webrtc流,打开srs自带的rtp_player:
https://mydomain/players/rtc_player.html
播放以下地址:
webrtc://mydomain/live/livestream
提示错误,各种折腾,发现以下4种错误:
jquery-1.10.2.min.js:6 POST http://mydomain/rtc/v1/play/ net::ERR_CONNECTION_REFUSED
jquery-1.10.2.min.js:6 POST https://mydomain/rtc/v1/play/ 404 (Not Found)
jquery-1.10.2.min.js:6 POST https://mydomain/rtc/v1/play/ 502 (Bad Gateway)
jquery-1.10.2.min.js:6 POST https://mydomain:1985/rtc/v1/play/ net::ERR_CONNECTION_TIMED_OUT
其中第4种错误提醒了我,我前面已经把API的端口1985改成了41985,为什么这边会变成1985呢?
根据错误提示,跟踪一下web访问流程,看到了srs/players/js/*.js,其中有几个js文件,关于webrtc API的端口号有如下的定义:
// For webrtc API, we use 443 if page is https, or schema specified it.
if (!ret.port) {
    if (schema === 'webrtc' || schema === 'rtc') {
        if (ret.user_query.schema === 'https') {
            ret.port = 443;
        } else if (window.location.href.indexOf('https://') === 0) {
            ret.port = 443;
        } else {
            // For WebRTC, SRS use 1985 as default API port.
            ret.port = 1985;
        }
    }
}

 

在srs中把1985作为webrtc API默认的端口号。如果自行更改,没有做处理,使用srs的rtc_player自然就出错了。
这里,我犯了想当然的错,以为播放器自己获取了srs配置的api端口。
事已至此,想完成测试的话,有3个方法解决:
  1. 把端口改回1985
  2. 把那3个js中1985改成41985
  3. 把41985通过nginx映射到443
第1种方法,我这里不可行,端口都是提前分配好的,已经通过域名映射出去了。第2中方法太繁琐了,我担心还有其他逻辑导致更改失败。先试试第3种方法吧。
 
更改nginx.conf
server {
        listen  443 ssl;
        ssl_certificate   /etc/nginx/ssl/aliyun_sptesyun.pem;
        ssl_certificate_key  /etc/nginx/ssl/aliyun_sptesyun.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

        server_name  t0.sptesyun.com;
        sendfile        on;
        sendfile_max_chunk 512k;
        location / {
                root    /usr/local/srs/objs/nginx/html/;
        }
        location /rtc/ {
                proxy_pass http://127.0.0.1:1985;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /usr/share/nginx/html;
        }
}
重启nginx,推流不变,播放地址依然为:
webrtc://mydomain/live/livestream
一切正常。终于播放出来了。常舒一口气。
posted @ 2022-01-08 19:59  水上云天  阅读(1914)  评论(0编辑  收藏  举报