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()
    说明:线程安全。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清墨韵染

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值