本月早些时候发布的GStreamer 1.20是整个社区17个月辛勤工作的成果。超过250名开发人员贡献了代码来实现这一版本,而且Collabora的贡献者再次超过了任何其他组织。
我们的工作集中在两个领域,我们认为GStreamer在这两个领域最为耀眼:嵌入式系统和网络流媒体,尤其是WebRTC。下面是我们的工程师团队对最新版本的影响摘要。
和往常一样,你也可以通过查看项目#39;s 1.20发行说明。
GStreamer已经是嵌入式系统的卓越媒体框架,而这是Collabora在上一个发布周期中非常活跃的领域。以下是我们所做的一些改进';我做了。
经过纪尧姆、尼古拉斯、斯特凡和亚伦多年的努力,我们终于获得了对子帧解码的支持。这使得在解码器支持的情况下,可以在从网络接收到整个帧之前开始解码视频帧。我们';我用OpenJPEG实现了JPEG2000,用ffmpeg实现了H.264,在使用Xilinx Zynq UltraScale+MPSoC EV处理器上的Allegro扩展时,也在gst omx中实现了这一点。
与华为合作,我们还改进了GStreamer构建系统,使其能够创建一个库,其中只包含特定应用程序或一组应用程序使用的GStreamer的特定部分。看看这篇博文,了解更多信息。
Nicolas添加了MPEG2和VP9无状态Linux支持,并为增强VP9解析器做出了贡献。H264无状态Linux解码器也获得了对隔行视频流的支持,尽管只支持基于切片的解码器,而不支持基于帧的解码器,因为主线Linux内核中没有驱动程序支持这一点。Nicolas还增加了对渲染延迟的支持,允许多个帧在无状态解码器中排队,并以更高的延迟为代价提高吞吐量。他为MPEG 2视频、VP8和VP9解码器实现了这一功能。他还为新的#34;弗吉尼亚州和#34;使用新的GStreamer通用解码器实现来支持基于VA API的解码器的插件。
Nicolas还实现了VideoCodeTestSink:一个小元素,用于计算传入帧的校验和,将它们与已知的良好参考进行比较。这对于创建确保解码器实现中没有回归的测试非常有用。他还在GStreamer中添加了必要的代码,以便对Video4Linux源代码中的分辨率更改做出反应。例如,如果源是HDMI输入,这主要是相关的。
在该框架的大部分历史中,GStreamer主要关注网络上的流媒体。这是一个我们';在这个周期中,我也做出了一些贡献。
我们';我对GStreamer和#39;是WebRTC协议最完整、最灵活的独立实现之一。我';我在GStreamer和#39上工作过;的WebRTC堆栈,并添加了许多功能。我包括了对明确通知候选人结束的支持,以便更快地识别失败的连接。我修改了WebRTC库API,通过将所有信息隐藏在属性后面来确保其线程安全。我还增加了对";优先权";媒体流;现在,设置各种优先级会添加正确的DSCP标记,从而使网络管理员能够相应地对流量进行优先级排序。我显著改进了WebRTC统计信息,通过方便的WebRTC API公开了GStreamer RTP堆栈中的大部分统计信息,尤其是来自RTP抖动缓冲区的统计信息。
Jakub实现了一个RTP报头扩展,使得每帧发送颜色空间信息成为可能;这使GStreamer能够通过RTP共享动态HDR内容。我们实施的扩展与谷歌的提议兼容';libwebrtc团队。通过RTP发送Opus的基本规范仅支持单声道和立体声。Google libwebrtc团队创建了一个名为";多部作品";可以同时发送多个立体声作品流,为两个以上的频道提供服务。Jakub在GStreamer和#39中实现了这一点;s Opus RTP payloader和depayloader。我们';我们实现了RFC 6464,这是一个RTP报头扩展,允许客户端向服务器发送数据包中音频的相对级别(音量);这使得服务器可以优先考虑那些与他人交谈的客户端,而不必解码所有音频。我们';我们还增加了对iSAC编解码器的支持;这是一个传统的音频编解码器,几年前由谷歌在libwebrtc开源。我们';我们添加了一个插件,它封装了编解码器的参考实现,我们';我还编写了一个RTP payloader和depayloader,使GStreamer能够通过RTP发送和接收用该编解码器编码的音频。
作为SK Telecom赞助的Hwangsaeul项目的一部分,我们';我们改进了SRT支持。Raghavendra增加了对身份验证的支持,而Jakub则增加了一种方法,使应用程序能够收到断开连接的通知,并以与SRT演示应用程序兼容的方式向URI添加了更多选项。
GStreamer是一个非常灵活的跨平台框架,我们';我们还做了一些不属于这两大类的改进。
Nicolas实现了对WebM视频中alpha通道解码的支持。这有点特别,因为alpha通道作为第二个视频流传输。他';s还增加了对使用硬件加速解码器(如基于V4L2的解码器)进行解码的支持。
Aaron在核心GStreamer插件集合中添加了第一个专门用于机器学习的元素。它使用ONNX库进行目标检测;我们希望将来使用ONNX库添加更多元素。
Aaron还帮助NICE的Rabindra Harlalka贡献了上游元素,这些元素可以使用AES加密对流进行加密。这只是将CBC模式下的AES应用于具有应用程序提供的密钥的传入流。
Xavier再次对介子构建系统进行了大量改进;特别是,他取代了GStreamer';s的定制pkg配置文件生成器,其中一个是他为介子本身提供的。这确保生成的pkg配置文件与构建系统中的库匹配。
我加了一个";统计数据";属性到身份元素;这使得对管道进行检测以获取用于监控的统计数据变得更容易。我增加了对更新版本"的支持;限制性高";和";进步高中#34分;H.264配置文件与各种GStreamer元素相关。这些配置文件只是现有高配置文件的一个子集。
Jakub改进了D3D11Desktoup插件,将Windows桌面捕捉到DirectX 11纹理。他实现了对跟踪桌面动态分辨率更改的支持,以及对捕获Windows用户帐户控制(UAC)提示的支持。
我改进了由audiomixer和audiointerleave等元素使用的GstAudioAggregator基类,它现在会发出一条QoS消息,告诉应用程序何时因为延迟而丢弃传入缓冲区。
Stéphane将MXF和Matroska解复用器固定在一个框架上,以精确搜索;这样就可以将它们用作视频编辑的来源。
Xavier花了相当多的时间帮助将GStreamer存储库合并为一个存储库。这是整个社区的努力,使我们的CI系统更简单,并且总体上使GStreamer开发人员的生活更轻松。
和往常一样,我们也提供了大量全面的bug修复,但我们不会在这里全部列出。
我们的工程师团队已经为下一个版本计划了许多贡献。其中包括重新设计MPEG PS解复用器以实现更精确的搜索,改进Wayland支持,如GTK3接收器,可利用Wayland#39;s支持硬件视频覆盖,并支持DRM修改器,以实现硬件解码器和显示器之间更高性能的零拷贝。
如果您已经准备好探索GStreamer 1.20,或者对如何利用其令人兴奋的新功能从您的硬件获得最大性能有任何疑问,请随时与我们联系。Collabora和#39;s的多媒体团队随时可以帮助您利用或实施GStreamer的最新功能版本。
请勾选此框,确认您已阅读并接受我们的隐私通知中有关收集/存储和使用您个人数据的条款:*