当前位置:首页 > 实用技巧 >

什么叫同步音频(啥是同步录音)

来源:原点资讯(www.yd166.com)时间:2023-12-09 01:01:38作者:YD166手机阅读>>

面试官: 谈下音视频同步原理,音频和视频能绝对同步吗

心理分析:音视频同步本身比较难,一般使用ijkplayer 第三方做音视频同步。不排除有视频直播 视频通话需要用音视频同步,可以从三种 音频为准 视频为准 自定义时钟为准三种方式实现音视频同步

**求职者: **如果被问到 放正心态,能回答多少是多少。如果你看了这篇文章肯定是可以回答上的

音视频的直播系统是一个复杂的工程系统,要做到非常低延迟的直播,需要复杂的系统工程优化和对各组件非常熟悉的掌握。下面整理几个简单常用的调优技巧:

以fflay来看音视频同步流程

ffplay中将视频同步到音频的主要方案是,如果视频播放过快,则重复播放上一帧,以等待音频;如果视频播放过慢,则丢帧追赶音频。

这一部分的逻辑实现在视频输出函数video_refresh中,分析代码前,我们先来回顾下这个函数的流程图:

什么叫同步音频,啥是同步录音(1)

在这个流程中,“计算上一帧显示时长”这一步骤至关重要。先来看下代码:

