可扩展视频编码(SVC)是什么?可扩展视频编码的原理、优缺点及实现方式

您是否经历过观看视频因网速慢而不流畅的苦恼?也许可扩展视频编码 (SVC) 就是您的终极救星!想象一下:一个视频流可以无缝地适应任何屏幕尺寸、带宽容量甚至观众的偏好。

SVC 的工作原理是对视频进行分层编码,类似于剥洋葱。每一层都增加了特定的细节,如更高的分辨率或更流畅的动作,并可针对功率较低或连接不可靠的设备进行剥离。这样可以确保每个人都能享受到他们的技术所能处理的最佳视频版本——不再有缓冲噩梦!

在本文中,我们将深入研究可扩展视频编码 (SVC) 技术,探讨它的工作原理,优点和缺点,以及如何在音视频开发中实现它。

可扩展视频编码(SVC)是什么?

SVC 是可扩展视频编码(Scalable Video Coding)的缩写,它建立在 H.264/MPEG-4 压缩标准的基础上,能对嵌入较低分辨率子视频的高质量视频进行编码。单个 SVC 视频比特流可以有多个视频质量层,因此具有不同功能的设备可以根据其资源播放相应的层。

其主要优点是可在多个维度上进行扩展:帧速率、分辨率和保真度。基本设备可能只能以较低分辨率解码 SVC 流中的某些帧。相反,高端设备可以完全解码同一数据流的最高分辨率。通过这种方式,不同设备之间的回放可以相互适应,而无需进行视频格式转换。

随着越来越多的平台播放视频,SVC 实现了高效的网络传输。现在,单个编码视频可满足不同设备的需求。H.264 的向后兼容性也使 SVC 适用于互联网视频、广播、会议和其他可覆盖多种设备类型的应用程序。

H.264 的可扩展性和重复使用性赋予了 SVC 优势。它非常适合异构播放场景。很酷吧?现在你知道 SVC 背后的基本理念了吧!让我们来探讨一下它的实际工作原理。

可扩展视频编码(SVC)如何工作

SVC 听起来像是一个花哨的技术术语,但其内在工作原理却出人意料地简单明了。这就是 SVC 如何为您的屏幕带来流畅、合适的视频流:

多层次

把视频想象成洋葱。SVC 可创建不同的层,每个层包含一部分视频数据。就像最外层的洋葱皮一样,第一层包含了最基本的视频内容–即使在网络连接不稳定的情况下,也足以了解场景的要点。随后的每一层都会添加更多细节,如更清晰的视觉效果、更高的分辨率等。

智能设备,明智选择

你的设备,无论是手机、笔记本电脑还是智能电视,都是挑剔的观众。它会评估自己的能力,如可用带宽和处理能力,并从 SVC 流中选择完美的层。这样就能确保流畅播放,不会出现缓冲或像素化的噩梦。

适应性是关键

SVC 的魅力在于其灵活性。需要在手机上快速预览视频?抓取低分辨率层。要在大屏幕上通过快如闪电的 Wi-Fi 观看电影?那就直接观看高清晰度的精彩视频吧。SVC 可根据您的情况进行调整,每次都能提供最佳的观看体验。

因此,SVC 不仅仅是为了节省带宽,更是为了根据您的特定需求量身定制视频体验。这就好比有一位私人厨师为每台设备和每种观看场景烹制完美的菜肴。

可扩展视频编码(SVC)的优缺点

优点:

  • 可以根据需要产生不同的码流或者提取出不同的码流,使用分层视频编码实现一次编码比用普通编码方式编码多次更高效。
  • 应用更灵活。
  • 网络适应性更强。

缺点:

  • 压缩效率稍低:在同样的条件下,分层视频编码比普通编码方式的压缩效率低 20% 左右,即要达到和普通编码方式相同的视频质量,分层视频编码的码率比普通编码方式多 20%,分层数越多,效率下降越多。
  • 编码效率低:分层视频编码在同样的条件下,比普通编码方式的编码计算复杂度高,所以编码效率相比普通编码方式约低 10%。
  • 不支持硬件编码(支持硬件解码):分层视频编码不支持硬件编码,对 CPU 的性能负担较大。
  • 支持的编码器较少,目前只有 openH264 编码器支持。

如何实现SVC功能?

当开发者的连麦或混流业务场景中,出现以下要求时,推荐使用ZEGO 音视频 SDK 提供的 视频分层编码(H.264 SVC))或 视频大小流编码 功能:

  • 需要不同终端显示不同质量的视频流。
  • 需要在较差的网络环境中,保持连麦的通畅。
  • 需要根据网络状态,自适应拉取视频流的质量。

实现SVC前提条件

实现步骤

注:以 iOS 平台为例。

1 开启分层视频编码

在调用 startPublishingStream 之前,调用 setVideoConfig 接口,设置 ZegoVideoConfig 类中的参数 codecIDZegoVideoCodecIDSVC,开启分层视频编码;并调用 startPublishingStream 接口开始推流。

ZegoVideoConfig *videoConfig = [[ZegoVideoConfig alloc] init];
videoConfig.codecID = ZegoVideoCodecIDSVC;
[[ZegoExpressEngine sharedEngine] setVideoConfig:videoConfig];

self.streamID = @"0012";
[[ZegoExpressEngine sharedEngine] startPublishingStream:self.streamID];

2 指定拉取的分层视频

在推流端开启了分层视频编码后,拉流端用户在拉流前后均可调用 setPlayStreamVideoType 接口,传入具体的拉流参数以拉取特定的视频分层。目前支持的视频分层如下:

枚举值说明
ZegoVideoStreamTypeDefault(默认值)根据网络状态自动选择合适的视频分层,例如弱网只拉取基本层。
ZegoVideoStreamTypeSmall基本层,小分辨率类型。
ZegoVideoStreamTypeBig扩展层,大分辨率类型。
[[ZegoExpressEngine sharedEngine] setPlayStreamVideoType:ZegoVideoStreamTypeBig streamID:self.streamID];
[[ZegoExpressEngine sharedEngine] startPlayingStream:self.streamID canvas:playCanvas];

详细开发文档请参考:视频大小流和分层编码

本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/yinshipin/44300.html

(0)

相关推荐

发表回复

登录后才能评论