这可能是个愚蠢的问题。如何在一个进程中多次加载 gstreamer 元素?当 Gstreamer 元素创建时,如果已经创建并存在于内存中,它们是否共享?在我的情况下,一个进程创建多个线程,对于每个线程,我正在创建以下 gstreamer 元素,链接并将管道设置为 PLAYING 状态,filesrc->Q->filesink 并且这有效。但是当我在 Q->filesink 之间添加 gstreamer 元素(新编写用于处理 gst 缓冲区数据)时,所有线程都停止工作,可能是什么问题?我该如何调试?请提供输入。提前致谢。-opensid
2 回答
The elements are within shared libraries and thus the code will be just once in memory. Each instance will occupy some memory for its own state though. When doing multithreaded stuff, you should call gst_init() just once from your main thread. As gstreamer already creates new threads for the data processing, it is saver to create all the gstreamer pipeline from one main thread. You can run several pipelines in parallel.
我同意 ensonic 的回答,因为它适用于存储在 klass 中的数据。但是,它似乎不适用于 gbuffers。我正在研究基于 basetransform 的 IEEE1278 音频转换版本。在一个版本中,有一个过滤器插件允许 UDP 数据包通过基于可设置的属性和一个用于双向转换的插件,IEEE1278 <-> mulaw 取决于垫设置的内容。
对于一个简单的测试,我尝试了一个循环:
- gst-launch-1.0 -v filesrc 位置=IsaacAsimov-Foundation1Of8_64kb.mp3 \
- !mpegaudioparse \
- !mpg123audiodec
- !'音频/x-raw,rate=8000,channels=1' \
- !音频重采样\
- !'音频/x-raw,rate=8000,channels=1' \
- !穆拉文克\
- !'音频/x-mulaw,rate=8000,channels=1' \
- !分配音频\
- !过滤器\
- !分配音频\
- !'音频/x-mulaw,rate=8000,channels=1' \
- !穆劳德克\
- !'音频/x-raw,rate=8000,channels=1' \
- !自动音频接收器
无论我对 dissignalausio_transform 中的 gbuffer 数据或元数据做什么,输出音频都会有很多强烈的咔嗒声。mulawdec 中的 gprints 显示我的任何变换更改都没有到达 mulawdec。我使用 UDP 环回将循环分成两个启动管道,噪音就消失了。不知何故,来自第一个 dissignalaudio 实例的 gbuffer 覆盖了第二个实例。
学过的知识:
没有双向转换的示例是有原因的,并且所有转换都有单独的编码和解码插件。