zoukankan      html  css  js  c++  java
  • 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
    一切正常。终于播放出来了。常舒一口气。
  • 相关阅读:
    问题账户需求分析
    UnityWebRequest_ZT
    NetworkManager网络通讯_问题汇总(四)
    NetworkManager网络通讯_NetworkLobbyManager(三)
    NetworkManager网络通讯_NetworkManager(二)
    C#关于private protected sealed Virtual/Override
    NetworkManager网络通讯_Example(一)
    Udp 异步通信(三)
    TCP Socket服务端客户端(二)
    TCP UDP基本编程(一)
  • 原文地址:https://www.cnblogs.com/zzugyl/p/15779404.html
Copyright © 2011-2022 走看看