实时源
实时源(live source )是不能在不丢失数据的情况下任意暂停的source。
实时源(例如录制音频或视频的element)需要以特殊方式处理。对于这些设备,在 PAUSED 状态下启动数据流是没有意义的,因为用户可能会在从 PAUSED 到 PLAYING 之间等待很长时间,从而使之前录制的缓冲区变得无关紧要。
因此,实时源仅在 PLAYING 状态下生成缓冲区。这对等待缓冲区完成预卷状态的sink有影响,因为这样的缓冲区可能永远不会到达。
当进入 PAUSED 状态时,实时源返回 NO_PREROLL 以通知 bin/pipeline 此element将无法在 PAUSED 状态下生成数据。 READY→PAUSED 和 PLAYING→PAUSED 都应返回 NO_PREROLL。
在使用非零超时值在 bin 上执行 get_state() 函数时,bin 必须确保pipeline中没有实时源,否则 get_state() 将会在sink上阻塞。
因此,GstBin总是对其element执行零超值时得get_state()函数,以在执行阻塞等待之前发现NO_PREROLL(和ERROR)的element。
调度
实时源不会在 PAUSED 状态下生成数据。它们在 get_range() 或循环函数中阻塞,直到它们进入 PLAYING。
延迟
实时源使用录制数据时的时钟时间为其数据加上时间戳。通常,录制第一个和最后一个数据采样需要一些时间。这意味着当缓冲区到达sink时,它已经晚了,并将被丢弃。
延迟是构造一个数据缓冲区所花费的时间,它通过一个latency查询公开。
更多请参考 延迟
时间戳
实时源始终使用pipeline 的 running_time 为其缓冲区添加时间戳。这需要能够匹配不同实时源的时间戳以同步它们。
这与非实时源形成对比,非实时源从 running_time 0 开始为其缓冲区添加时间戳。