0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么需要画面帧的准确性?如何探究画面帧的准确性

LiveVideoStack 来源:LiveVideoStack 2023-03-17 09:33 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

背景

分秒帧是一个音视频生产协作平台,其中用户可以通过在视频的某个时间点提出意见或分享来沟通对视频的修改意见。由于客户有时需要对时间精确到帧进行定位,我们需要保证不同转码视频在播放时,时间定位能够精确到毫秒级别。在满足这一要求的同时,我们还必须考虑不同网络条件、不同端和不同使用场景。我们在解决这些问题的过程中发现了一些问题,本文将对这些问题进行讨论。

为什么需要画面帧的准确性?

当用户发送批注需要审阅者根据批注意见做出修改时,如果没有画面校准,此时审阅者一脸黑人问号, 哪来的“T” ? 然后再私下沟通吗?信息存在误差, 审阅批注就毫无意义。

问题一:保证浏览器中 Video 标签时间定位在 pause 时的准确性

当用户在播放视频时暂停,并对视频进行批注,然后继续播放时,有时会发现定位回原始批注时间点时画面会有一帧的偏差。这是因为,我们在暂停时记录了视频的当前时间(即 currentTime)并通过 seek() 方法回到该时间点,但是这个方法并不能保证回到的画面完全准确。

现象

暂停批注时 没有矫正currentTime,当批注发送成功后,自动跳回批注点,画面发生了变化,以下是用户所不想看到的画面:

JS代码如下:

JavaScript
var videoDom =  document.getElementsByTagName('video')[0]
videoDom.pause()
var currenttime = videoDom.currentTime
videoDom.currentTime = currentTime // 此时画面有概率发生改变

问题产生原因

我们在解决这个问题时发现,这个问题是由 JavaScript 执行机制导致的。在浏览器中,JavaScript 是单线程执行的。当我们调用 pause 方法时,实际上是将该操作添加到了事件队列中。当事件轮询到这个暂停操作时,才会真正执行 pause 方法。而在这个过程中,获取 currentTime 的操作已经完成了。这就导致了两个操作之间的时间差。如果这个时间差恰好发生在视频帧切换的时候,就会导致画面偏差一帧。

举个例子,如果一个视频有 25 帧,那么第 0-40ms 是第一帧画面,第 41-80ms是第二帧画面,以此类推。

bf6249b0-c421-11ed-bfe3-dac502259ad0.jpg

当用户在播放第一帧画面时按下暂停按钮,我们认为JavaScript 会立即执行逻辑并通知 Video 标签停止播放,但实际上暂停操作会被加入事件队列中等待执行。如果暂停操作前面还有其他事件正在排队,等执行到暂停操作时就会有一定的时间差。如果这个时间差恰好发生在第 41 ms,画面会跳到下一帧画面。但是,我们拿到的currentTime还是第一帧画面的。

解决方案

为了确保在暂停时和查看批注时 currentTime 的一致性,我们在暂停时对 currentTime 进行了矫正。这样,当用户暂停时进行批注,然后再设置 currentTime查看批注时,就不会出现画面偏差问题。通过这种方式,我们就能保证画面在暂停时和查看批注时的准确性。

问题二:HLS流中视频 duration 值变化异常

在我们的应用中,我们需要确保各端的视频总时长和总帧数一致。为了实现这个目的,我们通常会在浏览器 Video 标签的 durationchange 事件触发时获取视频总时长,并通过帧率计算出总帧数。durationchange 事件是当视频总时长发生改变时触发的。当视频加载前,总时长为默认值"NaN",当视频加载完成后,durationchange 事件触发,总时长会变成视频的实际总时长。

在加载和播放视频时,浏览器会用Video标签来追踪视频的状态。共有五个状态,分别是:[1]。

Constant Value Description
HAVE_NOTHING 0 没有关于音频/视频是否就绪的信息
HAVE_METADATA 1 音频/视频已初始化
HAVE_CURRENT_DATA 2 数据已经可以播放 (当前位置已经加载) 但没有数据能播放下一帧的内容
HAVE_FUTURE_DATA 3 当前及至少下一帧的数据是可用的 (换句话来说至少有两帧的数据)
HAVE_ENOUGH_DATA 4 可用数据足以开始播放 - 如果网速得到保障 那么视频可以一直播放到底

在视频加载和播放过程中,浏览器Video标签的 readyState 会发生变化。在这个过程中,MP4文件和HLS文件的 duration 变更时机是不同的。

MP4

在 MP4 文件的加载过程中,durationchange 事件会在资源开始加载(loadstart)之后,在元数据已加载(loadedmetadata)之前触发。此时,浏览器会解析 MP4 文件中的 moov box,并获取视频时长。因此,在 durationchange 事件触发时,可以获取到较为准确的 duration 。

