目标
GStreamer会自动处理多线程这部分,但在有些情况下,你需要手动对线程做解耦。本教程会教你怎样才能做到这一点,另外也展示了Pad的有效性。主要内容包括:
- 如何针对pipeline的某些部分建立一个新的线程
- 什么是Pad的有效性
- 如何复制流
介绍
多线程
GStreamer是一个支持多线程的框架。这就说明,如果有必要它会在内部自动创建/销毁线程。比如:在应用线程中把流解出来。而且,plugin自身也可以任意的创建线程,比如一个视频解码器为了充分利用4核CPU的能力,可以创建4个线程。
这里最重要的是,当应用在建立pipeline时可以明确一个branch(一部分pipeline)在另一个线程中运行(比如,让音频解码和视频解码同时运行)。
这个可以用queue element来达到这个目的,运行的时候sink pad仅仅负责把数据放到queue里面,同时在另一个线程里把数据从queue里面取出并向下发送。这个element同样可以用来做缓冲,这点在后面讲述流的教程时可以看到。Queue的大小是可以用设置属性的方法来设置的。
一个pipeline例子
这个例子建立的pipeline如下图所示。