static void video_refresh(void *opaque, double *remaining_time) { //…… //lastvp上一帧,vp当前帧 ,nextvp下一帧 last_duration = vp_duration(is, lastvp, vp);//计算上一帧的持续时长 delay = compute_target_delay(last_duration, is);//参考audio clock计算上一帧真正的持续时长 time= av_gettime_relative()/1000000.0;//取系统时刻 if (time < is->frame_timer delay) {//如果上一帧显示时长未满,重复显示上一帧 *remaining_time = FFMIN(is->frame_timer delay - time, *remaining_time); goto display; } is->frame_timer = delay;//frame_timer更新为上一帧结束时刻,也是当前帧开始时刻 if (delay > 0 && time - is->frame_timer > AV_SYNC_THRESHOLD_MAX) is->frame_timer = time;//如果与系统时间的偏离太大,则修正为系统时间 //更新video clock //视频同步音频时没作用 SDL_LockMutex(is->pictq.mutex); if (!isnan(vp->pts)) update_video_pts(is, vp->pts, vp->pos, vp->serial); SDL_UnlockMutex(is->pictq.mutex); //…… //丢帧逻辑 if (frame_queue_nb_remaining(&is->pictq) > 1) { Frame *nextvp = frame_queue_peek_next(&is->pictq); duration = vp_duration(is, vp, nextvp);//当前帧显示时长 if(time > is->frame_timer duration){//如果系统时间已经大于当前帧,则丢弃当前帧 is->frame_drops_late ; frame_queue_next(&is->pictq); goto retry;//回到函数开始位置,继续重试(这里不能直接while丢帧,因为很可能audio clock重新对时了,这样delay值需要重新计算) } } }

这段代码的逻辑在上述流程图中有包含。主要思路就是一开始提到的如果视频播放过快,则重复播放上一帧,以等待音频;如果视频播放过慢,则丢帧追赶音频。实现的方式是,参考audio clock,计算上一帧(在屏幕上的那个画面)还应显示多久(含帧本身时长),然后与系统时刻对比,是否该显示下一帧了。

这里与系统时刻的对比,引入了另一个概念——frame_timer。可以理解为帧显示时刻,如更新前,是上一帧的显示时刻;对于更新后(is->frame_timer = delay),则为当前帧显示时刻。

上一帧显示时刻加上delay(还应显示多久(含帧本身时长))即为上一帧应结束显示的时刻。具体原理看如下示意图:

什么叫同步音频,啥是同步录音(2)

这里给出了3种情况的示意图:

  • time1:系统时刻小于lastvp结束显示的时刻(frame_timer dealy),即虚线圆圈位置。此时应该继续显示lastvp
  • time2:系统时刻大于lastvp的结束显示时刻,但小于vp的结束显示时刻(vp的显示时间开始于虚线圆圈,结束于黑色圆圈)。此时既不重复显示lastvp,也不丢弃vp,即应显示vp
  • time3:系统时刻大于vp结束显示时刻(黑色圆圈位置,也是nextvp预计的开始显示时刻)。此时应该丢弃vp。

相关视频推荐

学习地址:

需要更多ffmpeg/webrtc..音视频流媒体开发学习资料加群812855908领取

什么叫同步音频,啥是同步录音(3)

delay的计算

那么接下来就要看最关键的lastvp的显示时长delay是如何计算的。

这在函数compute_target_delay中实现:

static double compute_target_delay(double delay, VideoState *is) { double sync_threshold, diff = 0; /* update delay to follow master synchronisation source */ if (get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER) { /* if video is slave, we try to correct big delays by duplicating or deleting a frame */ diff = get_clock(&is->vidclk) - get_master_clock(is); /* skip or repeat frame. We take into account the delay to compute the threshold. I still don't know if it is the best guess */ sync_threshold = FFMAX(AV_SYNC_THRESHOLD_MIN, FFMIN(AV_SYNC_THRESHOLD_MAX, delay)); if (!isnan(diff) && fabs(diff) < is->max_frame_duration) { if (diff <= -sync_threshold) delay = FFMAX(0, delay diff); else if (diff >= sync_threshold && delay > AV_SYNC_FRAMEDUP_THRESHOLD) delay = delay diff; else if (diff >= sync_threshold) delay = 2 * delay; } } av_log(NULL, AV_LOG_TRACE, "video: delay=%0.3f A-V=%f\n", delay, -diff); return delay; }

上面代码中的注释全部是源码的注释,代码不长,注释占了快一半,可见这段代码重要性。

这段代码中最难理解的是sync_threshold,画个图帮助理解:

什么叫同步音频,啥是同步录音(4)

图中坐标轴是diff值大小,diff为0表示video clock与audio clock完全相同,完美同步。图纸下方色块,表示要返回的值,色块值的delay指传入参数,结合上一节代码,即lastvp的显示时长。

从图上可以看出来sync_threshold是建立一块区域,在这块区域内无需调整lastvp的显示时长,直接返回delay即可。也就是在这块区域内认为是准同步的。

如果小于-sync_threshold,那就是视频播放较慢,需要适当丢帧。具体是返回一个最大为0的值。根据前面frame_timer的图,至少应更新画面为vp。

如果大于sync_threshold,那么视频播放太快,需要适当重复显示lastvp。具体是返回2倍的delay,也就是2倍的lastvp显示时长,也就是让lastvp再显示一帧。

如果不仅大于sync_threshold,而且超过了AV_SYNC_FRAMEDUP_THRESHOLD,那么返回delay diff,由具体diff决定还要显示多久(这里不是很明白代码意图,按我理解,统一处理为返回2*delay,或者delay diff即可,没有区分的必要)

至此,基本上分析完了视频同步音频的过程,简单总结下:

  • 基本策略是:如果视频播放过快,则重复播放上一帧,以等待音频;
  • 如果视频播放过慢,则丢帧追赶音频。
  • 这一策略的实现方式是:引入frame_timer概念,标记帧的显示时刻和应结束显示的时刻,再与系统时刻对比,决定重复还是丢帧。
  • lastvp的应结束显示的时刻,除了考虑这一帧本身的显示时长,还应考虑了video clock与audio clock的差值。
  • 并不是每时每刻都在同步,而是有一个“准同步”的差值区域。

栏目热文

同步听类似软件(同步听app下载)

同步听类似软件(同步听app下载)

对于学习英语的朋友来说,外刊真的是很重要的英语素材,四六级、考研的部分真题都源于外刊。而且在外刊阅读中背单词、培养语感、...

2023-12-09 00:37:49查看全文 >>

同步学习助手听录音(可以同步学习免费的软件)

同步学习助手听录音(可以同步学习免费的软件)

今天我要跟大家聊一聊录音实时转写软件。你有没有试过在会议、讲座或者采访中,想要记录下重要的信息,但手速总是赶不上发言的速...

2023-12-09 01:05:03查看全文 >>

同步听连接成功还是没声音(同步听声音卡顿怎么解决)

同步听连接成功还是没声音(同步听声音卡顿怎么解决)

如何使歌曲与演唱声音同步呢?首先,打开A.E,导入一个视频或图片作为背景。将图片放大并垫底,用文本工具打上对应歌词,然后...

2023-12-09 00:53:07查看全文 >>

同步听官网是多少(同步听app下载安卓)

同步听官网是多少(同步听app下载安卓)

来源:交汇点新闻客户端交汇点讯 4月17日,由江苏省委网信办、新华报业传媒集团主办,交汇点新闻承办的“听·见小康”大型融...

2023-12-09 01:07:49查看全文 >>

车辆变更申请表在哪里(车辆变更申请表编号在哪里获取)

车辆变更申请表在哪里(车辆变更申请表编号在哪里获取)

如何申请机动车变更登记机动车所有人应当于变更后十日内向车辆管理所申请变更登记,填写《机动车变更登记/备案申请表》,提交身...

2023-12-09 00:32:26查看全文 >>

波特五力模型的五种基本力(简述波特五力模型的五种竞争力量)

波特五力模型的五种基本力(简述波特五力模型的五种竞争力量)

波特五力模型是迈克尔·波特(Michael Porter)提出的。波特五力模型五个特点竞争力是供应商讨价还价的能力、购买...

2023-12-09 00:44:38查看全文 >>

波特五力模型是哪五种力量(波特五力模型分别代表什么)

波特五力模型是哪五种力量(波特五力模型分别代表什么)

五力模型又称为“波特五力模型”,20世纪80年代初,一位叫做迈克尔波特的战略管理学家提出了五力模型。五力模型的特点:五力...

2023-12-09 01:05:22查看全文 >>

波特五力模型包括哪些方面(波特五力模型用来分析什么的)

波特五力模型包括哪些方面(波特五力模型用来分析什么的)

最近看到多家媒体报道:格力成立了一家餐饮管理公司,其经营范围包含了外卖递送服务、食品互联网销售等。其商业目的不言而喻,格...

2023-12-09 01:18:10查看全文 >>

波特的五种竞争力量模型包括(波特五力竞争模型是指)

波特的五种竞争力量模型包括(波特五力竞争模型是指)

波特“5力”模型,五种力量分别为:①同行业内现有竞争者的竞争能力②潜在竞争者进入的能力③替代品的替代能力④供应商的讨价...

2023-12-09 01:19:01查看全文 >>

波特五力模型不包括啥(波特五力模型属于内部还是外部)

波特五力模型不包括啥(波特五力模型属于内部还是外部)

超星慕课尔雅商业计划书制作与演示答案,章节测验答案课后习题答案1.11【多选题】商业计划书制作与演示课程的目标(ABD)...

2023-12-09 00:38:30查看全文 >>

文档排行