基于GStreamer的开源自适应流媒体MPEG-Dash流生成

2020-06-13 02:53:25

自适应流式传输是一种通过向客户端提供可变比特率流来提供灵活性和可扩展性的技术。专为在HTTP上工作而设计,它将媒体内容作为具有媒体类型和各种比特率的单独流提供,客户端将能够根据其网络带宽或CPU能力进行选择。

MPEG-DASH是最完整的自适应流媒体技术。该格式基于称为MPD(媒体演示描述)的XML描述文件。该格式描述具有媒体类型(音频、视频或字幕)并提供各种比特率或媒体格式的一组表示。

该解决方案是一个开放标准,受到业界的广泛支持。有关它的更多信息,您可以访问DASH-IF网站。

在下面的示例中,MPD描述了具有三种媒体内容类型(适配集)的静态内容。每个调整集都包含表示法。视频有5种不同的表示方式,可以根据播放约束切换到5种不同的码率。

<;mpd mediaPresentationDuration=";PT634.566S";minBufferTime=";PT2.00S";profiles=";urn:hbbtv:dash:profile:isoff-live:2012,URN:mpeg:DASH:PROFILE:ISOFF-LIVE:2011";TYPE=";STATIC";XMLNS=";URN:mpeg:DASH:SCHEMA:mpd:2011";xmlns:xsi=";http://www.w3.org/2001/XMLSchema-instance";xsi:schemaLocation=";urn:mpeg:dash:schema:mpd:2011 dash-MPD.xsd";>;<;BaseURL>;。/<;/BaseURL>;<;句号>;<;AdaptationSet id=";1";mimeType=";video/mp4";contentType=";video";subSegmentAlignment=&。media=";$RepresentationID$/$RepresentationID$_$Number$.m4v";开始编号=";1";initialization=";$RepresentationID$/$RepresentationID$_0.m4v";/>;<;表示id=";bbb_30fps_1280x720_4000K";编解码器=";avc1.64001f";带宽=";4952892";宽度=";1280";高度=";720";帧。30";sar=";1:1";scanType=";渐进式";/>;<;表示id=";bbb_30fps_320x180_200k";编解码器=";avc1.64000d";带宽=";254320";宽度=";320";高度=";180";帧率=。<;表示id=";bbb_30fps_480x270_600k";编解码器=";avc1.640015";带宽=";759798";宽度=";480";高度=";270";帧率=";30";SAR=";1:1";扫描类型=";渐进式"。带宽=";1013310";宽度=";640";高度=";360";帧率=";30";sar=";1:1";scanType=";渐进式";/&>;<;表示id=";bbb_30fps_3840x2160_12000k&34;编解码器=";avct;帧速率=";30";sar=";1:1";scanType=";渐进式&34;/>;<;/AdaptationSet>;<;AdaptationSet id=";2";mimeType=";音频/MP4";contentType=";音频";子段对齐=";true&。值=";6";/>;<;角色架构IdUri=";urn:mpeg:破折号:角色:2011年";值=";主";/>;<;段模板持续时间=";192512";时间刻度=";48000";media=";$RepresentationID$/$RepresentationID$_$Number$.m4a";开始编号=";1";initialization=";$RepresentationID$/$RepresentationID$_0.m4a";/>;<;表示ID=&#。bbb_a64k";编解码器=";mp4a.40.5";带宽=";67071";音频采样率=";48000";>;<;音频频道配置schemeIdUri=";urn:mpeg:dash:23003:3:audio_channel_configuration:2011";值=";2";/<;<;/表示<;<;/适配设置&><;适配(AdaptationSet<;<;AdaptationSet<;media=";$RepresentationID$/tile_$Number$.jpg";/jpeg";contentType=";Image";>;<;段模板图像持续时间=";100";开始编号=";1";/>;<;表示带宽=";12288";id=";缩略图_320x180";宽度=";3200";高度=";180&#。http://dashif.org/thumbnail_tile";值=";10x1";/&><;/表示&><;/适配集合&>;<;/期间&>;<;/mpd>;

自2012年以来,GStreamer只包含一个名为dashdemux的DASH客户端,而对于HLS,它提供了两个元素:解复用器和接收器。

该元素于2012年登陆GStreamer存储库,从那时起已经发生了很大变化,以支持DASH在其规范和应用程序中提供的各种用例。实际上,它能够支持多个流(视频/音频/字幕),并允许用户从可用的流o中选择

2014年,引入了一个名为Splitmuxink的新元素。它处理创建分段流的最复杂部分,它用同步的音频和视频剪切文件。基于此元素,2017年创建了一个名为hlssink2的新HLS接收器。我最终决定基于这种方法创建一个破折号接收器来填补GStreamer中的空白。

为了统一MPD支持,首要任务是重新定位和重新设计基类,以读取和写入MPD文件。基于XML,媒体呈现描述方案基于如上所述拥有子节点和属性的多个节点。第一个重要的工作项目是将代码拆分到每个对象中,每个对象标识来自MPD架构的一个XML节点,包括根节点、句点、适配集等。选择了面向对象的方法来统一关于解析、对象属性操作和XML格式生成的工作。

受hlssink2工作的启发,破折号接收器是一个超级存储箱,并包括一个拆分器以提供多个媒体段。在这里,最大的挑战是编写符合DASHIF一致性测试的MPD,这里有可用的和合适的媒体段。

TS分段支持(MP4支持尚未完成),短分段方案中的分段过渡需要额外工作。

在下面的管道中,在/tmp中创建了一个静态MPD文件,并在60s的时间段内创建了一个用于单个视频流的单个段。该段将被编码为H.264并封装在MPEG传输流文件中。

$gst-Launch-1-m仪表盘名称=仪表盘mpd-根路径=/tmp目标-持续时间=60动态=假期间-持续时间=60000复用器=ts v4l2src!视频/x-RAW,帧率=30/1,宽度=320,高度=240!视频转换!排队!x264enc比特率=400!dashsink.video_0。

未来的工作包括实现对遵循CMAF(MPEG-A Part 19)规范创建MP4片段文件的支持。

如果您想了解更多关于仪表盘或GStreamer任何其他部分的信息,请与我们联系!

请勾选此框以确认您已阅读并接受我们关于收集/存储和使用您的个人数据的隐私声明条款:*