javascript视频逐帧请求

定时器实现

// 获取某帧图像
function getFrame(id) { // frameID
    return new Promise((resolve) => {
        http.get('url' + id, () => {
            resolve()
        }).end();
    })
}
function fun1(from = 0, to = 100) {
    var N = to - from;
    var i = from
    var timer = setInterval(() => {
        f(i)
        i++;
        if (i >= to) {
            clearInterval(timer)
        }
    }, 1000 / frameRate);
}

缺点

容易堵塞,导致整体速度下降。

0请求用时:165ms
1请求用时:313ms
9请求用时:185ms
7请求用时:223ms
6请求用时:239ms
8请求用时:209ms
2请求用时:303ms
3请求用时:288ms
4请求用时:275ms
5请求用时:260ms
13请求用时:338ms
18请求用时:244ms
17请求用时:262ms
19请求用时:228ms
11请求用时:371ms
15请求用时:312ms
10请求用时:393ms
14请求用时:329ms
12请求用时:360ms
16请求用时:301ms
23请求用时:455ms
22请求用时:471ms
21请求用时:486ms
29请求用时:359ms
27请求用时:398ms
20请求用时:508ms
30请求用时:344ms
28请求用时:386ms
25请求用时:432ms
31请求用时:328ms
26请求用时:420ms
32请求用时:312ms
24请求用时:452ms
44请求用时:599ms
45请求用时:582ms
46请求用时:561ms
37请求用时:732ms
42请求用时:642ms
48请求用时:533ms
49请求用时:520ms
47请求用时:550ms
43请求用时:629ms
36请求用时:1257ms
40请求用时:1198ms
41请求用时:1172ms
39请求用时:1215ms
34请求用时:1291ms
35请求用时:1277ms
38请求用时:1232ms
33请求用时:1311ms
64请求用时:1443ms
62请求用时:1486ms
68请求用时:1367ms
67请求用时:1387ms
69请求用时:1349ms
55请求用时:1613ms
61请求用时:1510ms
63请求用时:1470ms
52请求用时:1665ms
57请求用时:1591ms
58请求用时:1581ms
66请求用时:1422ms
54请求用时:1643ms
65请求用时:1460ms
50请求用时:1723ms
72请求用时:1330ms
59请求用时:1585ms
60请求用时:1568ms
51请求用时:1718ms
70请求用时:1369ms
53请求用时:1718ms
71请求用时:1386ms
73请求用时:1382ms
56请求用时:1704ms
87请求用时:1228ms
86请求用时:1245ms
88请求用时:1215ms
89请求用时:1200ms
84请求用时:1291ms
82请求用时:1322ms
78请求用时:1383ms
74请求用时:1444ms
81请求用时:1348ms
97请求用时:1101ms
75请求用时:1441ms
77请求用时:1412ms
96请求用时:1120ms
95请求用时:1136ms
76请求用时:1431ms
93请求用时:1170ms
83请求用时:1326ms
85请求用时:1298ms
91请求用时:1211ms
94请求用时:1166ms
99请求用时:1101ms
98请求用时:1117ms
92请求用时:1209ms
80请求用时:1520ms
90请求用时:1371ms
79请求用时:1549ms

设置帧率为100,由于堵塞,导致速度逐渐变慢

定时器+判断

function fun2(from = 0, to = 100) {
    var N = to - from;
    var i = from
    function g(p) { // p is a promise object
        setTimeout(() => {
            if (p.finished) {
                i++;
                if (i < to) {
                    g(f(i))
                }
            } else {
                p.then(() => {
                    i++;
                    if (i < to) {
                        g(f(i))
                    }
                })
            }
        }, 1000 / frameRate);
    }
    g(f(i))
}

思路是:开启一个定时器,定时器结束时请求已经完成,立刻请求下一帧;如果定时器结束时请求尚未完成,那么在请求then后再请求下一帧。

其他方法

  • 事件池
  • await强行等待当前帧完成
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值