2024年2月4日发(作者:)
在基于 Web 的高清数字视频传输中实现稳定的观看体验有两项基本要求。首先,视频提供程序需要在网络上支持较高的视频传输比特率。其次,客户端计算机需要支持连续的处理能力以全分辨率对视频解码。
而实际情况是,随着时间的推移,家庭联网计算机的网络带宽会出现明显波动,并且在世界上的某些地区,高带宽费用高昂,或只向部分用户提供。与此同时,根据任意给定时刻 CPU 的负载,客户端计算机的处理能力也会有变化。结果就是,在播放器等待缓冲足够的数据以便显示下一组视频帧,或等待 CPU 周期对这些帧进行解码时,视频会断断续续或出现定格,从而使用户的观看体验大打折扣。
自适应流式处理是一种视频传输模式,可流畅地传送视频内容并解决解码问题。使用自适应流式处理,视频内容在一定比特率范围内进行编码,并通过专用的流式处理服务器提供。自适应流式处理播放器一直监视客户端计算机上的各种资源利用率指标,使用这些信息计算相应的比特率。在给定的现有资源约束下,客户端能以此比特率最高效地解码和显示。
播放器请求以当前相应比特率编码的视频数据块,流式处理服务器用以此比特率编码的视频源中的内容进行响应。结果是,当资源状况不佳时,播放器可继续显示视频而不会有任何明显干扰,只是整体分辨率会略有降低,直到资源状况的提高或进一步降低导致请求不同的比特率。
若要在播放器和服务器之间实现这种连续的协作,要求流式处理服务器和实现播放器的客户端运行时中都存在专门的处理逻辑实现。Internet Information
Server (IIS) 平滑流式处理是 Microsoft 推出的通过 HTTP 进行自适应流式处理的服务器端实现。客户端实现作为 Microsoft Silverlight 的扩展提供。
IIS 平滑流式处理播放器开发工具包是一个 Silverlight 库,它使应用程序能够使用通过 IIS 平滑流式处理功能流式处理的内容。该工具包还提供一个功能丰富的 API,用于提供对平滑流式处理逻辑各方面的编程访问。
在本文中,我将逐步向您介绍平滑流式处理的基础知识,解释如何使用 IIS
平滑流式处理播放器开发工具包创建丰富的用户视频体验。具体而言,我将介绍如何使用播放器开发工具包使用流,进一步检查流和轨道的客户端数据模型。我将向您演示如何使用额外的数据流,如隐藏字幕和动画,以及将外部数据流与现有影片合并。您将了解如何在影片内安排如广告这样的外部剪辑,处理变化的播放速度以及生成造就强大编辑方案的复合清单。
平滑流式处理工作方式
可以使用 Expression Encoder 3.0 提供的配置文件之一对视频编码以便进行平滑流式处理。对于一个源视频文件,会在目标文件夹中创建几个文件。图 1
显示了为一个名为 的源视频创建的文件。
图 1 Expression Encoder 为平滑流式处理生成的文件
每个带有 .ismv 扩展名的文件都包含以特定比特率编码的视频。例如,FighterPilot_ 包含以 331 Kbps 比特率编码的视频,而
FighterPilot_ 包含以 2 Mbps 编码的视频。
对于每种比特率,视频内容都拆分为两秒的片段,.ismv 文件以一种名为受保护互操作文件格式 (PIFF) 的文件格式存储这些片段。请注意,可以在具有 .isma 扩展名的类似文件中编码附加音轨(或只是音频,在影片为纯音频时)。
获得平滑流式处理环境
若要试用本文中讨论的示例,需要在开发计算机上准备平滑流式处理环境。
服务器端的要求非常简单:您需要使用 Microsoft Web Platform Installer
从 /media 下载并安装 IIS Media Services 3.0 for IIS7。
需要 Microsoft Expression Encoder 3.0 的一份副本来为平滑流式处理准备视频。虽然有免费的 Expression Encoder 3.0 评估版,但该版本不包含平滑流式处理支持。您需要 Expression Encoder 的许可安装来创建自己的视频。
有关准备环境的更多详细信息,请访问
//558/smooth-streaming-for-iis-70---getting-started。
文件是一个服务器清单,其结构采用的是同步多媒体整合语言 (SMIL) 格式,并且包含质量等级和比特率对 .ismv 和 .isma 文件的映射。服务器清单中的此映射由服务器用来访问正确的磁盘文件,以便在响应客户端请求前创建以正确的比特率编码的下一段内容。图 2 显示了一段服务器清单文件的摘录。
图 2 示例服务器清单
content="" />
...
服务器清单还包含到客户端清单文件的映射(由扩展名 .ismc 标识),在我的示例中为 。客户端清单包含 Silverlight 客户端访问不同媒体和数据流所需的全部信息,以及关于这些流的元数据,如质量等级、可用比特率、定时信息、编解码器初始化数据等。客户端逻辑将使用此元数据对数据段采样和解码,并根据主导的本地条件请求比特率切换。
运行时,影片以从服务器请求客户端清单的客户端开始。客户端收到清单后,就会检查可用比特率并从最低可用比特率开始请求内容片段。作为响应,服务器从磁盘文件读取以该比特率(使用服务器清单中的映射)编码的数据,从而准备并发送片段。然后,内容将显示在客户端。
客户端逐步请求资源监视逻辑所允许的更高比特率,最终达到由主导资源状况决定的所允许的最高比特率。这一交换持续进行,直到客户端监视逻辑感测到的资源状况变化导致需要不同的更低比特率。后续客户端请求针对的是以新比特率编码的媒体,服务器再次做出相应的响应。这一行为持续进行到影片完成或停止。
使用 Silverlight 进行平滑流式处理
在 Silverlight 中播放视频非常简单。从根本上说,您需要做的全部工作就是在您的 XAML 文件中添加 MediaElement 类型的一个实例,设置适当的属性
以控制 MediaElement 行为,以及确保 属性指向有效的媒体源 URI。例如,在 Silverlight 页面启动后,以下 XAML 将自动在 640x360
的矩形中播放 视频:
Source="localhost/Media/" Width="640" Height="360" /> lement 类型还公开一个 API,使用它可以在代码中控制播放行为并生成一个包含如 Play、Pause、Seek 等标准控件的全功能播放器。对于渐进下载或 HTTP 流式处理的媒体,只要使用的是 Silverlight 运行时内置支持的容器格式和编码方式,这种方法就非常有效。 如果使用 Silverlight 不直接支持的文件格式或编解码器该怎么办?MediaStreamSource (MSS) 类型启用了一种可扩展性机制,允许您通过在 Silverlight 媒体管道中引入自己的自定义分析器和解码器控制媒体文件分析和解码过程。为此,您需要实现一个扩展抽象 treamSource 的具体类型,然后使用 rce 方法将它的一个实例传递给 MediaElement。 MSS 实现将需要处理媒体使用过程中除实际呈现之外的每个方面:从接收远程位置的媒体流到分析容器和相关元数据,再到采取各个音频和视频样本并将它们传入 MediaElement 以进行呈现。 因为解码平滑流式处理所需的逻辑没有内置到 Silverlight 中,所以第一个版本的平滑流式处理(IIS Media Services 2.0 的一部分)附带了一个自定义 MSS 实现,该实现处理所有通信、分析和采样逻辑,还实现计算机和网络状态监视功能。 对于大多数情况,此方法对平滑流式处理非常有效,但也有一些缺点。MSS 实质上是一个黑盒,因为它直接公开的唯一 API 的用途是促进它本身与 MediaElement 之间的原始音频和视频样本的交换。Silverlight 开发人员在操作中没有与 MSS 交互的直接方法。如果所使用的内容有其他数据,如嵌入文本、动画或辅助相机角度,或者如果流式处理解决方案允许对流进行更精细的控制(如可变播放速度),则您不能通过编程以结构化方式访问这些附加数据,因为您只能与 MediaElement 一直公开的固定 API 集交互。 这对平滑流式处理提出了一个挑战。您在本文后面将看到,平滑流式处理清单和传输/文件格式从可承载的附加内容和元数据角度而言十分丰富,而通过 MSS 方法不能处理这些信息。您需要一个 Silverlight API,通过它提供对平滑流式处理解决方案的更多控制和访问。 IIS 平滑流式处理播放器开发工具包 这种情况使我转向了 IIS 平滑流式处理播放器开发工具包。此播放器开发工具包只包含一个名为 的程序集。其核心是一个名为 StreamingMediaElement (SSME) 的类型。在代码中使用 SSME 与使用常规 MediaElement 的方式几乎完全相同: XMLns="/winfx/2006/xaml/presentation" XMLns:x="/winfx/2006/xaml" xmlns:ss="clr-namespace:Streaming;assembly=Streaming"> Width="640" Height="360" SmoothStreamingSource="localhost/SmoothStreaming/Media/FightERPilot//manifest"/> SmoothStreamingSource 属性将 SSME 指向一个有效的平滑流式处理影片。通常,SSME API 是 MediaElement API 的超集;此属性是两者之间的几处不同点之一。SSME 像 MediaElement 一样公开 Source 属性,但 SSME 还公开 SmoothStreamingSource 属性以附加到平滑流。如果要使制作的播放器既能使用平滑流又能使用 MediaElement 以往支持的其他格式,您可以放心使用 SSME,但很可能需要编写一些代码来设置正确的属性以附加到媒体源。类似如下输出: private void SetMediaSource(string MediaSourceUri, SmoothStreamingMediaElement ssme) { if (ns(".ism")) StreamingSource = new Uri(MediaSourceUri); else = new Uri(MediaSourceUri); } 要注意的其他主要区别是 SSME 不公开接受 MediaStreamSource 类型的 SetSource 重载。如果需要使用自定义 MSS,应通过 MediaElement 进行。 流和轨道 平滑流式处理客户端清单包含关于影片的丰富元数据,可用于以编程方式访问播放器应用程序中的元数据。SSME 通过一个明确定义的 API 以流和每个流中的轨道这样的排列公开此元数据的各个部分。 流表示特定类型轨道的所有元数据:视频、音频、文本、广告等等。流还充当基础类型相同的多个轨道的容器。在客户端清单(请参见图 3)中,每个 StreamIndex 条目表示一个流。一个影片中可以有多个流,如多个 StreamIndex 条目所示。还可以有相同类型的多个流。在这种情况下,可以使用流名称来区分同一类型的多个实例。 图 3 客户端清单摘录 Duration="1456860000"> MaxWidth="1280" MaxHeight="720" DisplayWidth="1280" DisplayHeight="720" Url="QualityLevels({bitrate})/Fragments(video={start time})"> MaxWidth="1280" MaxHeight="720" CodecPrivateData="250000010FD37E27F1678A27F859E80490825A645A64400000010E5A67F840" /> MaxWidth="992" MaxHeight="560" CodecPrivateData="250000010FD37E1EF1178A1EF845E8049081BEBE7D7CC00000010E5A67F840" /> ... ... Chunks="73" QualityLevels="1" Url="QualityLevels({bitrate})/Fragments(audio={start time})"> Channels="2" BitsPerSample="16" PacketSize="2973" AudioTag="354" CodecPrivateData="1000E00042C0" /> ... TimeScale="10000000" ParentStreamIndex="video" ManifestOutput="TRUE" QualityLevels="1" Chunks="2" Url="QualityLevels({bitrate},{CustomAttributes})/Fragments(ClosedCaptions={start time})"> CodecPrivateData="" FourCC=""/> ... StreamInfo 类型表示 Silverlight 代码中的流。SSME 下载客户端清单后,会引发 stReady 事件。这时 bleStreams 集合属性为客户端清单中的每个 StreamIndex 条目包含一个 StreamInfo 实例。 对于客户端清单中的给定视频流,视频轨道拆分为多个持续时间为两秒的片段,清单中的每个 c 元素表示该片段的元数据。在这种情况下,轨道中的片段是连续的,不中断地定义视频轨道的完整持续时间 — 换句话说,流不是稀疏的。 对于隐藏字幕流,轨道只包含两个片段,每个片段各自有定时信息(c 元素的 t 属性)。此外,ParentStreamIndex 属性设置为“video”,使视频流成为隐藏字幕流的父级。这使得隐藏字幕流与来自视频流的定时信息对应起来:隐藏字幕流正好与其父视频流一起开始和结束,第一个字幕在视频流中显示 10 秒,而第二个在视频中显示 15 秒。如果一个流中的时间线基于父流,并且片段是不连续的,则该流称为稀疏流。 轨道是特定类型内容(视频、音频或文本)片段的定时序列。每个轨道都使用一个 TrackInfo 类型的实例表示,流中的所有轨道通过 bleTracks 集合属性提供。 客户端清单中的每个轨道都通过一个 QualityLevel 唯一标识。QualityLevel 通过关联比特率标识,通过 e 属性公开。例如,一个客户端清单中的一个视频流可以有多个 QualityLevel,每个 QualityLevel 都有唯一的比特率。每个 QualityLevel 表示相同视频内容的唯一轨道,以 QualityLevel 指定的比特率编码。 自定义属性和清单输出 自定义属性是向清单中添加其他特定于流或轨道的信息的一种方法。自定义属性是使用 CustomAttribute 元素指定的,该元素可包含以键/值对表示的多个数据元素。每个数据元素都表示为一个 Attribute 元素,使用 Key 和 Value 属性指定数据元素键和数据元素值。在不应用不同质量水平的情况下,如一个流中的多个轨道具有相同的轨道名和比特率时,还可以使用自定义属性对轨道进行区分。图 4 显示了一个自定义属性用法示例。 图 4 在客户端清单中使用自定义属性 MaxWidth="1280" MaxHeight="720" DisplayWidth="1280" DisplayHeight="720" Url="QualityLevels({bitrate})/Fragments(video={start time})"> MaxWidth="1280" MaxHeight="720" CodecPrivateData="250000010FD37E27F1678A27F859E80490825A645A64400000010E5A67F840"> ... 添加到清单中的自定义属性不会自动影响任何 SSME 行为。它们是生产工作流在清单中引入播放器代码可接收和操作的自定义数据的一种方法。例如,在图 4 中,您可能想要在视频流自定义属性集合中查找 AccessLevel 自定义属性键,并根据属性值的指示仅向付费订阅者公开该视频流。 Attributes 集合属性公开在流级别应用的所有自定义属性的字符串键/值对(作为 StreamIndex 元素的直接 CustomAttribute 子元素)。Attributes 属性对在轨道级别应用的所有自定义属性也公开相同的内容(作为 QualityLevel 元素的直接子级)。 当流的 ManifestOutput 属性(StreamIndex 元素)设置为 TRUE 时,客户端清单实际上可包含表示流中轨道的每个片段的数据。图 5 显示了一个示例。 图 5 清单输出 MaxWidth="1280" MaxHeight="720" DisplayWidth="1280" DisplayHeight="720" Url="QualityLevels({bitrate})/Fragments(video={start time})"> MaxWidth="1280" MaxHeight="720" CodecPrivateData="250000010FD37E27F1678A27F859E80490825A645A64400000010E5A67F840"> ... 请注意 f 元素内的嵌套内容,每个均表示要在包含区块所指定的时间显示的字幕项数据。客户端清单规范要求数据表示为原始数据项的 base64 编码的字符串版本。 ata 集合属性包含一个 TimelineEvent 实例列表:每个实例对应于轨道的一个 f 元素。对于每个 TimelineEvent 条目,ime 表示序列中的时间点,ata 提供 base64 编码的文本字符串。TrackInfo 还支持 Bitrate、CustomAttributes、Index、Name 和 ParentStream 属性。


发布评论