GStreamer Basic tutorial 学习笔记(十二)

流媒体

定义:直接从互联网播放媒体而不存储在本地,被称为流媒体。

目标

  1. 如何启用缓冲(以减轻网络问题)
  2. 如何从中断中恢复(时钟丢失)

介绍

在流媒体中,媒体块在从网络接收到后被解码并排队等待播放。这意味着,如果一个块被延迟(在互联网上这并不罕见),播放队列可能会变空,导致媒体播放停滞。

通用解决方案是构建一个“缓冲区”,即在开始播放之前允许一定数量的媒体块排队。这样,播放开始会稍微延迟,但是如果某些块迟到,由于队列中有更多的块等待,媒体播放不会受到影响。

事实证明,GStreamer已经实现了这个解决方案,但是之前的教程并没有从中受益。一些元素,如在playbin中找到的queue2multiqueue,能够构建此缓冲区并发布有关缓冲区级别(队列的状态)的总线消息。因此,想要拥有更好的网络弹性的应用程序应该监听这些消息,并在缓冲区级别不足时暂停播放(通常在低于100%时)。

为了实现多个sink之间的同步(例如音频和视频sink),使用全局时钟。GStreamer从所有可以提供时钟的元素中选择时钟。在某些情况下,例如,RTP source切换流或更改输出设备,时钟可能会丢失,并且需要选择一个新的时钟。这在处理流媒体时经常发生,所以在本教程中解释了这个过程。

当时钟丢失时,应用程序会在总线上收到一条消息;要选择新时钟,应用程序只需将管道设置为PAUSED,然后再设置为PLAYING即可。

时钟丢失

解决方案:对于第二个网络问题,时钟丢失,我们只需将管道设置为PAUSED,然后再设置为PLAYING,这样就会选择一个新的时钟,如果需要,等待接收新的媒体块。

函数与知识点

  1. GST_STATE_CHANGE_NO_PREROLL 功能:状态转换成功,但元素无法在PAUSED状态下产生数据。
    说明:这通常发生在实时源中。
  2. gst_message_parse_buffering (GstMessage * message, gint * percent) 功能:从GstMessage中提取缓冲百分比。还可以参考gst_message_new_buffering()
    说明:线程安全。

你可能感兴趣的:(GStreamer学习笔记,c++,GStreamer,webrtc,服务器)