HLS

我们发现在加载 HLS 流时,浏览器 video 标签的 duration 会发生多次变更。

第一次变更在loadstart之后 loadedmetadata 之前 并且 readyState === 0 时调用,此时已拿到相对准确的 duration,≈ ffmpeg取到的 durantion。

举个例子,ffmpeg截图如下:

bf7d369e-c421-11ed-bfe3-dac502259ad0.png

第二次变更在loadstart之后 loadedmetadata 之前 并且 readyState === 1 时调用,此时拿到的时长由 m3u8 文件解析得到。

第三次变更在加载到最后一片 ts 时调用。我们发现这三次变更的时长并不一致。因此我们需要在这三次变更中取一个更准确的时长作为视频时长。

举个例子,三次时长比较:

bf8fec9e-c421-11ed-bfe3-dac502259ad0.png

HLS三次取值时长不一致的原因

第一次:在loadstart后loadedmetadata前readyState === 0时调用,视频的实际时长已被解析出来,时机和机制类似于MP4文件(第一次调用时就可以获取到duration的值)。

第二次:在loadstart后loadedmetadata前readyState === 1时调用,hls.js解析完m3u8索引文件并通过#EXTINF计算出视频的实际时长。

举个例子,以下是一个m3u8文件信息:

bfa42916-c421-11ed-bfe3-dac502259ad0.png

第三次:当加载完最后一片ts 此时所有音频和视频帧信息已经可以全部拿到。

举个例子,以下是帧信息:

c01755c6-c421-11ed-bfe3-dac502259ad0.png

c04acae6-c421-11ed-bfe3-dac502259ad0.png

c0a53a08-c421-11ed-bfe3-dac502259ad0.png

c0ba96f0-c421-11ed-bfe3-dac502259ad0.png

best_effort_timestamp_time :媒体流中的一个标识符,用于标识每一帧的时间戳。

pkt_duration_time :媒体流中的一个标识符,用于标识每一帧的持续时间。

通常,best_effort_timestamp_time 和 pkt_duration_time 会用在音视频同步、流量控制、缓存等方面。

尾音频/视频信息中的 best_effort_timestamp_time 和 pkt_duration_time 可用来计算音频/视频的结束时长。在这个案例中,音频结束时长由 best_effort_timestamp_time 和 pkt_duration_time 相加所得(即 96.230300 + 0.023211 = 96.253511),视频结束时长也是如此(即 96.229778 + 0.016667 = 96.246445)。

我们发现,音频结束时长 - 音频首个best_effort_timestamp_time约等于第三次获取的duration。具体来说,音频的结束时间比视频的结束时间长,同时音频的第一个时间戳早于视频的第一个时间戳。为了包含最完整的时间长度,需要将音频和视频时间戳中的最小值和最大值来进行计算。这种情况可能出现在音频和视频的录制或处理过程中,需要进行相应的调整以确保两者之间的同步和一致性。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    2997

    浏览量

    115657
  • javascript
    +关注

    关注

    0

    文章

    525

    浏览量

    55997
  • HLS
    HLS
    +关注

    关注

    1

    文章

    133

    浏览量

    25592

原文标题:在线视频协同:探究画面帧的准确性

