Linux PipeWire深度解析之pw_stream_dequeue_buffer调用流程与实战(八十一)
简介CSDN博客专家、《Android系统多媒体进阶实战》作者博主新书推荐《Android系统多媒体进阶实战》Android Audio工程师专栏地址Audio工程师进阶系列【原创干货持续更新中……】Android多媒体专栏地址多媒体系统工程师系列【原创干货持续更新中……】专题一 二AAOS车载系统AOSP14系统攻城狮入门视频实战课专题三Android14 Binder之HIDL与AIDL通信实战课专题四Android15快速自定义与集成音效实战课专题五Android15音频策略实战课专题六Android15音频性能实战课(无声/杂音/断音/爆音实战案例)人生格言人生从来没有捷径只有行动才是治疗恐惧和懒惰的唯一良药.更多原创,欢迎关注Android系统攻城狮文章目录1.前言要点概括2.应用场景与用法函数原型参数说明返回值应用场景3.调用流程剖析3.1核心步骤3.2调用流程图3.3生命周期图4.实战应用案例5.一句话总结1.前言本篇目的Linux PipeWire深度解析之pw_stream_dequeue_buffer调用流程与实战。要点概括核心功能从PipeWireStream的Buffer队列中取出一个当前周期可处理的pw_buffer。工作机制Stream完成格式协商和Buffer协商后PipeWire在process回调中通知应用处理数据应用通过该函数取出Buffer读写完成后再归还。典型用途播放流填充PCM数据、录音流读取PCM数据、视频帧处理、低延迟媒体链路中的Buffer周转。pw_stream_dequeue_buffer的本质是“取Buffer”不是“创建Buffer”。Buffer的分配、映射、数量和格式在Stream连接与协商阶段完成该函数只是在运行阶段把可用Buffer交给应用侧处理。它也不是“播放函数”或“录音函数”。同一个接口在播放流和录音流中语义不同播放流中取到的是待填充Buffer录音流中取到的是已包含采集数据的Buffer。它通常和pw_stream_queue_buffer配套使用。pw_stream_dequeue_buffer负责取出Bufferpw_stream_queue_buffer负责把Buffer交还给PipeWire。只dequeue不queue会导致可用Buffer耗尽最终引起卡顿或数据流停滞。2.应用场景与用法pw_stream_dequeue_buffer是PipeWireStream API中用于从Stream队列取出可用Buffer的接口。它位于PipeWire客户端数据处理路径中。应用创建pw_stream并连接到PipeWireGraph后PipeWire会为该Stream协商媒体格式和Buffer。运行时Graph调度触发process回调应用在回调中调用pw_stream_dequeue_buffer取得Buffer然后进行读写处理。pw_stream_dequeue_buffer用于在process回调中取得当前周期可处理的pw_buffer。函数原型structpw_buffer*pw_stream_dequeue_buffer(structpw_stream*stream);参数说明structpw_stream*stream;stream表示已经创建并连接的PipeWireStream对象。该参数必须指向有效的pw_stream。正常情况下应用应在该Stream对应的process回调中调用pw_stream_dequeue_buffer。不要在无关线程中随意调用也不要把一个Stream中取出的Buffer交给另一个Stream使用。返回值成功时返回structpw_buffer*表示当前可处理的Buffer。返回NULL表示当前没有可用Buffer。它不一定表示错误也不一定表示设备断开。工程上通常直接退出本次process回调等待下一次Graph调度。pw_buffer内部关联spa_buffer。应用真正访问媒体数据时通常会继续访问structspa_buffer*bufb-buffer;structspa_data*databuf-datas[0];其中data-data表示实际数据内存地址。data-maxsize表示当前Buffer可写入或可读取的最大空间。data-chunk描述本次有效数据区域包括offset、size、stride等字段。应用场景第一类场景是播放流。应用创建PW_DIRECTION_OUTPUT方向的Stream。process回调触发后应用调用pw_stream_dequeue_buffer取得一个可写Buffer把PCM数据写入Buffer并设置chunk有效数据范围最后调用pw_stream_queue_buffer提交给PipeWire。第二类场景是录音流。应用创建PW_DIRECTION_INPUT方向的Stream。process回调触发后应用调用pw_stream_dequeue_buffer取得一个已经包含采集数据的Buffer从Buffer中读取PCM数据处理完成后调用pw_stream_queue_buffer归还。第三类场景是视频帧处理。PipeWire不仅处理音频也处理视频。摄像头采集、屏幕共享、视频源输出等场景中也可以通过pw_stream_dequeue_buffer取得视频帧Buffer。第四类场景是实时低延迟处理。在虚拟声卡、回声消除、音频DSP、语音前处理、音视频桥接等场景中应用需要在process回调中快速完成dequeue、处理、queue避免阻塞Graph实时调度。3.调用流程剖析3.1核心步骤1.应用创建pw_stream对象并注册process事件回调。2.应用调用pw_stream_connect连接Stream声明方向、目标、格式参数和Buffer需求。3.PipeWire完成格式协商和Buffer协商为Stream准备可复用Buffer。4.Stream进入运行状态后PipeWireGraph按照调度周期触发process回调。5.应用在process回调中调用pw_stream_dequeue_buffer。6.函数从Stream内部可用队列中取出一个pw_buffer。7.如果返回NULL说明当前没有可用Buffer本次process回调应直接返回。8.如果是播放流应用向Buffer写入待播放数据并设置chunk-offset、chunk-size和chunk-stride。9.如果是录音流应用从Buffer读取已采集数据并根据chunk描述确定有效数据范围。10.应用调用pw_stream_queue_buffer把Buffer归还给PipeWire。11.PipeWire在后续Graph调度周期中继续复用该Buffer。12.Stream销毁或断开时相关Buffer随Stream生命周期释放。3.2调用流程图3.3生命周期图4.实战应用案例下面以播放流为例说明pw_stream_dequeue_buffer的典型用法。播放流的目标是PipeWire需要数据时应用从Stream中取出一个Buffer把PCM数据写进去然后归还给PipeWire继续播放。#includepipewire/pipewire.h#includespa/utils/defs.hstructapp_data{structpw_stream*stream;uint32_tframe_size;};staticuint32_tfill_pcm_data(void*dst,uint32_tmax_bytes){/* * 实际项目中这里通常来自 * 1.解码器输出的PCM数据 * 2.业务侧环形缓冲区 * 3.音频算法处理后的数据 * 4.测试音源生成的数据 */(void)dst;(void)max_bytes;return0;}staticvoidon_process(void*userdata){structapp_data*appuserdata;structpw_buffer*b;structspa_buffer*buf;structspa_data*data;uint32_tn_bytes;bpw_stream_dequeue_buffer(app-stream);if(bNULL)return;bufb-buffer;databuf-datas[0];if(data-dataNULL||data-chunkNULL){pw_stream_queue_buffer(app-stream,b);return;}n_bytesfill_pcm_data(data-data,data-maxsize);data-chunk-offset0;data-chunk-sizen_bytes;data-chunk-strideapp-frame_size;pw_stream_queue_buffer(app-stream,b);}这段代码体现了播放流的主链路应用先通过pw_stream_dequeue_buffer取出Buffer。然后通过b-buffer取得spa_buffer。再通过buf-datas[0]取得实际数据区。写入PCM数据后应用需要设置chunk信息。chunk-offset表示有效数据从Buffer中的哪个偏移开始chunk-size表示本次有效数据大小chunk-stride通常表示一帧数据的字节跨度。最后必须调用pw_stream_queue_buffer归还Buffer。这个动作表示应用已经完成本轮Buffer处理PipeWire可以继续把该Buffer放回Graph数据流中。录音流的代码结构类似但数据方向相反。录音流中应用不是向Buffer写数据而是从Buffer读取已经采集到的数据。#includepipewire/pipewire.h#includespa/utils/defs.hstructcapture_data{structpw_stream*stream;};staticvoidhandle_capture_data(constvoid*src,uint32_tsize){/* * 实际项目中这里通常接入 * 1.录音文件写入模块 * 2.音频编码器 * 3.语音识别前处理 * 4.回声消除或降噪算法 */(void)src;(void)size;}staticvoidon_capture_process(void*userdata){structcapture_data*appuserdata;structpw_buffer*b;structspa_buffer*buf;structspa_data*data;constuint8_t*src;uint32_tsize;bpw_stream_dequeue_buffer(app-stream);if(bNULL)return;bufb-buffer;databuf-datas[0];if(data-dataNULL||data-chunkNULL){pw_stream_queue_buffer(app-stream,b);return;}srcSPA_PTROFF(data-data,data-chunk-offset,uint8_t);sizedata-chunk-size;handle_capture_data(src,size);pw_stream_queue_buffer(app-stream,b);}播放流和录音流的关键区别在于Buffer语义播放流中dequeue得到的是应用要填充的数据容器。录音流中dequeue得到的是PipeWire已经写入采集数据的数据容器。所以pw_stream_dequeue_buffer不能简单理解成“读函数”或“写函数”。它只是把当前周期可处理的Buffer交给应用真正读还是写由Stream方向决定。工程使用时要注意四个问题。第一process回调中不要执行阻塞操作。不要在里面做磁盘阻塞读写、网络等待、复杂锁等待或长时间内存分配。第二dequeue失败时直接返回。返回NULL通常表示当前没有可用Buffer不要把它直接当成致命错误。第三dequeue成功后必须归还。正常路径归还使用pw_stream_queue_buffer。异常路径也要避免丢失Buffer否则会破坏Stream的Buffer循环。第四chunk信息必须正确。播放流中如果chunk-size设置错误PipeWire可能播放无效数据、静音数据或产生异常音频。录音流中如果忽略chunk-offset和chunk-size应用可能读取到无效区域。5.一句话总结pw_stream_dequeue_buffer是PipeWireStream运行阶段的取Buffer接口它在process回调中把当前周期可用的pw_buffer交给应用播放流用来填充数据录音流用来读取数据处理完成后必须通过pw_stream_queue_buffer归还。

