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

    文章

    2966

    浏览量

    104707
  • javascript
    +关注

    关注

    0

    文章

    516

    浏览量

    53851
  • HLS
    HLS
    +关注

    关注

    1

    文章

    129

    浏览量

    24098

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

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

收藏 人收藏

    评论

    相关推荐

    如何提升ASR模型的准确性

    提升ASR(Automatic Speech Recognition,自动语音识别)模型的准确性是语音识别技术领域的核心挑战之一。以下是一些提升ASR模型准确性的关键方法: 一、优化数据收集与处理
    的头像 发表于 11-18 15:14 757次阅读

    如何维护电流互感器的准确性

    电流互感器是电力系统中不可或缺的组成部分,它们负责将高电流转换为低电流,以便进行测量和保护。为了确保电力系统的稳定运行,电流互感器的准确性至关重要。 1. 电流互感器的工作原理 电流互感器
    的头像 发表于 11-05 09:58 271次阅读

    如何评估 ChatGPT 输出内容的准确性

    评估 ChatGPT 输出内容的准确性是一个复杂的过程,因为它涉及到多个因素,包括但不限于数据的质量和多样、模型的训练、上下文的理解、以及输出内容的逻辑一致。以下是一些评估 ChatGPT 输出
    的头像 发表于 10-25 17:48 576次阅读

    如何保证测长机测量的准确性

    可以通过以下方法保证测长机测量的准确性:一、设备方面1.定期校准按照规定的时间间隔,将测长机送往专业的计量机构或使用标准器进行校准。校准可以确定测长机的测量误差,并对其进行调整,确保测量结果的准确性
    的头像 发表于 10-25 16:16 320次阅读
    如何保证测长机测量的<b class='flag-5'>准确性</b>?

    影响电源纹波测试准确性的因素

    出相应的解决方案。 测试设备的选择 测试设备的选择是影响电源纹波测试准确性的首要因素。测试设备的性能、精度、稳定性等都会对测试结果产生影响。因此,在选择测试设备时,需要考虑以下几个方面: 1.1 测试设备的精度 测试
    的头像 发表于 08-02 09:42 600次阅读

    景区负氧离子监测站的数据准确性如何?

    BK-FZ5景区负氧离子监测站的数据准确性是评估其性能的重要指标之一,其准确性受到多个因素的影响。
    的头像 发表于 07-31 14:41 299次阅读
    景区负氧离子监测站的数据<b class='flag-5'>准确性</b>如何?

    有效提升智能会议系统语音识别准确性案例分享

    。多语言支持的语音识别技术还可以准确识别不同语言和方言,对于夸全球交流的国际会议必不可缺。语音识别准确性对于提升智能会议系统市场核心竞争力的重要由此可见一斑。
    的头像 发表于 06-21 11:15 336次阅读
    有效提升智能会议系统语音识别<b class='flag-5'>准确性</b>案例分享

    有效提升智能会议系统语音识别准确性案例分享

    。多语言支持的语音识别技术还可以准确识别不同语言和方言,对于夸全球交流的国际会议必不可缺。语音识别准确性对于提升智能会议系统市场核心竞争力的重要由此可见一斑。
    的头像 发表于 06-21 11:13 474次阅读
    有效提升智能会议系统语音识别<b class='flag-5'>准确性</b>案例分享

    12芯M16插头数据传输准确性怎样

     德索工程师说道12芯M16插头在数据传输准确性方面表现出色,其设计特点和电气性能确保了数据在传输过程中的稳定性和可靠。以下是对12芯M16插头数据传输准确性的详细分析:   12芯M16
    的头像 发表于 06-17 17:26 336次阅读
    12芯M16插头数据传输<b class='flag-5'>准确性</b>怎样

    8芯M16插头数据传输的准确性

      德索工程师说道8芯M16插头作为高性能连接器,其数据传输的准确性对于整个系统的稳定性和可靠至关重要。以下是对8芯M16插头数据传输准确性的详细分析,结合参考文章中的相关数字和信息进行阐述。
    的头像 发表于 06-14 18:06 314次阅读
    8芯M16插头数据传输的<b class='flag-5'>准确性</b>

    测量时钟信号的探头要求:确保准确性与稳定性

    时钟信号在现代电子系统中起着至关重要的作用。为了准确测量和分析时钟信号,选择合适的探头至关重要。本文将探讨测量时钟信号时探头的要求,包括带宽、阻抗匹配、信号完整和噪声抑制等方面,以确保测量的准确性
    的头像 发表于 04-22 10:44 911次阅读
    测量时钟信号的探头要求:确保<b class='flag-5'>准确性</b>与稳定性

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

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

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

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

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

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

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

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