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
一切正常。終於播放出來了。常舒一口氣。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章