相关新闻

晶晨S905L3S(B)_安卓9.0_4K不卡顿-5G可用-10S极速开机首页正常-单灯-通刷线刷包

晶晨S905L3S(B)_安卓9.0_4K不卡顿-5G可用-10S极速开机首页正常-单灯-通刷线刷包

晶晨S905L3S(B)【通刷】_安卓9.0_4K不卡顿-5G可用-10S极速开机首页正常-单灯线刷包已知理论课支持的型号有:CM311-e/HG680-LF/UNT403AS/UNT413AS/E900V21F/E900V22F/TBx1-1e/Z90&…

2026/8/25 15:47:18 阅读更多 →
【超详细】.NET 8 安装教程(Windows 全覆盖+环境校验+报错解决)

【超详细】.NET 8 安装教程(Windows 全覆盖+环境校验+报错解决)

适用系统:Windows 10 / Windows 11 适用人群:.NET 初学者、C# 开发、部署.NET程序 教程版本:.NET 8 长期支持版(LTS,企业稳定首选) 很多新手在搭建.NET开发环境时,会分不清SDK和Runtime&…

2026/8/25 15:47:18 阅读更多 →
AVRCP传输封面流程

AVRCP传输封面流程

具体HCI如下第一步,查询AVRCP服务记录第二步:查询AVRCP的附加服务属性值这里可以看到我们得到AVRCP TG的附加服务列表中有OBEX,并得到了PSM4007,即0x1001第三步:获取封面句柄,音乐信息中属性id为8的就是封面…

