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
    +关注

    关注

    19

    文章

    2904

    浏览量

    103008
  • javascript
    +关注

    关注

    0

    文章

    511

    浏览量

    53408
  • HLS
    HLS
    +关注

    关注

    1

    文章

    126

    浏览量

    23686

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

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

收藏 人收藏

    评论

    相关推荐

    Know Labs无创连续血糖监测仪在临床研究中显示高准确性

    Know Labs首次进行有糖尿病患者参与,将其静脉血作为参照的无创连续血糖监测仪临床研究,证明了其专有传感器的高准确性和医学应用潜力。
    的头像 发表于 03-14 10:45 1362次阅读
    Know Labs无创连续血糖监测仪在临床研究中显示高<b class='flag-5'>准确性</b>

    电流探头测试小技巧:提高准确性和安全性

    电流探头是一种常用的测试工具,用于测量电路中的电流。正确使用电流探头可以提高测试的准确性,并确保操作的安全性。本文将介绍一些电流探头的测试小技巧,帮助您更好地使用电流探头进行电流测量。 技巧一:正确
    的头像 发表于 03-08 09:31 95次阅读
    电流探头测试小技巧:提高<b class='flag-5'>准确性</b>和安全性

    FLOEFD T3STER 自动校准模块——提高电子产品散热设计的准确性

    西门子工业数字软件FLOEFDT3STER自动校准模块——提高电子产品散热设计的准确性实现封装热模型结温的高精度预测(在某些情况下可实现超过99.5%的准确度)。克服传统手动校准的耗时难题
    的头像 发表于 03-06 08:34 149次阅读
    FLOEFD T3STER 自动校准模块——提高电子产品散热设计的<b class='flag-5'>准确性</b>

    FLOEFD T3STER自动校准模块—提高电子产品散热设计的准确性

    西门子工业数字软件FLOEFD T3STER 自动校准模块——提高电子产品散热设计的准确性
    的头像 发表于 02-21 10:10 191次阅读
    FLOEFD T3STER自动校准模块—提高电子产品散热设计的<b class='flag-5'>准确性</b>

    使用示波器探头是否会改变被测试信号的准确性

    使用示波器探头是否会改变被测试信号的准确性? 使用示波器探头可能会对被测试信号的准确性产生一定的影响。在本文中,我将详细探讨这种影响的原因、示波器探头的工作原理以及如何最小化这种影响。 首先,我们
    的头像 发表于 01-08 11:42 264次阅读

    AD2S1210修改寄存器中的阈值对位置码值的准确性会有影响吗?

    AD2S1210中有很多故障阈值设置的地方,比如DOS超量程、LOS上下限等等,这些阈值都可以在寄存器中设置。我们在使用时没有修改过这些阈值,但发现经常报故障,但位置码值也能采回来。 我的问题是:修改寄存器中的阈值对位置码值的准确性会有影响吗?修改阈值后采样到的位置码值和真是位置的误差会变化吗?
    发表于 12-18 07:31

    怎样测试电流探头的准确性以及保证其精准性

    随着科技的不断发展,电流探头的应用范围越来越广泛。在各种电子产品的设计和生产过程中,电流探头的准确性对于检测和测量电流显得尤为重要。那么,怎样测试电流探头的准确性以及保证其精准性呢? 首先,我们需要
    的头像 发表于 12-14 10:49 261次阅读
    怎样测试电流探头的<b class='flag-5'>准确性</b>以及保证其精准性

    如何确保填报数据的准确性和可靠?#数据填报 #光点科技

    数据
    光点科技
    发布于 :2023年10月08日 09:39:47

    如何确保数据填报的准确性?#数据填报 #光点科技

    数据
    光点科技
    发布于 :2023年08月02日 10:01:19

    如何提高数据填报的准确性?#数据填报 #光点科技

    数据
    光点科技
    发布于 :2023年07月28日 12:09:16

    提高光缆线路故障定位准确性的方法

    首先、要了解仪表如何使用,掌握仪表的使用方法,有助于准确测量。 1、设置好OTDR的参数。使用OTDR测试时,必须先进行仪表参数设定,其中Z主要是设定测试光纤的折射率和测试波长。只有准确地设置
    的头像 发表于 07-24 09:51 313次阅读

    水雨情远传系统——提高防洪准确性

    我国每年都会遭受不同程度的洪涝灾害,建立自动化的水雨情远传系统,可以提高洪水预警准确性,为防洪抢险提供科学依据。 一、系统构成 水雨情远传系统主要包含以下组件: 1)检测设备:采集降雨、水位等参数
    的头像 发表于 07-13 15:11 181次阅读
    水雨情远传系统——提高防洪<b class='flag-5'>准确性</b>

    提升效率与准确性——RFID电商仓储管理系统的优势

    随着电商行业的蓬勃发展,仓储管理变得愈发重要。RFID(射频识别)技术为电商仓储管理带来了突破性的进展。本文将介绍RFID电商仓储管理系统的工作原理和优势,并探讨如何通过该系统提高仓储效率和准确性,为您的电商业务带来更多机遇。
    的头像 发表于 07-03 15:50 308次阅读
    提升效率与<b class='flag-5'>准确性</b>——RFID电商仓储管理系统的优势

    拉力试验机夹具的重要性:如何确保测试的准确性和可靠性?

    拉力试验机夹具的初始距离、材质、规格、定制、种类、厂家等因素都对测试的准确性和可靠性具有重要影响。在使用拉力试验机夹具时,需要根据被测物体的特性和测试要求,选择合适的夹具,确保测试的准确性和可靠性。
    的头像 发表于 06-27 13:37 514次阅读
    拉力试验机夹具的重要性:如何确保测试的<b class='flag-5'>准确性</b>和可靠性?

    KEAZN64内部温度传感器之间存在5.5摄氏度的差异,如何判断准确性

    。我们由此计算出的值为 34 摄氏度。 内部温度传感器和外部 (NTC) 传感器之间存在 5.5 摄氏度的差异。 我们如何判断准确性
    发表于 05-05 09:21