GStreamer学习三(延迟)

本文探讨了实时流媒体管道中延迟问题的重要性,特别是在音频和视频捕获与播放的场景下。延迟主要由源和接收器的同步、实时源的缓冲区大小以及中间效果元素引起。为了解决这些问题,需要开发一种可扩展的延迟校正算法,以确保不同延迟元素间的同步。此外,文章还介绍了如何通过跟踪模块来测量管道内的延迟。测试案例进一步说明了不同配置下的延迟挑战,强调了正确延迟管理对于保持流媒体同步的必要性。
摘要由CSDN通过智能技术生成
1、延迟
延迟(即latency)是在时间戳0处捕获的样本到达接收器所花费的时间此时间是根据流水线的时钟测量的。对于只有包含与时钟同步的接收器元素的流水线,latency始终为0,因为没有其他元素延迟缓冲区。对于实时源的管道,必须引入延迟,这主要是因为实时源的工作方式。考虑一个音频源,它将在时间0开始捕获第一个采样。如果该源以44100Hz的频率一次推送具有44100个采样的缓冲区,由于缓冲区的时间戳为0,而现在是时钟的>= 1(单位:44100采样时间),接收器将丢弃此缓冲区。因为为时已晚,在接收器中没有任何延迟补偿的情况下,所有缓冲区将被丢弃。
 
在以下情况下情况变得更加复杂:
  • 2个实时的SrcElement 连接到 2个具有不同延迟的 实时sinkElement
    • 具有同步实时预览的音频/视频捕获。
    • 由于效果(延迟,重采样器...)而增加了延迟
  • 1个活动源连接到2个活动接收器
    • firewire DV
    • RTP,由于抖动缓冲区而增加了延迟。
  • 混合实时源和非实时源方案。
    • 同步音频捕获的和非实时的播放。(配音,..)
  • 由于实时信号源提供了自己的时钟,因此接收器中的时钟从动。
要在上述情况下执行所需的延迟校正,我们必须开发一种算法来计算管道的全局延迟。该算法必须是可扩展的,以便可以优化运行时的延迟。还必须有可能根据特定的应用程序需(所需的最小延迟)来禁用或调整算法。

2、延迟的必要性

我们显示一些示例来演示典型捕获管道中的延迟问题。
例1
音频捕获/播放管道。
  • asrc:音频源,提供时钟
  • asink音频接收器,提供时钟
 
  • NULL→READY:
    • asink:  NULL→READY: probes device, returns  SUCCESS
    • asrc:  NULL→READY: probes device, returns  SUCCESS
  • READY→PAUSED:
    • asink:  READY:→PAUSED open device, returns  ASYNC
    • asrc:  READY→PAUSED: open device, returns  NO_PREROLL
  • PAUSED→PLAYING : asrc clock selected because it is the most upstream clock provider. asink can only provide a clock when it received the first buffer and configured the device with the samplerate in the caps.
    • asink:  PAUSED:→PLAYING, sets pending state to  PLAYING, returns  ASYNC because it is not prerolled. The sink will commit state to  PLAYING when it prerolls.
    • asrc:  PAUSED→PLAYING: starts pushing buffers.
  • since the sink is still performing a state change from  READY→PAUSED, it remains  ASYNC. The pending state will be set to  PLAYING.
  • The clock starts running as soon as all the elements have been set to  PLAYING.
  • the source is a live source with a latency. Since it is synchronized with the clock, it will produce a buffer with timestamp 0 and duration D after time D, ie. it will only be able to produce the last sample of the buffer (with timestamp D) at time D. This latency depends on the size of the buffer.
  • the sink will receive the buffer with timestamp 0 at time  >= D. At this point the buffer is too late already and might be dropped. This state of constantly dropping data will not change unless a constant latency correction is added to the incoming buffer timestamps.
该问题是由于以下事实造成的:将接收器设置为(挂起)PLAYING 而不能进行回滚,这仅在活动管道中发生。
 
