视频卡顿率测试方法

一、背景介绍

视频流畅性测试是视频质量评估一个重要的指标。一般的获取方法是在渲染前增加统计信息。不过这种方法需要增加额外工作量,并且也不是用户直接的体验数据。

这里介绍一种基于时域运动指标/平均相关位置像素差(TI:temporal information)计算视频流畅性的方法。

二、原理介绍

ITU-R BT.1788 建议书对TI:temporal information、SI,Spatial perceptual Information的介绍。

SI表征一帧图像的空间细节量。空间上越复杂的场景,SI值越高。

SI计算方法:对第n帧视频进行Sobel滤波,然后对滤波后图像计算标准差。

TI表征视频序列的时间变化量。运动程度较高的序列通常会有更高的TI值。

TI计算方法:求n与n-1帧图像的帧差,然后对帧差图像计算标准差。

参考链接如下: 

视频特性TI(时间信息)和SI(空间信息)的计算工具:TIandSI_雷霄骅的博客-CSDN博客做视频评价试验的时候,需要根据一定的条件选择有代表性的视频序列。ITU-R BT.1788建议使用时间信息(TI,Temporal perceptual Information)和空间信息(SI,Spatial perceptual Information)来衡量视频的特性。SI表征一帧图像的空间细节量。空间上越复杂的场景,SI值越高。TI表征视频序列的时间变化量。运动程度较高的序列通常会https://blog.csdn.net/leixiaohua1020/article/details/9056443

VMAF源码motion.c文件也有对TI的计算:

/**
 * Note: img1_stride and img2_stride are in terms of (sizeof(float) bytes)
 */
float vmaf_image_sad_c(const float *img1, const float *img2, int width, int height, int img1_stride, int img2_stride)
{
    float accum = (float)0.0;

    for (int i = 0; i < height; ++i) {
                float accum_line = (float)0.0;
        for (int j = 0; j < width; ++j) {
            float img1px = img1[i * img1_stride + j];
            float img2px = img2[i * img2_stride + j];

            accum_line += fabs(img1px - img2px);//计算整帧残差之和
        }
        accum += accum_line;
    }

    return (float) (accum / (width * height)); //计算残差平均值
}

三、详细设计

1、使用高速相机录制一段待测试系统的视频,至少保证高速相机的帧率大于待测试系统视频帧率的两倍以上。

2、取出高速相机录制的视频,使用ffprobe.exe获取帧信息的PTS。根据PTS的gap,获取录制时长的精准值。获取文件容器的帧信息:ffprobe.exe -i input_file.mp4 -show_frames >>frame.txt

3、使用ffmpeg.exe将录制视频转换成YUV420p格式。

     命令行:ffmpeg -i input_file.mp4 -pix_fmt yuv420p input_file.yuv-----无文件描述头字段

4、使用雷霄骅博客中的tisi工具,tisi -i input_file.yuv -x 1920 -y 1080 -f 420获取TI信息列表。

当TI值小于一定的阈值,我们就可以认为两帧图片是相同的,这个点存在了卡顿。

 5、将步骤2获取的帧PTS列表和步骤4获取的帧TI列表对应起来,就可以清楚的看到在哪个时间点出现了多长时间的卡顿。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
计算视频卡顿率可以使用Golang编程语言来实现。 首先,我们需要获取视频的播放时间戳和每一帧的时间戳。可以使用Golang中的视频处理库如FFmpeg或者GStreamer来读取视频文件并获取相关信息。 然后,我们可以计算每一帧之间的时间间隔,并与我们期望的帧间隔进行比较。通常情况下,视频每秒钟播放的帧数是固定的,例如30帧/秒。通过计算每一帧的时间间隔,我们可以判断是否有丢帧或者卡顿现象发生。 具体的计算方法可以使用下面的伪代码来实现: ``` frame_interval = expected_frame_interval / frame_rate buffer_count = 0 dropped_frames = 0 total_frames = 0 for each frame in video: if time_difference between current_frame and previous_frame > frame_interval: buffer_count += 1 if buffer_count > threshold_value: dropped_frames += 1 total_frames += 1 stutter_rate = (dropped_frames / total_frames) * 100 print("视频卡顿率: ", stutter_rate, "%") ``` 在上述代码中,我们定义了帧间隔(frame_interval)以及阈值(threshold_value)。如果两帧之间的时间间隔超过了期望的帧间隔,我们认为发生了卡顿,将缓冲计数器(buffer_count)加一。当缓冲计数器超过阈值时,我们认为发生了丢帧,将丢帧计数器(dropped_frames)加一。 最后,我们可以通过计算丢帧的比例来得到视频卡顿(stutter_rate)。 需要注意的是,实际应用中还可能需要考虑其他方面的因素,例如网络延迟和解码性能等。因此,在实际应用中可能需要进行更复杂和详细的计算和判断。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值