资讯动态

Linux Gstreamer深度解析之gst_audio_clock_adjust调用流程与实战(八十三)

发布时间:2026/10/19 2:03:34 来源:尧图企业网站定制
简介CSDN博客专家、《Android系统多媒体进阶实战》作者博主新书推荐《Android系统多媒体进阶实战》Android Audio工程师专栏地址Audio工程师进阶系列【原创干货持续更新中……】Android多媒体专栏地址多媒体系统工程师系列【原创干货持续更新中……】专题一 二AAOS车载系统AOSP14系统攻城狮入门视频实战课专题三Android14 Binder之HIDL与AIDL通信实战课专题四Android15快速自定义与集成音效实战课专题五Android15音频策略实战课专题六Android15音频性能实战课(无声/杂音/断音/爆音实战案例)人生格言人生从来没有捷径只有行动才是治疗恐惧和懒惰的唯一良药.更多原创,欢迎关注Android系统攻城狮文章目录1.前言2.应用场景和用法2.1原始音频时间需要连续表示2.2函数原型与返回语义3.调用流程剖析3.1读取偏移并计算返回值3.2BaseSink和BaseSrc使用调整后的时间4.实战案例4.1准备可重置的模拟音频时钟4.2重置时间源并应用偏移4.3完整代码5.总结1.前言本篇目的理解gst_audio_clock_adjust()如何为GstAudioClock的原始时间叠加内部偏移并通过模拟音频时钟重置验证修正前后的时间关系。GstAudioClock可以通过回调读取音频设备或音频处理链提供的时间。设备重启后回调返回的原始时间可能从较小的值重新开始但GStreamer时钟需要保持连续。gst_audio_clock_adjust()读取时钟当前保存的time_offset将其加到传入时间上并返回结果。它不更新偏移、不调用时间回调也不负责保证输出单调递增。回调提供原始时间gst_audio_clock_adjustGstAudioClock保存time_offset返回叠加偏移后的时间2.应用场景和用法2.1原始音频时间需要连续表示gst_audio_clock_adjust()适合在原始音频时间需要映射到连续时钟时间时使用。偏移由gst_audio_clock_reset()设置调整函数只负责应用这个偏移。场景输入时间调整结果音频设备计时值重新从零开始设备回调返回的新时间加上重置时设置的偏移维持时间连续BaseSink进行时钟同步GstAudioClock回调读取的时间使用带偏移的内部音频时间参与校准BaseSrc生成Buffer时间戳当前音频时间加上偏移后再结合元素base_time处理独立读取原始时钟原始时间不调用调整函数保留回调的原始值这个函数本身只做加法。它不检查设备是否重启不判断输入时间是否有效也不限制结果必须递增。调用方需要提供有效的时间并根据实际时钟流程决定是否应用偏移。2.2函数原型与返回语义函数原型如下GstClockTimegst_audio_clock_adjust(GstAudioClock*clock,GstClockTime time);参数或返回值含义clock已创建并初始化的GstAudioClocktime需要调整的时间值返回值time clock-time_offset最小调用如下GstClockTime adjusted_time;adjusted_timegst_audio_clock_adjust(audio_clock,raw_time);调用前GstAudioClock需要有当前偏移。偏移通常由gst_audio_clock_reset()设置。调用后原始time和时钟对象状态都不变结果通过返回值交给调用者。相邻接口职责不同接口职责gst_audio_clock_new()创建时钟并设置读取时间的回调gst_audio_clock_get_time()读取回调提供的原始时间不应用内部偏移gst_audio_clock_reset()根据最近返回时间和目标时间更新内部偏移gst_audio_clock_adjust()将当前偏移加到调用者提供的时间上gst_clock_get_time()读取时钟内部时间GstAudioClock会在内部应用偏移并保持返回值不回退3.调用流程剖析3.1读取偏移并计算返回值gst_audio_clock_adjust()的实现只读取clock-time_offset并执行加法GstClockTimegst_audio_clock_adjust(GstAudioClock*clock,GstClockTime time){GstClockTime result;resulttimeclock-time_offset;returnresult;}计算关系为返回时间 输入时间 GstAudioClock当前偏移偏移不是由本函数计算的。gst_audio_clock_reset()会比较时钟的last_time和目标时间并据此更新time_offset。当音频时间源重新计时后这个偏移可将新计时段映射到原有时间线上。传入time读取time_offset并相加读取GstAudioClock偏移返回调整后的时间它与GstAudioClock内部读取时钟的路径需要区分。gst_audio_clock_get_time()直接调用时间回调返回原始时间gst_clock_get_time()进入GstAudioClock的内部时间实现在应用偏移后还会检查结果是否低于last_time。gst_audio_clock_adjust()只执行偏移加法不执行单调性检查。3.2BaseSink和BaseSrc使用调整后的时间GstAudioBaseSink在时钟校准和同步逻辑中会先通过gst_audio_clock_get_time()读取提供时钟的原始时间再调用gst_audio_clock_adjust()应用偏移。调整后的内部时间会与外部时钟时间进行比较供同步算法使用。GstAudioBaseSrc生成Buffer时间戳时如果RingBuffer没有提供时间戳且当前处理路径需要使用音频时钟时间也会将时间交给gst_audio_clock_adjust()。随后BaseSrc再结合元素base_time处理时间戳。音频时钟回调读取原始时间gst_audio_clock_adjust应用偏移BaseSink时钟校准或BaseSrc时间戳处理因此不能把gst_audio_clock_adjust()理解成时钟读取接口。它不会调用回调也不会修改时钟偏移它只转换已经得到的时间值。4.实战案例4.1准备可重置的模拟音频时钟案例创建一个GstAudioClock回调从结构体中读取模拟的原始时间。先让原始时间到达8秒并通过gst_clock_get_time()更新时钟的last_time再模拟设备计时归零。重置时把目标时间设为0。由于此前时钟已经到达8秒gst_audio_clock_reset()会设置相应偏移。随后模拟设备运行到1秒调整后的时间应为9秒。4.2重置时间源并应用偏移核心操作如下/* 先通过GstClock读取路径记录8秒时钟时间 */before_resetgst_clock_get_time(GST_CLOCK(audio_clock));/* 模拟设备重启后其原始计时归零 */clock_data.raw_time0;gst_audio_clock_reset(audio_clock,0);/* 模拟新计时段走到1秒并应用内部偏移 */clock_data.raw_timeGST_SECOND;adjusted_timegst_audio_clock_adjust(audio_clock,clock_data.raw_time);这里gst_audio_clock_reset()负责更新偏移gst_audio_clock_adjust()负责使用偏移。两者不会合并成一次操作。4.3完整代码#includegst/gst.h#includegst/audio/audio.htypedefstruct{GstClockTime raw_time;}DemoClockData;/* 模拟音频设备提供原始计时值 */staticGstClockTimedemo_get_time(GstClock*clock,gpointer user_data){DemoClockData*clock_datauser_data;returnclock_data-raw_time;}intmain(intargc,char*argv[]){DemoClockData clock_data;GstAudioClock*audio_clock;GstClockTime before_reset;GstClockTime adjusted_time;GstClockTime reported_time;gst_init(argc,argv);/* 初始化回调使用的原始时间 */clock_data.raw_time8*GST_SECOND;/* 创建音频时钟回调读取clock_data中的时间 */audio_clockGST_AUDIO_CLOCK(gst_audio_clock_new(demo-audio-clock,demo_get_time,clock_data,NULL));/* 通过GstClock内部读取路径记录last_time */before_resetgst_clock_get_time(GST_CLOCK(audio_clock));g_assert(before_reset8*GST_SECOND);/* 模拟底层设备重启原始计时从零开始 */clock_data.raw_time0;gst_audio_clock_reset(audio_clock,0);/* 新计时段到达1秒目标接口只负责叠加内部偏移 */clock_data.raw_timeGST_SECOND;adjusted_timegst_audio_clock_adjust(audio_clock,clock_data.raw_time);g_assert(adjusted_time9*GST_SECOND);/* 检查GstAudioClock内部时间路径也返回连续时间 */reported_timegst_clock_get_time(GST_CLOCK(audio_clock));g_assert(reported_time9*GST_SECOND);gst_object_unref(audio_clock);return0;}5.总结gst_audio_clock_adjust()就是将GstAudioClock保存的时间偏移加到输入时间上并返回结果本身不读取时钟回调、不修改偏移也不保证单调性。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