例2
音频捕获/视频捕获/播放的管道:我们同时捕获音频和视频,并使它们再次同步播放。
  • asrc:音频源,提供时钟
  • asink音频接收器,提供时钟
  • vsrc:视频源
  • vsink视频接收器
 
状态更改的发生方式与例1相同。两个接收器都以的挂起状态PLAYING和返回值结束,ASYNC直到它们接收到第一个缓冲区。为了使音频和视频同步播放,两个接收器必须补偿其源的延迟,但也必须使用完全相同的延迟校正。假设asrc的延迟为20ms,vsrc的延迟为33ms,则管道中的总延迟必须至少为33ms。这也意味着管道必须在33 - 20 = 13ms音频流上至少具有一个缓冲区,否则在音频接收器等待之前的样本播放时,音频src将不足。
例3
连接到活动接收器(vsink,sink)的非活动(文件)和活动源(vsrc)的组合示例。
 
状态更改的发生方式与例1相同。除了接收器能够预滚动(将其提交到PAUSED)。在这种情况下,接收器将没有延迟,但vsink将没有延迟。总延迟应该是vsink的延迟。
请注意,由于存在实时源(vsrc),可以在接收器能够预滚动之前将管道设置为正在播放。如果不对实时源进行补偿,这可能会导致同步问题,因为应该在元素中进行配置,然后才能转到PLAYING
例4
非实时资源和实时资源的组合示例。非活动源连接到活动接收器,活动源连接到非活动接收器。
 
状态更改的发生方式与示例3相同。接收器将能够进行预滚动(将状态提交至PAUSED)。文件将无法预卷。接收器没有延迟,因为它没有连接到实时源。文件不执行同步,因此它不关心延迟。流水线中的总延迟为0。vsrc与接收器中的回放同步捕获。与例3一样,接收器只能PLAYING在成功预卷后设置为。
 
3、查看管道中的延迟
一个跟踪模块,它通过在源中注入自定义事件并在接收器中处理它们来确定从源到接收器的延迟。该元素支持跟踪整个管道延迟和每个元素延迟。默认情况下,仅跟踪管道延迟。'flags'参数可用于启用元素跟踪。
 
4、测试rtspsrc latency延迟效果
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,我会尽力回答你的问题。关于通过UDP传输音视频,我了解一些相关的知识,下面是一些学习笔记: 1. gstreamer是一个流媒体框架,用于创建、处理和播放多媒体流。它支持多种音视频格式,可以通过插件扩展功能。 2. 通过gstreamer可以使用UDP协议传输音视频数据。UDP协议是一种无连接的协议,不保证数据传输的可靠性和顺序性,但是传输效率高。 3. 首先需要创建一个gstreamer的pipeline,包括音视频源、编码器、UDP发送端等组件。例如: ``` gst-launch-1.0 -v filesrc location=test.mp4 ! decodebin ! x264enc ! rtph264pay ! udpsink host=192.168.1.100 port=5000 ``` 这个pipeline的作用是从test.mp4文件读取音视频流,解码后使用x264编码器进行压缩,然后使用rtph264pay将数据打包成RTP数据包,最后通过udpsink发送到指定的IP地址和端口。 4. 接收端需要创建一个gstreamer的pipeline,包括UDP接收端、解包器、解码器等组件。例如: ``` gst-launch-1.0 -v udpsrc port=5000 ! application/x-rtp, payload=96 ! rtpjitterbuffer ! rtph264depay ! avdec_h264 ! autovideosink ``` 这个pipeline的作用是从UDP端口5000接收音视频数据,使用rtpjitterbuffer解决网络抖动问题,使用rtph264depay将RTP数据包解包成原始的H.264数据流,然后使用avdec_h264解码器进行解码,最后使用autovideosink播放视频。 5. 在实际使用过程中,还需要考虑数据的带宽限制、网络延迟等问题,以保证音视频传输的效果。 希望这些笔记能对你有帮助。如果你还有其他问题,可以继续问我。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值