GStreamer Bus的一个细节

本文详细介绍了GStreamer Bus系统如何在多线程环境中提供内部Elements事件信息,强调了在创建独立GMainContext与GMainloop以避免资源回收时的多线程互斥问题的重要性。同时,通过使用g_main_context_push_thread_default方法,确保了回调函数在调用者线程中执行,有效分散了应用线程的负载。

GStreamer的Bus系统主要用于向用户提供内部Elements的事件信息。使用GStreamer的Bus系统,只要调用gst_bus_add_watch,并且注册一个Callback即可。但问题在于调用这个接口的时机,及用于处理Bus事件的线程。Callback内部以glib的Source机制实现,Source要attach到一个GMainContext上,且需要有一个GMainloop来侦听这个Context。通常,调用gst_bus_add_watch的线程,在未做过任何处理的情况下,这个Source attach的GMainContext是NULL,也就是Default Main Context。而侦听Default Main Context的线程未必就是调用者线程,这样在做资源回收时,会出现多线程互斥问题。

需要回调函数在调用者线程中执行的方法如下:

1. 在创建调用者线程之后,创建该线程自己的GMainContext与GMainloop,然后调用g_main_context_push_thread_default,将该Context作为线程自己的默认Context,并使用GMainloop侦听;

2. 之后再在该线程中调用gst_bus_add_watch,则Callback会在调用者线程中执行,避免了多线程互斥的问题。

此方法同时避免了应用的主线程负担过重的问题。另外,所有基于gio的应用,也会由于使用了g_main_context_push_thread_default,使得各线程的负载分散化。

 

### 关于 GStreamer 的官方文档及教程 GStreamer一个用于构建流媒体应用的强大框架,提供了丰富的功能和灵活的设计模式。以下是关于 GStreamer 官方文档及教程的关键信息: #### 1. **入门与基础知识** - 对于初学者来说,《GStreamer Framework Guide》是一个很好的起点[^2]。此手册的第一章专注于简单音频播放器的开发,并逐步引导开发者理解核心概念。 - 使用 `gst-inspect-1.0` 工具可以帮助用户探索可用插件及其属性[^1]。 #### 2. **动态管道管理** - GStreamer 支持几乎所有的动态管道修改操作,但在实际应用中需要注意某些细节以避免潜在问题[^3]。这些内容通常可以在高级教程或特定章节找到。 #### 3. **Python 集成** - 用户可以通过配置文件快速设置并运行 GStreamer-Python 项目,从而利用 Python 进行多媒体处理[^4]。相关文档会提供详细的安装指导以及 API 参考。 #### 4. **资源管理和生命周期** - 在程序设计过程中,了解如何正确释放资源非常重要。例如,在达到 EOS (End of Stream) 或发生错误时终止流程[^5]。 #### 示例代码:创建基本播放管线 ```python import gi gi.require_version('Gst', '1.0') from gi.repository import Gst, GObject def main(): # 初始化 GStreamer Gst.init(None) # 创建管道元素 pipeline = Gst.parse_launch("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm") # 开始播放 pipeline.set_state(Gst.State.PLAYING) # 等待直到完成或者中断 bus = pipeline.get_bus() msg = bus.timed_pop_filtered(Gst.CLOCK_TIME_NONE, Gst.MessageType.ERROR | Gst.MessageType.EOS) # 清理 pipeline.set_state(Gst.State.NULL) if __name__ == "__main__": main() ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值