// 读取 rtpPack1.txt 文件,解析其中的 rtp 包,检查其中的序列号是否连续 const path = require("path"); const loadTxt = require("./loadTxt"); const rtp = require("./rtpParse"); function handle(promise){ return promise.then(data=>[null,data]).catch(err=>[err,null]) } let filePath1 = path.join(__dirname, 'rtpPack1.txt'); let filePath2 = path.join(__dirname, 'rtpPack2.txt'); async function parseRtpPackTxt(filePath) { let rtpPacks = []; let [err,lines] = await handle( loadTxt.loadFileLines(filePath) ); if (err){ return console.log(err); } // 读取一行,跳过一行 for (let i = 0; i < lines.length; i+=2) { let line = lines[i]; if (line === "***end***"){ console.log("文件解析结束"); return rtpPacks; } rtpPacks.push(line); } return rtpPacks; } // 格式化输出内容 用于打印表格 例如 // 表单长度 用于打印表格 例如 [20,20] 则再打印表格时,每个单元格的长度为 20 let tbLen = [50, 50]; let lineLen = 2; function printf() { let str = ""; str += "|"; for (let i = 0; i < lineLen; i++) { let arg = arguments[i] || ""; let len = tbLen[i]; let argLen = arg.length; let spaceLen = len - argLen; let space = ""; for (let j = 0; j < spaceLen; j++) { space += " "; } // // 如果长度超过了表单长度,则截取字符串 if (argLen > len){ arg = arg.substr(0,len); } str += arg + space + "|"; } console.log(str); } // 解析剩余数据 let last_data = ["",""]; let bitLen = 2; // rtp over tcp 包的前两个字节为rtp包的长度 function parseRtpOverTcp(no, package){ // 合并旧数据 if(last_data[no] !== ""){ package = last_data[no] + package; last_data[no] = ""; } let allLen = package.length; console.log(`---*-*-*-*-*------ allLen: ${allLen} ------*-*-*-*-*-*---`) let len = 0; // 读取包长度 let packageLenStr = package.substr(0,4); let packageLen = parseInt(packageLenStr,16); console.log(`packageLenStr: ${packageLenStr} >>> ${packageLen}`); // package_len + i <= left_len + data_len while ( (len + packageLen) * 2 <= allLen ){ console.log('----') // 解析rtp包 let rtpPackage = package.substr(len * 2 + 4, packageLen * bitLen); let rtpHeaderInfo = rtp.parseRtpHeader(rtpPackage.substr(0,24)); console.log(rtpHeaderInfo) // i += package_len + 2; // 读取下一个包长度 len += packageLen + 2; console.log(`len: ${len}`) packageLenStr = package.substr(len * 2, 4); packageLen = parseInt(packageLenStr,16); console.log(`packageLenStr: ${packageLenStr} >>> ${packageLen} `); // 如果剩余数据不足以解析一个包,则跳出循环 } // 读取剩余数据 last_data[no] = package.substr(len * 2 ); console.log(`last_data: ${last_data[no].length}`); } async function main(){ let rtpPackages_1 = await parseRtpPackTxt(filePath2); let rtpPackages_2 = await parseRtpPackTxt(filePath2); printf(" black"," ok"); printf("------------------------------","------------------------------"); // 开始解析rtp数据 for (let i = 0; i < rtpPackages_1.length; i++) { console.log(`---*-*-*-*-*------ ${i} ------*-*-*-*-*-*---`) let rtpPackage_1 = rtpPackages_1[i]; // 输出前10个字节 console.log(rtpPackage_1.substr(0,20)); let rtpPackage_2 = rtpPackages_2[i]; // rtpPackage_1 = rtpPackage_1.substr(4,24); // rtpPackage_2 = rtpPackage_2.substr(4,24); // printf( // ` ${rtpPackage_1}`, // ` ${rtpPackage_2}`, // ); let rtpHeaderInfo_1 = parseRtpOverTcp(0, rtpPackage_1); // let rtpHeaderInfo_2 = rtp.parseRtpOverTcp(1, rtpPackage_2); let rtpHeaderInfo_2 = {}; // printf( // `${i} version: ${rtpHeaderInfo_1.version}`, // `${i} version: ${rtpHeaderInfo_2.version}`, // ); // // printf( // `${i} padding: ${rtpHeaderInfo_1.padding}`, // `${i} padding: ${rtpHeaderInfo_2.padding}`, // ); // // printf( // `${i} extension: ${rtpHeaderInfo_1.extension}`, // `${i} extension: ${rtpHeaderInfo_2.extension}`, // ); // // printf( // `${i} csrcCount: ${rtpHeaderInfo_1.csrcCount}`, // `${i} csrcCount: ${rtpHeaderInfo_2.csrcCount}`, // ); // // printf( // `${i} csrcCount: ${rtpHeaderInfo_1.csrcCount}`, // `${i} csrcCount: ${rtpHeaderInfo_2.csrcCount}`, // ); // // printf( // `${i} marker: ${rtpHeaderInfo_1.marker}`, // `${i} marker: ${rtpHeaderInfo_2.marker}`, // ); // // printf( // `${i} payloadType: ${rtpHeaderInfo_1.payloadType}`, // `${i} payloadType: ${rtpHeaderInfo_2.payloadType}`, // ); // // printf( // `${i} sequenceNumber: ${rtpHeaderInfo_1.sequenceNumber}`, // `${i} sequenceNumber: ${rtpHeaderInfo_2.sequenceNumber}`, // ); // // printf( // `${i} timestamp: ${rtpHeaderInfo_1.timestamp}`, // `${i} timestamp: ${rtpHeaderInfo_2.timestamp}`, // ); // // printf( // `${i} ssrc: ${rtpHeaderInfo_1.ssrc}`, // `${i} ssrc: ${rtpHeaderInfo_2.ssrc}`, // ); // // printf( // `${i} csrc: ${rtpHeaderInfo_1.csrc}`, // `${i} csrc: ${rtpHeaderInfo_2.csrc}`, // ); // // printf( // `${i} time: ${rtpHeaderInfo_1.time}`, // `${i} time: ${rtpHeaderInfo_2.time}`, // ); // // printf("------------------------------","------------------------------"); // printf("------------------------------","------------------------------"); // printf("------------------------------","------------------------------"); } } main()