Appsrc
Appsrc Element.
应用程序可以通过Appsrc插件向GStreamer pipeline中插入数据,与大部分插件不同,除了Action signals的方式以外,appsrc还提供了一系列的外部接口gst_app_src_<function_name>()
用于数据交互以及appsrc属性的动态设置(需要链接libgstapp.so
)。
Properties
emit-signals
appsrc的emit-signals
属性默认为true。
caps
除非push的buffer具有未知的caps,使用appsrc:
需要设置caps属性,指定我们会产生何种类型的数据,这样GStreamer会在连接阶段检查后续的Element是否支持此数据类型,否则回调只触发一次就被block在其他插件中。这里的 caps必须为GstCaps对象。
使用
gst_app_src_push_sample()
直接push sample,然后接口将接管这个GstSample的控制权(自动释放),并获取这个GstSample的GstCaps作为caps。
max-buffers/max-bytes/max-time & block
appsrc内部维护一个数据队列,max-buffers/max-bytes/max-time
这几个属性用于控制这个内部队列的长度。一个填满的队列将发送enough-data
信号,这时应用程序应该停止向队列push data。
假如block
属性设置为true,当内部队列为满时将block push-buffer相关方法直到队列不满。
stream-type
is-live
signals
enough-data
:appsrc内部数据队列满,推荐在触发信号之后停止push-buffer
直到need-data信号被触发。need-data
:appsrc需要更多的数据,在回调或者其他线程中需要调用push-buffer
或者end-of-stream
,回调函数的length
参数是一个隐藏参数,当length=-1
时意味着appsrc可以接收任意bytes的buffer。可以重复调用push-buffer
直至enough-data
信号被触发。seekdata
:需要seekable stream-type的支持,具有一个offset表明下一个要被push的buffer的位置。
两种工作模式
push-mode
push模式由应用程序来控制data的发送,应用程序重复调用
push-buffer/push-sample
方法来触发enough-data
信号。配合max-buffers
属性设置队列的长度,通过处理enough-data
信号和need-data
信号分别停止或开始调用push-buffer/push-sample
来控制队列的大小。pull-mode
pull模式和通过
need-data
信号触发push-buffer
调用。
GST_APP_API
GstAppSrcCallbacks
push-buffer
gst_app_src_push_buffer
push-buffer只负责将数据插入appsrc的内部队列中,不负责这个buffer的传输。
API将接管这个GstBuffer的所有权,自动释放资源。
Action signals
end-of-stream
:appsrc没有可用的buffer信号push-buffer
:将GstBuffer添加到appsrc的src pad中,不持有这个GstBuffer的所有权,需要手动释放。
push-sample
:将GstSample下的GstBuffer添加到appsrc的src pad中,加入GstSample的GstCaps不符合当前appsrc的cpas,那么将同时把GstSample的GstCpas设置为appsrc的caps属性。不持有这个GstSample的所有权,需要手动释放。
代码实例
Last updated