一、诉求

起因是要计算视频卡顿时长。

在处理video_to_pic的时候,用数字标识图片切片,比如1.png、2.png;
由于卡顿时长不一致,不是固定的区间,但希望获取到所有卡顿的小区间;
当成列表处理,那么如何获取呢?想到了滑动窗口,统计所有窗口的起、始位置。

二、实现

卡顿前后则画面相同,通过比较画面的相似度,确认连续相同的图片张数。

滑动窗口抽象成列表计算

输入:A = [1,1,2,3,3,3,3,4,5,6,6,6,6]
目标:[1,1],[3,3,3,3,3],[6,6,6,6]
输出:B1 = [0,3,9] ,B2 = [1,6,12]
结果:frozen_len = [2, 4, 4]

踩坑:

  1. 列表长度小于2不判断
  2. 列表的最后一位元素分三种情况
  3. [1,2,3,3,3]、[1,2,3,3,4]、[1,2,3,3,4,4]
  4. 列表第一个元素要进行指针赋值

三、原理

双指针概念,固定left、滑动right(待补充)

四、代码

# 获取连续卡顿的帧数下标,计算卡顿时间
def sliding_window(url):
    # 每帧的值
    A = [1,1,2,3,3,3,3,4,5,6,6,6,6]
    f1 = 0
    f2 = 0
    # 窗口起始位置下标
    B1 = []
    # 窗口中止位置下标
    B2 = []
    """
    1、前置条件
    2、确定循环测试
    3、删除重复判断
    4、返回所有重复窗口的起、始下标
    """

    if len(A) == 0 or len(A) == 1:
        print("没有窗口")
    if len(A) >= 2:
        for i in range(len(A)-1):
            if i == 0:
                f1 = i
                f2 = i + 1
            if f2 == len(A) - 1:
                if A[f1] == A[f2]:
                    B1.append(f1)
                    B2.append(f2)
            if A[f1] != A[f2] and A[f1] == A[f2-1] and f2-f1 >= 2:
                B1.append(f1)
                B2.append(f2-1)
                f2 += 1
                f1 = f2 - 1
            elif A[f1] != A[f2]:
                f2 += 1
                f1 += 1
                # print(B1, B2)
            elif A[f1] == A[f2]:
                f2 += 1
                f1 = f1
                # print(B1, B2)
        print("卡顿起始位置下标:",str(B1) +",终止位置下标:",str(B2))


        timecode = []
        for i in range(len(B1)):
            # 计算所有卡顿的时长
            tmp = B2[i] - B1[i]
            timecode.append(tmp)
            # 需要知道卡顿的时间戳??
        print("所有卡顿的持续时长/帧:",timecode)
输出:
卡顿起始位置下标: [0, 3, 9],终止位置下标: [1, 6, 12]
所有卡顿的持续时长/帧: [2, 4, 4]

五、扩展

  1. 可计算卡度起始的时间戳
  2. 可判断连续卡顿60张的区间
  3. 可通过将图像转成直方图,比较两张图前后的differ
  4. 可判断声波文,无声的区间
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