其他分享
首页 > 其他分享> > 10┃音视频直播系统之 WebRTC 中的数据统计和绘制统计图形

10┃音视频直播系统之 WebRTC 中的数据统计和绘制统计图形

作者:互联网

一、数据统计

 

二、获取统计数据

var pc = new RTCPeerConnection();

// 获得速个连接的统计信息
pc.getStats().then( 
 	// 在一个连接中有很多 report
 	reports => {
 		// 遍历每个 report
 		reports.forEach( report => {
 			// 将每个 report 的详细信息打印出来
 			console.log(report);
 		});
 }).catch( err => {
		console.error(err);
 })
)

 

三、插件库绘制图形

// 引入第三方库 graph.js
<script src="/js/graph.js"></script>

<script>
var pc = null;
// 定义绘制比特率图形相关的变量
var bitrateGraph;
var bitrateSeries;
// 定义绘制发送包图形相关的变理
var packetGraph;
var packetSeries;

pc = new RTCPeerConnection(null);

//bitrateSeries 用于绘制点
bitrateSeries = new TimelineDataSeries();

//bitrateGraph 用于将 bitrateSeries 绘制的点展示出来
bitrateGraph = new TimelineGraphView('bitrateGraph', 'bitrateCanvas');
bitrateGraph.updateEndDate(); // 绘制时间轴

// 与上面一样,只不是用于绘制包相关的图
packetSeries = new TimelineDataSeries();
packetGraph = new TimelineGraphView('packetGraph', 'packetCanvas');
packetGraph.updateEndDate();

// 每秒钟获取一次 Report,并更新图形
window.setInterval(() => {
    if (!pc) { // 如果 pc 没有创建直接返回
        return;
    }
    // 从 pc 中获取发送者对象
    const sender = pc.getSenders()[0];
    if (!sender) {
        return;
    }
    sender.getStats().then(res => { // 获取到所有的 Report
        res.forEach(report => { // 遍历每个 Report
            let bytes;
            let packets;
            // 我们只对 outbound-rtp 型的 Report 做处理
            if (report.type === 'outbound-rtp') {
                if (report.isRemote) { // 只对本地的做处理
                    return;
                }
                const now = report.timestamp;
                bytes = report.bytesSent; // 获取到发送的字节
                packets = report.packetsSent; // 获取到发送的包数
                // 因为计算的是每秒与上一秒的数据的对比,所以这里要做个判断
                // 如果是第一次就不进行绘制
                if (lastResult && lastResult.has(report.id)) {
                    // 计算这一秒与上一秒之间发送数据的差值
                    var mybytes = (bytes - lastResult.get(report.id).bytesSent);
                    // 计算走过的时间,因为定时器是秒级的,而时间戳是豪秒级的
                    var mytime = (now - lastResult.get(report.id).timestamp);
                    const bitrate = 8 * mybytes / mytime * 1000; // 将数据转成比特位
                    // 绘制点
                    bitrateSeries.addPoint(now, bitrate);
                    // 将会制的数据显示出来
                    bitrateGraph.setDataSeries([bitrateSeries]);
                    bitrateGraph.updateEndDate();// 更新时间
                    // 下面是与包相关的绘制
                    packetSeries.addPoint(now, packets -
                        lastResult.get(report.id).packetsSent);
                    packetGraph.setDataSeries([packetSeries]);
                    packetGraph.updateEndDate();
                }
            }
        });
        // 记录上一次的报告
        lastResult = res;
    });
}, 1000); // 每秒钟触发一次  
</script>

 

四、Canvas绘制图形

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>canvas 实战</title>
</head>

<body>
    <canvas id="canvas" width="150" height="150">
        The browser doesn't support the canvas tag.
    </canvas>
</body>
<script>
    // 从 HTML 获取到 Canvas
    let canvas = document.getElementById('canvas');

    // 得到 Canvas 的渲染上下文
    let ctx_2d = canvas.getContext('2d');

    // 设置颜色为红色
    ctx_2d.fillStyle = "rgb(200,0,0)";

    // 设置矩型的大小
    ctx_2d.fillRect(10, 10, 55, 50);

    // 设置颜色为蓝色,并且透明
    ctx_2d.fillStyle = "rgba(0, 0, 200, 0.5)";

    // 设置矩型大小
    ctx_2d.fillRect(30, 30, 55, 50);
</script>

</html>

 

 

标签:10,Canvas,var,音视频,pc,report,图形,绘制,WebRTC
来源: https://www.cnblogs.com/autofelix/p/16287408.html