因为产品需要,要求前端网页可以自动分解客户填写的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中:
- rtmp://demo.srs.com/live/livestream
- rtmp://192.168.1.100/live?vhost=demo.srs.com/livestream
- 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字段中的用户名和密码的字段,使用和原先的方法一样。