Linux PipeWire深度解析之pw_stream_get_properties调用流程与实战(四十七)
简介CSDN博客专家、《Android系统多媒体进阶实战》作者博主新书推荐《Android系统多媒体进阶实战》Android Audio工程师专栏地址Audio工程师进阶系列【原创干货持续更新中……】Android多媒体专栏地址多媒体系统工程师系列【原创干货持续更新中……】专题一 二AAOS车载系统AOSP14系统攻城狮入门视频实战课专题三Android14 Binder之HIDL与AIDL通信实战课专题四Android15快速自定义与集成音效实战课专题五Android15音频策略实战课专题六Android15音频性能实战课(无声/杂音/断音/爆音实战案例)人生格言人生从来没有捷径只有行动才是治疗恐惧和懒惰的唯一良药.更多原创,欢迎关注Android系统攻城狮文章目录1. 前言要点概括2. 应用场景与用法函数原型参数说明返回值应用场景3. 调用流程剖析3.1 核心步骤1. 创建 Stream 属性表2. 创建 PipeWire Stream3. Stream 进入连接或运行阶段4. 调用 pw_stream_get_properties5. 返回 Stream 内部属性表6. 读取目标属性键值7. 根据属性执行策略判断8. Stream 销毁后属性指针失效3.2 调用流程图3.3 生命周期图4. 实战应用案例5. 一句话总结1. 前言本篇目的Linux PipeWire 深度解析之pw_stream_get_properties调用流程与实战。要点概括核心功能获取pw_stream对象当前保存的属性表用于读取 Stream 的媒体类型、媒体角色、节点名称、应用信息等属性。工作机制pw_stream_get_properties()从 Stream 内部直接返回struct pw_properties指针调用者再通过pw_properties_get()读取具体键值。典型用途Stream 创建后属性确认、回调中读取媒体信息、调试音频流分类、根据media.role或media.category执行业务策略。2. 应用场景与用法pw_stream_get_properties()是 PipeWire Stream 属性查询中的基础接口。应用创建 Stream 时通常会通过pw_properties_new()设置一组属性pw_properties_new(PW_KEY_MEDIA_TYPE,Audio,PW_KEY_MEDIA_CATEGORY,Playback,PW_KEY_MEDIA_ROLE,Music,NULL);这些属性会跟随 Stream 一起保存用于描述该流的媒体类型、媒体类别、业务角色、节点名称和应用信息。当程序需要读取这些属性时可以调用propspw_stream_get_properties(stream);而该接口用于获取当前pw_stream内部保存的属性表指针使调用者可以读取 Stream 的属性键值。需要注意pw_stream_get_properties()只负责返回 Stream 内部属性表不会复制属性对象也不会向 PipeWire Server 查询远程属性。函数原型conststructpw_properties*pw_stream_get_properties(structpw_stream*stream);参数说明stream:由pw_stream_new()或pw_stream_new_simple()创建的 Stream 对象返回值查询成功:返回 Stream 当前保存的 properties 指针 查询失败:返回NULL返回值类型为conststructpw_properties*表示调用者应当只读访问该属性表。调用者可以通过pw_properties_get(props,key);读取具体属性值。应用场景pw_stream_get_properties()常见应用场景主要有三类。第一类是 Stream 创建后的属性确认。应用创建播放流或录音流时通常会设置media.type、media.category、media.role、node.name等属性。创建完成后可以通过pw_stream_get_properties()读取属性表确认当前 Stream 的媒体描述是否符合预期。第二类是回调中的业务判断。在 Stream 状态变化、参数变化或处理流程中业务模块可以读取 Stream 属性根据media.role判断当前流是音乐、通话、通知还是导航语音再决定是否进入对应的音频策略分支。第三类是调试与问题定位。音频流路由错误、Stream 分类异常、策略未生效时可以通过该接口读取 Stream 属性确认应用传入的属性是否正确避免把路由问题误判为 PipeWire Server 或 WirePlumber 策略问题。3. 调用流程剖析3.1 核心步骤1. 创建 Stream 属性表应用首先创建 Stream 属性表propspw_properties_new(PW_KEY_MEDIA_TYPE,Audio,PW_KEY_MEDIA_CATEGORY,Playback,PW_KEY_MEDIA_ROLE,Music,PW_KEY_NODE_NAME,demo.playback,NULL);该属性表用于描述 Stream 的媒体属性和业务身份。常见属性包括media.type: 媒体类型例如 Audio media.category: 媒体类别例如 Playback 或 Capture media.role: 媒体角色例如 Music、Communication、Notification node.name: PipeWire 图中的节点名称2. 创建 PipeWire Stream应用通过属性表创建 Streamstreampw_stream_new_simple(pw_main_loop_get_loop(main_loop),demo-stream,props,stream_events,data);创建过程中属性表会与pw_stream对象绑定。从业务视角看关系可以表示为pw_stream └── properties ├── media.type ├── media.category ├── media.role └── node.name3. Stream 进入连接或运行阶段应用可以继续调用pw_stream_connect(stream,PW_DIRECTION_OUTPUT,PW_ID_ANY,flags,params,n_params);此时 Stream 会进入连接流程并逐步参与 PipeWire 图中的节点创建、端口协商和参数协商。pw_stream_get_properties()本身不依赖 Stream 必须处于运行状态只要 Stream 对象有效就可以读取其属性。4. 调用 pw_stream_get_properties应用或回调中执行propspw_stream_get_properties(stream);该调用直接进入 PipeWire Stream API。这是一个本地同步查询不需要等待 Main Loop也不会向 PipeWire Server 发送新的请求。5. 返回 Stream 内部属性表pw_stream_get_properties()返回 Stream 当前保存的属性表指针。逻辑上可以理解为returnstream-properties;这里返回的是内部对象指针不是属性表副本。因此调用者不应该修改或释放该返回值。6. 读取目标属性键值调用者拿到属性表后通过pw_properties_get()读取具体键值media_typepw_properties_get(props,PW_KEY_MEDIA_TYPE);media_rolepw_properties_get(props,PW_KEY_MEDIA_ROLE);如果目标键不存在则pw_properties_get()返回NULL。7. 根据属性执行策略判断读取属性后业务模块可以根据不同字段进入不同处理逻辑if(media_rolespa_streq(media_role,Music)){/* * 音乐流策略 */}例如Music: 普通音乐播放 Communication: 语音通话 Notification: 系统提示音 Movie: 视频播放这些属性通常会影响后续路由策略、音量策略、优先级策略和调试判断。8. Stream 销毁后属性指针失效当 Stream 被销毁后pw_stream_destroy(stream);之前通过pw_stream_get_properties()获取的属性指针也随之失效。应用不能在 Stream 销毁后继续访问该指针。3.2 调用流程图3.3 生命周期图4. 实战应用案例#includepipewire/pipewire.h// PipeWire核心API#includestdio.h#includestdlib.h#includestring.hstructapp_data{structpw_main_loop*main_loop;structpw_stream*stream;constchar*media_type;constchar*media_category;constchar*media_role;constchar*node_name;};staticvoidread_stream_properties(structapp_data*data){conststructpw_properties*props;propspw_stream_get_properties(data-stream);if(!props){return;}data-media_typepw_properties_get(props,PW_KEY_MEDIA_TYPE);data-media_categorypw_properties_get(props,PW_KEY_MEDIA_CATEGORY);data-media_rolepw_properties_get(props,PW_KEY_MEDIA_ROLE);data-node_namepw_properties_get(props,PW_KEY_NODE_NAME);}staticvoidstream_state_changed_cb(void*userdata,enumpw_stream_stateold_state,enumpw_stream_statestate,constchar*error){structapp_data*datauserdata;read_stream_properties(data);if(statePW_STREAM_STATE_ERROR){pw_main_loop_quit(data-main_loop);}}staticconststructpw_stream_eventsstream_events{PW_VERSION_STREAM_EVENTS,.state_changedstream_state_changed_cb,};intmain(intargc,char*argv[]){structapp_datadata{0};structpw_properties*props;intresultEXIT_FAILURE;pw_init(argc,argv);data.main_looppw_main_loop_new(NULL);if(!data.main_loop){pw_deinit();returnEXIT_FAILURE;}propspw_properties_new(PW_KEY_MEDIA_TYPE,Audio,PW_KEY_MEDIA_CATEGORY,Playback,PW_KEY_MEDIA_ROLE,Music,PW_KEY_NODE_NAME,demo.playback.stream,NULL);data.streampw_stream_new_simple(pw_main_loop_get_loop(data.main_loop),demo-playback-stream,props,stream_events,data);if(!data.stream){pw_main_loop_destroy(data.main_loop);pw_deinit();returnEXIT_FAILURE;}read_stream_properties(data);if(data.media_typestrcmp(data.media_type,Audio)0){resultEXIT_SUCCESS;}pw_stream_destroy(data.stream);pw_main_loop_destroy(data.main_loop);pw_deinit();returnresult;}5. 一句话总结pw_stream_get_properties()本质上是“返回 PipeWire Stream 内部保存的属性表指针使调用者可以读取该流的媒体描述和业务属性”。它负责获取 Stream 当前属性但不负责创建属性对象、复制属性表、更新远程节点属性或管理属性生命周期是 PipeWire Stream 创建、调试、策略判断和音频流分类中的基础接口。

