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

发布时间:2026/10/20 2:09:53
Linux Gstreamer深度解析之gst_audio_clock_get_time调用流程与实战(八十四)
简介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音频后端与GstClock的关系4.实战案例4.1创建可控时间回调4.2修改回调时间并再次读取4.3完整代码5.总结1.前言本篇目的理解gst_audio_clock_get_time()如何读取GstAudioClock时间回调的原始结果并区分它与GstClock内部时间调整的职责。音频时钟的当前时间可能来自设备已播放的样本位置或其他音频后端状态。GstAudioClock通过创建时传入的回调读取这个时间。gst_audio_clock_get_time()直接调用该回调并返回原始时间值。它不应用时钟偏移也不在这个接口中强制时间单调递增。音频后端时间状态GstAudioClock时间回调gst_audio_clock_get_time返回回调原始时间GstClock内部时间路径应用偏移并保持时间单调2.应用场景和用法2.1读取音频时钟原始时间这个接口适合读取GstAudioClock时间回调当前返回的值例如排查音频后端报告的播放位置。它不等同于gst_clock_get_time()后者通过GstClock的内部时间路径读取时间会应用GstAudioClock的偏移并保证内部时间单调递增。直接调用gst_audio_clock_get_time()可以观察未应用偏移的回调时间。2.2函数原型与返回语义GstClockTimegst_audio_clock_get_time(GstAudioClock*clock);clock必须是有效的GstAudioClock对象。函数返回时间回调给出的GstClockTime。如果回调返回GST_CLOCK_TIME_NONE该接口会使用上次内部时间换算回回调时间域的值。函数本身不提供独立的错误码也不检查回调返回的时间是否递增。它与相邻接口的职责如下接口职责gst_audio_clock_new()创建音频时钟并登记时间回调gst_audio_clock_get_time()读取未应用偏移的回调时间gst_clock_get_time()读取GstClock内部时间gst_audio_clock_reset()根据新的回调时间基准更新偏移gst_audio_clock_adjust()将给定时间加上当前偏移3.调用流程剖析3.1直接调用回调并处理无效时间实现会从GstAudioClock对象中取得回调和user_data直接调用回调函数resultclock-func(GST_CLOCK_CAST(clock),clock-user_data);if(resultGST_CLOCK_TIME_NONE)resultclock-last_time-clock-time_offset;returnresult;回调返回有效时间时函数直接返回该值不修改last_time也不把time_offset加到结果上。回调返回GST_CLOCK_TIME_NONE时函数使用内部保存的时间与偏移计算回调时间域中的备用值。常规GstClock内部时间读取则走另一个路径调用同一时间回调应用偏移再检查结果是否大于last_time。3.2音频后端与GstClock的关系GstAudioClock的时间回调由创建者提供。回调如何读取设备进度、是否访问驱动状态取决于具体音频后端。GstAudioBaseSink使用提供的音频时钟参与播放同步。需要检查未校正的音频时间时可以读取回调原始值需要获取管线时钟域中的时间时应使用GstClock接口。4.实战案例4.1创建可控时间回调案例用一个可修改的GstClockTime模拟音频后端时间。调用gst_audio_clock_get_time()后检查结果是否等于回调当前返回的时间。该示例只验证时间回调读取不模拟真实声卡时钟。4.2修改回调时间并再次读取将模拟时间从3秒改为4秒再次调用接口。返回值应跟随回调的新值。这说明接口读取的是当前回调结果而不是在第一次调用时缓存时间。4.3完整代码#includegst/gst.h#includegst/audio/audio.hstaticGstClockTimeread_test_audio_time(GstClock*clock,gpointer user_data){GstClockTime*test_timeuser_data;/* 返回模拟音频后端当前报告的时间 */return*test_time;}intmain(intargc,char*argv[]){GstClockTime test_time;GstClockTime current_time;GstClock*clock;gst_init(argc,argv);test_time3*GST_SECOND;clockgst_audio_clock_new(test-audio-clock,read_test_audio_time,test_time,NULL);/* 直接读取回调时间不应用GstAudioClock的偏移 */current_timegst_audio_clock_get_time(GST_AUDIO_CLOCK(clock));g_assert(current_timetest_time);/* 改变后端时间下一次查询读取新的回调值 */test_time4*GST_SECOND;current_timegst_audio_clock_get_time(GST_AUDIO_CLOCK(clock));g_assert(current_timetest_time);gst_object_unref(clock);return0;}5.总结gst_audio_clock_get_time()直接读取GstAudioClock回调时间并返回未应用偏移的结果。