资讯动态

Linux Gstreamer深度解析之gst_buffer_add_audio_clipping_meta调用流程与实战(九十)

发布时间:2026/10/23 4:56:36 来源:尧图企业网站定制
简介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验证格式并创建Meta实例3.2裁剪Meta随Buffer传递4.实战案例4.1准备带音频数据的Buffer4.2添加Meta并重新查询4.3完整代码5.总结1.前言本篇目的理解gst_buffer_add_audio_clipping_meta()如何把音频裁剪信息附加到GstBuffer分析Meta字段的含义和处理边界并通过代码验证Buffer携带的裁剪样本数。压缩音频的首帧可能包含编码器或解码器延迟产生的无效样本末帧也可能带有用于填满编码帧的尾部填充。单靠Buffer字节长度无法表达这些样本应当从首尾裁掉多少。gst_buffer_add_audio_clipping_meta()把裁剪格式、起始裁剪量和结束裁剪量记录为GstAudioClippingMeta。它只附加元数据不会删除音频字节、修改Buffer时长也不会自动执行裁剪。包含延迟或填充的音频Buffer裁剪单位和首尾样本数gst_buffer_add_audio_clipping_metaBuffer携带GstAudioClippingMeta后续元素读取并处理裁剪信息2.应用场景和用法2.1描述压缩音频的首尾裁剪GstAudioClippingMeta适合在不改动Buffer数据的情况下随Buffer传递需要裁掉的首尾音频量。场景写入的信息后续作用解码器输出包含前置延迟记录起始裁剪量下游排除开头无效样本编码末帧包含填充记录结束裁剪量下游还原有效音频长度容器Demuxer输出数据根据容器时间或样本边界计算首尾裁剪量支持精确时长和无缝拼接多段压缩音频拼接保留每段边界上的裁剪信息避免延迟与填充成为可听内容gst_buffer_add_audio_clipping_meta()只保存描述值。实际消费者需要读取Meta并结合其format解释start和end。当使用GST_FORMAT_DEFAULT时这两个数值表示样本数。2.2函数原型与返回语义函数原型如下GstAudioClippingMeta*gst_buffer_add_audio_clipping_meta(GstBuffer*buffer,GstFormat format,guint64 start,guint64 end);参数或返回值含义buffer要附加Meta的Buffer必须允许修改formatstart和end使用的单位不能是GST_FORMAT_UNDEFINEDstart从Buffer开头裁掉的量end从Buffer结尾裁掉的量返回值附加到Buffer上的Meta实例由Buffer持有实现只检查format不是GST_FORMAT_UNDEFINED然后通过gst_buffer_add_meta()创建Meta实例并写入三个字段。它不检查裁剪量是否超过Buffer中的有效样本数也不会修改Buffer的时长和数据。调用者无需单独释放返回的GstAudioClippingMeta。释放其所属的GstBuffer时Meta也会随之释放。读取已有裁剪信息使用gst_buffer_get_audio_clipping_meta()。3.调用流程剖析3.1验证格式并创建Meta实例函数首先检查format。如果格式是GST_FORMAT_UNDEFINED就返回NULL。格式有效时函数通过GST_AUDIO_CLIPPING_META_INFO取得Meta类型描述并调用gst_buffer_add_meta()向Buffer添加实例。新实例初始化时Meta回调先把格式设为GST_FORMAT_UNDEFINED、首尾裁剪量设为0。添加函数随后覆盖这些默认值写入调用者传入的format、start和end最后返回实例指针。否是传入Buffer和裁剪参数format是否有效返回空指针按AudioClippingMeta描述添加实例写入format start end返回Buffer持有的Meta指针3.2裁剪Meta随Buffer传递这个Meta描述裁剪意图真正如何处理取决于下游元素。容器Demuxer可以根据编码延迟或末尾填充计算裁剪样本数再将它们附加到输出Buffer。其他元素读取Meta后可以据此调整有效样本范围或时长。Meta的复制回调支持整Buffer复制并把相同的format、start和end添加到目标Buffer。对Buffer区域进行局部复制时当前实现返回失败它也没有自动换算重采样后的裁剪量。因此裁剪Meta不能被当作已经修改音频数据的标记。4.实战案例4.1准备带音频数据的Buffer案例创建一个4096字节的测试Buffer并把裁剪单位设为GST_FORMAT_DEFAULT。本例登记开头120个样本和结尾80个样本需要裁掉。4.2添加Meta并重新查询程序调用gst_buffer_add_audio_clipping_meta()后再通过gst_buffer_get_audio_clipping_meta()读取同一个Buffer上的Meta实例。验证字段值只说明裁剪描述成功附加不代表Buffer字节已经被裁剪。4.3完整代码#includegst/gst.h#includegst/audio/audio.hintmain(intargc,char*argv[]){GstBuffer*buffer;GstAudioClippingMeta*clipping_meta;guint64 start120;guint64 end80;intresult1;gst_init(argc,argv);/* 创建测试Buffer数据内容不由裁剪Meta自动修改 */buffergst_buffer_new_allocate(NULL,4096,NULL);if(bufferNULL)return1;/* 将首尾裁剪量按样本数记录到Buffer */clipping_metagst_buffer_add_audio_clipping_meta(buffer,GST_FORMAT_DEFAULT,start,end);if(clipping_metaNULL)gotodone;/* 从Buffer取回Meta检查单位和首尾裁剪值 */clipping_metagst_buffer_get_audio_clipping_meta(buffer);if(clipping_meta!NULLclipping_meta-formatGST_FORMAT_DEFAULTclipping_meta-startstartclipping_meta-endend)result0;done:gst_buffer_unref(buffer);returnresult;}5.总结gst_buffer_add_audio_clipping_meta()把裁剪单位和首尾裁剪量附加到GstBuffer供后续元素解释处理但不会自行修改Buffer数据或时长。

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

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

免费获取报价 →
↑