文章出处:【微信号:livevideostack,微信公众号:LiveVideoStack】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    确保X光设备检测的有效准确性的关键技巧

    在工业和安全领域,X光设备检测已成为不可或缺的重要环节。然而,许多用户常常面临检测效果不理想、准确性不足的问题,影响生产效率和安全保障。如何确保X光检测设备能够发挥最大效能,准确捕捉目标信息,是当前
    的头像 发表于 11-18 11:27 95次阅读

    电能质量在线监测装置的精度等级对其测量结果的准确性有何影响?

    电能质量在线监测装置的精度等级是衡量其测量结果准确性的 核心量化指标 ,直接决定了测量值与 “真实值” 的偏差范围。精度等级越高(如 A 级),误差限值越严格,测量结果的准确性越高;反之(如 B/C
    的头像 发表于 09-26 17:40 1026次阅读

    电能质量在线监测装置定位谐波源的准确性有多高?

    电能质量在线监测装置定位谐波源的准确性 没有固定数值 ,而是受 “ 监测网络设计、技术参数精度、算法适配、电网工况复杂 ” 四大核心因素影响,呈现 “ 场景化差异 ”—— 在理想条件下(如低压配
    的头像 发表于 09-26 15:20 374次阅读

    电能质量监测中,数据校验系统的准确性如何影响暂态过电压指标?

    在电能质量监测中,暂态过电压的核心监测价值在于 精准捕捉 “短时、突发” 的电压异常特征 (关键指标包括幅值、持续时间、上升时间、波形形态),而数据校验系统的准确性直接决定了这些特征参数的测量可信度
    的头像 发表于 09-25 17:57 505次阅读

    如何保障电能质量监测装置的准确性

    保障电能质量监测装置(以下简称 “装置”)的准确性,需贯穿其 “ 选型→安装→运行维护→校准→报废 ” 全生命周期,核心是通过 “ 源头把控硬件精度、过程规避干扰与退化、定期验证与修正 ”,确保装置
    的头像 发表于 09-23 16:03 485次阅读

    如何保证数据校验系统的时间同步以提高准确性

    在电能质量监测的数据校验系统中, 时间同步的准确性直接决定了多监测点数据的时空一致、暂态事件的时序匹配度,以及校验结果的可信度 。要保证时间同步以提升数据校验准确性,需从 “协议选择、硬件保障
    的头像 发表于 09-19 11:28 333次阅读

    哪些环境因素会对电能质量在线监测装置的校验准确性产生影响?

    电能质量在线监测装置的校验准确性,核心依赖于装置硬件(如采样传感器、模数转换器 ADC、基准源)、信号传输链路及校验标准源的稳定工作。而环境因素通过干扰上述环节的性能,直接或间接导致校验数据偏差
    的头像 发表于 09-18 11:14 472次阅读
    哪些环境因素会对电能质量在线监测装置的校验<b class='flag-5'>准确性</b>产生影响?

    如何确保电能质量在线监测装置的数据校验的准确性

    确保电能质量在线监测装置(以下简称 “监测装置”)数据校验的准确性,需围绕 “ 标准溯源、流程规范、环境控制、数据审核、全周期追溯 ” 五大核心环节,建立全链条管控机制,覆盖校验前准备、校验过程执行
    的头像 发表于 09-18 11:05 386次阅读
    如何确保电能质量在线监测装置的数据校验的<b class='flag-5'>准确性</b>?

    如何使用运行数据趋势分析验证装置准确性

    利用运行数据趋势分析验证电能质量在线监测装置准确性,核心逻辑是 通过长期采集的电网运行数据,判断其趋势是否符合电网实际规律、是否具备稳定性与一致 —— 若装置准确,其输出的数据趋势应与电网工况(如
    的头像 发表于 09-18 10:33 341次阅读
    如何使用运行数据趋势分析验证装置<b class='flag-5'>准确性</b>?

    测缝计测量数据的准确性和校准方法解析

    在结构物安全监测领域,数据准确性是评估工程健康状态的核心依据。振弦式测缝计作为主流裂缝监测设备,其测量精度直接影响裂缝发展趋势的判断。那么如何确保测缝计测量数据的准确性以及如何校准?下面是南京峟思给
    的头像 发表于 07-07 13:56 425次阅读
    测缝计测量数据的<b class='flag-5'>准确性</b>和校准方法解析

    必知!影响手机气密检测准确性的重要因素

    移动设备防水防尘技术升级,手机气密检测成保障产品可靠的关键。但检测准确性受设备精度、环境稳定性、操作规范性及手机结构设计局限等因素干扰,影响测试结果、产品良品率和用户体验。影响手机气密
    的头像 发表于 07-04 14:26 586次阅读
    必知!影响手机气密<b class='flag-5'>性</b>检测<b class='flag-5'>准确性</b>的重要因素

    如何使用POT准确性检查器?

    :95:0.00% 分辨率视觉对象等级挑战 (VOC) 数据集未经英特尔验证。如 Yolo-v4-tf 文档 中所提到,英特尔已使用上下文中常见的对象 (COCO) 数据集验证了准确性。通过
    发表于 03-06 08:04

    如何设置准确性检查器支持的“Input_height”和“Input_width”适配器参数?

    根据准确性检查器 (AC) 工具文档设置input_width并input_height参数在量化过程中遇到此错误: adapter.yolo_v3 specifies unknown options: [\'input_width\', \'input_height\']
    发表于 03-06 07:45

    如何提高OTDR测试的准确性

    OTDR(光时域反射仪)是光缆线路故障定位和光纤特性测量的重要工具,提高OTDR测试的准确性对于确保光缆线路的稳定运行至关重要。以下是一些提高OTDR测试准确性的方法: 一、准确设置OTDR参数
    的头像 发表于 12-31 09:25 1810次阅读

    如何提高电位测量准确性

    在电子工程和物理实验中,电位测量是一项基本而重要的任务。电位测量的准确性直接影响到实验结果的可靠和产品的安全。 1. 选择合适的测量设备 选择合适的测量设备是提高电位测量准确性的第
    的头像 发表于 12-28 13:56 1312次阅读