使用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
一切正常。終於播放出來了。常舒一口氣。