srs更改端口号导致webrtc播放异常
使用srs4做server,使用配置文件rtmp2rtc.conf,用ffmpeg推流rtmp,用户用webrtc播放。
在本机localhost环境演示都没遇到意外,在一个闲置的服务器上使用的时候,遇到了一点挫折,花了几个小时才解决。
具体使用是这样的,我更改了srs默认端口号,换成了5位数的端口号,前面都加了4。8000端口没有更改。
其中最关键的一个,API端口号1985,我改成了41985。
其中最关键的一个,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个方法解决:
- 把端口改回1985
- 把那3个js中1985改成41985
- 把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
一切正常。终于播放出来了。常舒一口气。