相关新闻

格雷码原理、转换算法与工程应用全解析

格雷码原理、转换算法与工程应用全解析

1. 格雷码:从理论到实践的深度解析 如果你接触过数字电路、旋转编码器,或者研究过某些特定的算法问题,那么“格雷码”这个词对你来说一定不陌生。它不像二进制码那样广为人知,但在许多特定的工程和计算场景下,格雷码却…

2026/8/5 11:26:09 阅读更多 →
数据中心隐藏的攻击面:OT安全防护刻不容缓

数据中心隐藏的攻击面:OT安全防护刻不容缓

数据中心的韧性正日益受到关注,而安全则是其中的核心议题。由于经济增长和安全运营对数据中心的依赖程度不断提升,这些设施越来越被视为关键基础设施。然而,相关讨论往往止步于外部边界。在围栏之内,另一类尚未得到充分审视的风险…

2026/8/5 11:26:09 阅读更多 →
平面透镜天线设计(含HFSS模型和自动建模程序)

平面透镜天线设计(含HFSS模型和自动建模程序)

简介 平面透镜天线是一种将传统曲面透镜“压扁”的平板天线。它利用平面结构上无数个微小的单元,模拟透镜对电磁波的相位调整功能。其核心任务是:将馈源发出的球面波,在校正后变成定向辐射的平面波,从而实现高增益。 平面透镜天线…

