js分解RTMP的url地址

閃亮的塔科特發表於2018-03-28

因為產品需要,要求前端網頁可以自動分解客戶填寫的RTMP的url地址,在與底層互動時,將分解好的欄位傳給底層,不能直接傳完整的URL,所以自己寫了一個方法來分解RTMP的url地址。

URL組成

標準的RTMP的URL由以下部分組成:


  • Schema:協議頭,RTMP為RTMP/RTMPS/RTMPE/RTMPT等眾多協議,還有新出的RTMFP。
  • Host:主機,表示要連線的主機,可以為主機DNS名稱或者IP地址。商用時,一般不會用IP地址,而是DNS名稱,這樣可以用CDN分發內容(CDN一般使用DNS排程,即不同網路和地理位置的使用者,通過DNS解析到的IP不一樣,實現使用者的就近訪問)。
  • Port:埠,HTTP預設為80,RTMP預設為1935。當埠沒有指定時,使用預設埠。
  • App:RTMP的Application(應用)名稱,可以類比為資料夾。以資料夾來分類不同的流,沒有特殊約定,可以任意劃分。
  • Stream:RTMP的Stream(流)名稱,可以類比為檔案。

URL主要格式列舉:

目前客戶使用的地址分為3中:

  1. rtmp://demo.srs.com/live/livestream
  2. rtmp://192.168.1.100/live?vhost=demo.srs.com/livestream
  3. rtmp://demo.srs.com/live?key=ER892ID839KD9D0A1D87D/livestream

第一種為最為普遍的URL地址,是普通使用者的標準訪問方式,觀看直播流,第二種是運維對特定伺服器排錯,第三種是token驗證使用者,或者頻寬測試的key驗證,實際情況以第一種為準。

URL格式分解

function analyzeRTMPURl(url){
    var head=url.indexOf("://");
    var pro=url.substring(0,head);
    var body=url.substring(head+3);
    var array=body.split("/");
    var servername=array[0];
    var server=servername.indexOf(":");
    var serverLength;
    var ip;
    var port;
    if(server==-1){
        ip=servername;
        port="1935";
        serverLength=ip.length+1;
    }else{
        ip=servername.substring(0,server);
        port=servername.substring(server+1);
        serverLength=ip.length+port.length+2;
    }
    var app = array[1];
    var appLength = app.length + 1;
    var stream = body.substring(serverLength + appLength);
    var reList = [ip, port, app, stream];
    return reList;
}

初步封裝了一個方法,將分解結果以陣列方式返回,用analyzeRTMPURL(url)[i]來返回分解的值

更新要求:

前幾天某客戶的推流地址有特殊要求,新增驗證欄位,例如:

rtmp://admin:123456@p.ep512007.i.akamaientrypoint.net/live/live1

原先的方法就無法正常解析這類地址,所以又重新寫了一個通用的方法:

function analyzePasswordRTMPURl(url){
    var head=url.indexOf("://");
    var pro=url.substring(0,head);
    var body=url.substring(head+3);
    var array=body.split("/");
    var servername=array[0];
    var server;
    var serverLength;
    var ip;
    var port;
    var name;
    var password;
    var isEnablePass=servername.indexOf("@");
    if(isEnablePass==-1){
       server = servername.indexOf(":");
        if(server==-1){
            ip=servername;
            port="1935";
            serverLength=ip.length+1;
        }else{
            ip=servername.substring(0,server);
            port=servername.substring(server+1);
            serverLength=ip.length+port.length+2;
        }
        name="";
        password="";
    }else{
        let namePart = servername.substring(0, isEnablePass);
        let addressPart = servername.substring(isEnablePass + 1);
        let namePass = namePart.indexOf(":");
        name = namePart.substring(0, namePass);
        password= namePart.substring(namePass + 1);
        server= addressPart.indexOf(":");
        if(server==-1){
            ip=addressPart;
            port="1935";
            serverLength=ip.length+1+isEnablePass+1;
        }else{
            ip=addressPart.substring(0,server);
            port=addressPart.substring(server+1);
            serverLength=ip.length+port.length+2+isEnablePass+1;
        }
    }
    var app = array[1];
    var appLength = app.length + 1;
    var stream = body.substring(serverLength + appLength);
    var reList = [ip, port, app, stream,name,password];
    return reList;
}
這樣就會解析url欄位中的使用者名稱和密碼的欄位,使用和原先的方法一樣。

相關文章