Gstreamer- Source elements

Source elements

source element是向pipeline提供数据的element。它通常没有任何 sink(输入)pad。

典型的source element包括:

  • file readers
  • network elements (live or not)
  • capture elements (video/audio/…)
  • generators (signals/video/audio/…)

实时源

当一个source具有以下属性时,它被称为实时源:

  • 暂时停止从源读取会导致数据丢失。

通常,当此属性成立时,源也会以固定速率生成数据。大多数源对它们可以提供数据的速率都有限制,这可能比消耗速率更快或更慢。但是,此属性不会使它们成为实时源。

让我们看一些示例源。

  • file readers:您可以PAUSE 而不会丢失数据。但是,您可以从该源读取的速度是有限的。这个限制通常远高于消耗率。在某些情况下,它可能会更慢(例如 NFS 共享),在这种情况下您可能需要使用一些缓冲(请参阅缓冲)。
  • HTTP network element:可以PAUSE 而不会丢失数据。根据可用的网络带宽,消耗率可能高于生产率,在这种情况下应使用缓冲(请参阅缓冲)。
  • audio source:暂停音频采集会导致数据丢失。因此,这个源肯定是现场直播。此外,音频源将以固定速率(采样率)产生数据。同样取决于缓冲区大小,此源将引入延迟(请参阅延迟)。
  • udp network source:暂停接收部分会导致数据丢失。因此,该源是实时源。同样在典型情况下,udp 数据包将以特定速率接收,这可能由于网络抖动而难以猜测。此来源不一定会自行引入延迟。
  • dvb source:暂停此element会导致数据丢失,它是类似于 UDP 源的实时源。

源类型

源element可以以三种方式运行:

  • 它是完全可定位(seek)的,这意味着可以以一种有效的方式对其进行随机访问。 ( file reader,...)。这通常也意味着源不是实时的。
  • 可以从中获取具有可变大小的数据。这意味着源可以提供 N 个字节的数据。一个例子是音频源。视频源始终提供相同数量的数据(一个视频帧)。请注意,这不是一个完全可定位的源。
  • 它是一个实时源,见上文。

编写源时,必须查看源如何操作,以决定在源上实现的调度方法。

  • 完全可定位的源在source pad上实现了 getrange 函数。
  • 可以提供 N 个字节但不能进行定位(seek)的源也实现了 getrange 函数,但声明它们不能进行随机访问。
  • 纯粹是实时源的源实现了推送数据的任务。

任何具有 getrange 函数的源也必须实现基于推的调度模式。在这种模式下,源启动一个任务,获取 N 个字节并将它们推出。不过,只要有可能,peer element就会选择源的基于 getrange 的调度方法。

具有 getrange 函数的源必须在 pad 激活函数中激活自身。这是必需的,因为在调用源的状态更改函数之前,下游peer element将决定并激活其状态更改函数中的源element。

源基类

GstBaseSrc:

这个基类提供了一个随机访问源的实现,非常适合像 file reader这样的源。

GstPushSrc:

基于块(block-based)的源的基类。此类对于不能进行随机访问或至少非常缓慢的element非常有用。源代码通常倾向于推出一个固定大小的缓冲区。

扩展此基类的类通常会以基于推的模式进行调度。如果peer接受无偏移且在允许的块大小限制内运行,则此类可以自动在基于 getrange 的模式下运行。

除了 create 方法之外,子类还应该扩展基类的方法。如果源是可定位的,除了 GstBaseSrc::is_seekable() 之外,它还需要覆盖 GstBaseSrc::event() 以检索定位偏移量,它是下一个被请求的缓冲区的偏移量。

刷新、调度和同步都由这个基类处理。

时间戳

非实时源应从 0 开始为其生成的缓冲区添加时间戳。如果无法为每个缓冲区 (filesrc) 加上时间戳,则源只允许为第一个缓冲区添加时间戳(为 0)。

实时源仅在时钟运行时生成处于 PLAYING 状态的数据。他们应该使用pipeline的当前 running_time 为他们产生的每个缓冲区添加时间戳,表示为:

absolute_time - base_time

其中absolte_time是从全局pipeline获得的时间,gst_clock_get_time()和base_time是pipeline最后一次设置为PLAYING的时钟时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值