2026/8/5 11:26:09 阅读更多 →

最新新闻

LabVIEW调用.NET程序集:原理、实战与性能优化指南

LabVIEW调用.NET程序集:原理、实战与性能优化指南

1. 项目概述:当LabVIEW遇上.NET在工业自动化、测试测量领域深耕多年的工程师,对LabVIEW这款图形化编程环境一定不陌生。它以数据流编程和直观的图形界面著称,特别适合快速搭建测控系统原型。然而,随着项目复杂度的提升&#xff0c…

2026/8/5 12:12:27 阅读更多 →
一键找回十年青春:GetQzonehistory帮你轻松备份QQ空间完整历史

一键找回十年青春:GetQzonehistory帮你轻松备份QQ空间完整历史

一键找回十年青春:GetQzonehistory帮你轻松备份QQ空间完整历史 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 还记得十年前在QQ空间发的第一条说说吗?那些深夜的…

2026/8/5 12:12:27 阅读更多 →
Qt开发第四章——窗口

Qt开发第四章——窗口

文章目录菜单添加菜单项综合实例工具栏状态栏对话框自定义对话框菜单 Qt 中的菜单栏是通过 QMenuBar 这个类来实现的。⼀个主窗⼝最多只有⼀个菜单栏。位于主窗⼝顶部、主窗⼝标题栏下⾯。 //创建菜单栏QMenuBar *bar menuBar();//创建菜单QMenu *menu1 new QMenu("文件…

2026/8/5 12:12:27 阅读更多 →
3分钟搞定网易云音乐无损下载:打造专属本地音乐库的完整指南

3分钟搞定网易云音乐无损下载:打造专属本地音乐库的完整指南

3分钟搞定网易云音乐无损下载:打造专属本地音乐库的完整指南 【免费下载链接】netease-cloud-music-dl Netease cloud music song downloader, with full ID3 metadata, eg: front cover image, artist name, album name, song title and so on. 项目地址: https:…

2026/8/5 12:12:27 阅读更多 →
BIM轻量化引擎技术路线对比:WebGL vs 云渲染 vs 自研引擎

BIM轻量化引擎技术路线对比:WebGL vs 云渲染 vs 自研引擎

从渲染管线到架构选型,深度解析BIM轻量化引擎的三条技术路径 一、为什么技术路线选择决定了BIM轻量化引擎的成败 在工程建设行业,BIM模型轻量化引擎已经从一个"锦上添花"的工具,变成了项目协同的基础设施。设计师用Revit建完模型后…

2026/8/5 12:12:27 阅读更多 →
Docker(仅学习记录与理解,可能有误或理解不到位)

Docker(仅学习记录与理解,可能有误或理解不到位)

引言:写这篇文章的原因还是最近的项目中多次提到了docker这个东西,虽然在用(就是跟着那种足够详细的指导一步一步使用),但是对于这个东西,我完全没有自己的理解,docker到底是个什么,…

2026/8/5 12:11:26 阅读更多 →

日新闻

Java缓存框架:JetCache

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架,为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能,同时你也可以通过代码直接操作 Cach…

2026/8/5 0:00:43 阅读更多 →
AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求:通孔焊盘 十字花;过孔 Via 实心直连;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑:全部统一十字,导致接地过孔阻抗高、大电流发热! 一、快捷键打开规则 PCB 界面按下:D R 展开…

2026/8/5 0:00:43 阅读更多 →
AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

更多请点击: https://kaifayun.com 第一章:AI生成素描效果 AI生成素描效果是计算机视觉与风格迁移技术融合的典型应用,其核心在于将彩色照片或RGB图像转换为具有手绘质感、明暗对比强烈、边缘清晰的单色素描图像。该过程通常依赖于深度学习模…

2026/8/5 0:00:43 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/4 11:09:16 阅读更多 →
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/4 13:38:40 阅读更多 →