2026/8/25 15:47:18 阅读更多 →

最新新闻

电池出口美国必看!UL/FCC/UN38.3三大认证缺一不可,避坑指南

电池出口美国必看!UL/FCC/UN38.3三大认证缺一不可,避坑指南

您是否正在为电池产品开拓广阔的美国市场,却被繁杂的认证标准弄得一头雾水?是否担心因不合规而导致货物被扣、巨额罚款甚至被电商平台下架? 美国市场对电池产品的准入要求极为严格,提前做好合规认证是您成功出口的唯一捷径。作为专…

2026/8/26 17:59:32 阅读更多 →
跨境卖家必看:婴儿学步车美国市场准入标准全解

跨境卖家必看:婴儿学步车美国市场准入标准全解

一、核心标准体系 美国对婴儿学步车建立了 "强制性联邦法规 自愿性行业标准"双轨并行 的监管体系: 关键点 :亚马逊美国站要求婴儿学步车必须同时满足 16 CFR 1216 和 CPSIA 要求,两者缺一不可。 二、16 CFR 1216 — 联邦强制安全标…

2026/8/26 17:59:32 阅读更多 →
小鸿AI全攻略:从开箱配网到打造专属语音智能体

小鸿AI全攻略:从开箱配网到打造专属语音智能体

基于 OpenHarmony 星闪 RISC-V 的全开源端侧 AI 硬件,从配网到拥有专属语音助手 引言:当硬件遇到AI 在接触小鸿AI之前,我对“端侧AI”的理解还停留在各种开发板的跑分和算力参数上。直到我亲手将这台基于OpenHarmony、采用RISC-V架构并支持…

2026/8/26 17:59:32 阅读更多 →
59. 【Java】Spring Boot 入门:第一个 Web 应用

59. 【Java】Spring Boot 入门:第一个 Web 应用

摘要: 本文是Spring Boot入门实战指南,从零开始手把手教你创建第一个Spring Boot应用。文章详细介绍了Spring Boot的核心概念、自动配置机制、起步依赖原理,并通过Hello World和用户管理API两个完整示例,展示如何快速构建RESTful …

2026/8/26 17:59:32 阅读更多 →
Bianfchheng (Jiiu ) 《边城(九)》全文汉语拼音字母标调实测案例

Bianfchheng (Jiiu ) 《边城(九)》全文汉语拼音字母标调实测案例

此文基于这项规则:汉语拼音字母标调规则 Bianfchheng (Jiiu ) Shenv Conwen Zuqfuc hhuija shh, dayuem yv jiangjnn pngchhang ch zaofann shhjje l, janpshang shoushang quansh dongxi. Yi shang xio shantou biann haan Cuicui, yao Cuicui la chuand gos xi…

2026/8/26 17:59:32 阅读更多 →
VS Code C/C++ 插件 cpptools 内存占用异常

VS Code C/C++ 插件 cpptools 内存占用异常

前期概要 使用VS code连接WSL经常性出现终端和IDE卡住无法使用,关闭VS后即正常。 根本原因 cpptools 吃内存 "全量符号索引常驻" "多文件夹多实例" "可能的宏/symlink 泄漏" "没用 compile_commands 限制范围" 内存…

2026/8/26 17:58:32 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/26 14:45:33 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/26 17:46:43 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 14:46:37 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/26 17:46:39 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →