资讯详情

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

📅 2026/10/19 12:05:35 | 华诺云谱 👁 阅读
Linux Gstreamer深度解析之gst_audio_clock_new调用流程与实战(八十二)
简介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.2读取回调时间并维护单调性4.实战案例4.1准备一个可控的时间回调4.2创建时钟并观察回退行为4.3完整代码5.总结1.前言本篇目的理解gst_audio_clock_new()如何创建基于取时回调的GstAudioClock梳理它与GstClock及音频Source、Sink的关系并通过一个最小示例观察时钟读数和回调失效后的行为。音频设备可以提供自己的播放或采集进度但GStreamer管线使用的是GstClock。GstAudioClock把设备侧的取时逻辑接入GStreamer时钟接口。gst_audio_clock_new()负责创建时钟对象并保存取时回调、用户数据和销毁通知。它不读取设备时间也不启动音频设备实际时间由后续调用回调取得。音频设备或进度状态取时回调gst_audio_clock_new创建GstAudioClockGstClock接口读取时间供音频管线使用2.应用场景和用法2.1音频时钟的使用场景音频时钟的关键作用是把音频侧的时间基准交给GStreamer管线使用。典型场景包括场景回调提供的时间使用目的音频采集Source采集端当前时间或样本进度为采集数据提供时间基准音频播放Sink播放端当前时间或播放进度让管线跟随播放设备时钟自定义音频设备驱动或设备封装层维护的时间将自定义设备时间接入GstClock时间暂时不可用返回GST_CLOCK_TIME_NONE继续使用时钟最近一次报告的时间GstAudioBaseSrc和GstAudioBaseSink都会创建GstAudioClock并分别将自己的取时函数和对象指针作为回调及用户数据传入。具体时间如何计算由这些回调负责。2.2函数原型与返回语义函数原型如下GstClock*gst_audio_clock_new(constgchar*name,GstAudioClockGetTimeFunc func,gpointer user_data,GDestroyNotify destroy_notify);参数或返回值含义name时钟对象名称func读取当前音频时间的回调user_data传递给回调的用户数据destroy_notify对象释放时清理user_data的通知函数可以为NULL返回值新建的GstAudioClock对象以GstClock *类型返回调用者持有完整引用回调类型如下typedefGstClockTime(*GstAudioClockGetTimeFunc)(GstClock*clock,gpointer user_data);GstClockTime以纳秒表示时间。回调返回GST_CLOCK_TIME_NONE时时钟使用最近一次报告的时间。gst_audio_clock_new()会创建GstAudioClock对象并保存回调、用户数据和销毁通知。它不会在构造时调用取时回调。对象返回后调用者需要在使用结束时释放持有的引用对象销毁时如果用户数据和销毁通知都不为空销毁通知会负责清理用户数据。GstClock*clock;clockgst_audio_clock_new(demo-audio-clock,get_audio_time,user_data,destroy_user_data);if(clockNULL)returnFALSE;/* 后续通过GstClock接口读取时钟时间 */gst_object_unref(clock);相邻接口的职责不同接口职责gst_audio_clock_new()创建音频时钟并保存取时回调gst_clock_get_time()通过通用时钟接口读取时钟时间gst_audio_clock_get_time()直接读取回调报告的时间不应用内部偏移gst_audio_clock_reset()更新内部偏移使后续时钟时间从指定时间基准衔接gst_audio_clock_invalidate()回调不再可用时使时钟保持最近一次报告的时间3.调用流程剖析3.1构造对象并保存回调状态gst_audio_clock_new()使用g_object_new()创建GstAudioClock对象并设置名称和GST_CLOCK_TYPE_OTHER类型。GstAudioClock继承自GstSystemClock同时通过类初始化覆盖取内部时间的方法。对象创建后构造函数把func、user_data和destroy_notify保存在对象字段中再将对象作为GstClock *返回。调用者收到的是完整引用负责最终释放。name与取时回调gst_audio_clock_new创建GstAudioClock对象保存func和user_data返回GstClock引用3.2读取回调时间并维护单调性当GStreamer通过时钟接口读取时间时GstAudioClock调用保存的取时函数并把user_data原样传给它。如果回调返回有效时间时钟会应用内部偏移并保证新时间不小于最近一次报告的时间。如果回调返回GST_CLOCK_TIME_NONE时钟直接使用最近一次报告的值。这样设备暂时无法提供进度时管线仍然可以获得稳定的时钟读数。gst_audio_clock_get_time()与gst_clock_get_time()的观察结果不同前者直接读取回调值不应用内部偏移后者走GstClock的内部取时路径会应用偏移并执行单调性保护。有效GST_CLOCK_TIME_NONEGstClock请求时间调用保存的取时回调回调是否返回有效时间应用偏移并限制时间回退沿用最近一次时间返回时钟读数4.实战案例4.1准备一个可控的时间回调案例使用一个简单结构体保存时间和有效标志。回调在时间有效时返回保存的纳秒值在时间无效时返回GST_CLOCK_TIME_NONE。这只是为了观察GstAudioClock的回调约定不模拟真实声卡的播放或采集时钟。4.2创建时钟并观察回退行为程序先将时间设为2秒再通过gst_clock_get_time()读取。随后将回调标记为无效再读取一次。第二次读取时回调返回GST_CLOCK_TIME_NONE时钟应继续返回第一次读取的时间。程序最后释放GstClock引用由销毁通知函数释放回调数据。4.3完整代码#includegst/gst.h#includegst/audio/audio.htypedefstruct{GstClockTime time;gboolean valid;}DemoClockData;/* 为GstAudioClock提供当前时间 */staticGstClockTimedemo_get_audio_time(GstClock*clock,gpointer user_data){DemoClockData*datauser_data;if(!data-valid)returnGST_CLOCK_TIME_NONE;returndata-time;}/* GstAudioClock销毁时释放回调数据 */staticvoiddemo_destroy_clock_data(gpointer user_data){g_free(user_data);}intmain(intargc,char*argv[]){DemoClockData*data;GstClock*clock;GstClockTime first_time;GstClockTime fallback_time;gboolean ok;gst_init(argc,argv);datag_new0(DemoClockData,1);data-time2*GST_SECOND;data-validTRUE;/* 创建音频时钟并把数据清理责任交给destroy_notify */clockgst_audio_clock_new(demo-audio-clock,demo_get_audio_time,data,demo_destroy_clock_data);if(clockNULL){g_free(data);return1;}/* GstClock接口触发取时回调读取当前时间 */first_timegst_clock_get_time(clock);/* 模拟设备暂时无法提供新时间 */data-validFALSE;fallback_timegst_clock_get_time(clock);/* 验证回调失效后继续使用最近一次报告的时间 */okfirst_time2*GST_SECONDfallback_timefirst_time;/* 释放完整引用触发回调数据的销毁通知 */gst_object_unref(clock);returnok?0:1;}5.总结gst_audio_clock_new()就是创建一个由取时回调驱动的GstAudioClock让音频侧时间能够通过GstClock接口供GStreamer管线读取。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