使用集成英特尔®核芯显卡执行视频编码

在本文中,我们将介绍如何在基于 Linux 的英特尔 GPU 上处理 H.264 视频,以及我们的公司 Inventos 在增强 StreamBuilder(流媒体服务器) 的过程中获得的经验。

 

简介

当英特尔服务器软件开发套件 Beta 版针对 Linux 发布时,我们非常希望在 StreamBuilder — 我们用作Webcaster.pro 后端的多功能媒体服务器软件 中部署英特尔快速视频同步技术。 部署后,StreamBuilder 能够:

  • 从 SDI、IP 多播、RTMP 捕获输入数据流

  • 将几乎任何音频/视频流向 H264 HLS 或 RTMP 转码并重新取样

  • 支持分布式和容错部署方案,从而可在独立和冗余的节点上执行输入、编码和播放

  • 应用过滤器(针对音量标准化\放大、视频去交错处理、裁剪、调整大小等)

  • 拥有灵活的配置(带有自身的 DSL),这允许使用所提到的过滤器等为后续的媒体处理构建管线(甚至树)。

StreamBuilder 基于 libavcodec,不仅完全优化,而且专门针对在 x86 CPU 上使用而设计。 提高 CPU 内核的数量能够显著提升编码速度,但是这较为昂贵,而且除了视频编码之外,还需要在 CPU 上执行任务。 使用 GPU 编码可以提高处理速度、降低处理成本并提供更高的通道/机架单元密度值。

 

英特尔解决方案

它按照以下方式设置:重新编写大部分 StreamBuilder 核心,针对服务器部署英特尔软件开发套件,以获取重要的性能提升。 我们的目标是在“低价”硬件上至少实现 4 个全高清数据流编码。 果然不出意料,目标超出我们的期待。

英特尔的同事也对面向 Linux 服务器的媒体软件开发套件的“真实”使用案例非常感兴趣。 他们非常棒,在开发和部署过程中为我们提供帮助,回答问题,提供代码示例并提供宝贵的建议。

面向服务器的媒体软件开发套件随附了文档和示例,这几乎涵盖了所有用例。 它为我们提供了很大的帮助,并极大地简化了部署。 事实上,我们案例中的部署涉及到将解码/编码/重采样模块更换为使用英特尔核芯显卡功能并支持英特尔快速视频同步的模块。

 

部署硬件和软件

我们使用了采用以下规格的 1 RU(机架单元)服务器:

主板

Supermicro X10SLH-F

CPUs

#1 号英特尔® 至强™ CPU E3-1225 v3、英特尔® 核芯显卡 3000

#2 号英特尔® 至强™ CPU I7-3770、英特尔® 核芯显卡 4000

#3 号英特尔® 至强™ CPU E3-1285 v3、英特尔® 核芯显卡 P4700

随机存取存储器

16 GB

操作系统

Ubuntu 12.04.4 LTS 3.8.0-23-generic

 

主板芯片组必须是 C226 PCH,因为只有这些服务器芯片能够执行硬件编码(截止到撰写本文为止)。 此外,建议使用未采用内置 GPU 的主板,否则 GPU 的身份验证和任务处理将会出现故障。

我们使用的带有内置 GPU 的主板带来了许多麻烦。 首先,英特尔媒体软件开发套件无法识别设备 ID,我们无法启用快速视频同步。 BIOS 更新完所显示的需要执行的设置后,我们还需要使用板载跳线手动关闭主板的 GPU。 虽然配置阻拦了 IPMI 和视频输出,但是我们通过 SSH 访问服务器,所以这不是大问题。

请注意,Linux 内核版本将有一些限制: 在 Ubuntu 12.04 上仅可使用 3.2.0-41 或 3.8.0-23;在 SUSE Linux Enterprise Server 上仅可使用 SP3 3.0.76-11。

结果

CPU:E3-1225 V3、16 GB RMB英特尔® 核心显卡 P4600

 

ffmpeg

sample_full_transcode

streambuilder (未优化)

streambuilder (优化)

时间

8 分 42 秒

1 分秒 19 s

2 分 19 秒

1 分 40 秒

cpu (最大)

750%

55%

125%

50%

mem (最大)

3,3%

4,6%

0.5%

0.4%

PSNR

48,107

46,68

 

 

Average PSNR

51,204

49,52

 

 

SSIM

0,99934

0,9956

 

 

MSE

1,623

2,969

 

 

 

 

CPU: I7-3770, 3 GB RAM, 英特尔® 核心显卡 4000

 

ffmpeg

sample_full_transcode

streambuilder (未优化)

streambuilder (优化)

时间

8 分 48 秒

1 分 24 秒

2 分 31 秒

1 分 23 秒

cpu (最大)

750%

19%

150%

45%

mem (最大)

18%

20%

2.8%

2.3%

PSNR

48,107

46,495

 

 

平均 PSNR

51,204

49,27

 

 

SSIM

0,99934

0,991

 

 

MSE

1,623

3,036

 

 

CPU: E3-1285 v3, 16 GB RAM, 英特尔® 核心显卡 P4700

 

ffmpeg

sample_full_transcode

streambuilder (未优化)

streambuilder (优化)

时间

8 分 1 秒

1 分 11 秒

2 分 11 秒

1 分 34 秒

cpu (最大)

750%

55%

130%

55%

mem (最大)

3,3%

4,6%

0.5%

0,4%

PSNR

48,107

46,68

 

 

平均 PSNR

51,204

49,52

 

 

SSIM

0,99934

0,9956

 

 

MSE

1,623

2,969

 

 

 

StreamBuilder 的信号质量度量值(PSNR、SSIM、MSE)与 sample_full_transcode 值相同,因此我们未在表格中呈现。

 

如上表所示,在我们的测试中,相比采用英特尔核芯显卡 4000 的 i7-3770,采用英特尔核芯显卡 P4700/P4600 的服务器 CPU 性能更高,且能够提供更出色的视频输出质量。 但是这一结论并非一直正确。 英特尔不断改进每一代微芯片和 SDK 版本的视频编码性能。 在最新的微芯片上编码速度稍慢,但是 CPU 负载也较低。 我们不明白是什么原因。

 

英特尔核芯显卡 P4700 编码质量与 P4600 相当,但是在 E3-1285 v3 上在能耗相同时速度快 14%。 此外值得注意的是,E3-1285 v3 使用 ffmpeg 进行编码的速度比 E3-1225 v3 快 10%。

 

安装了 StreamBuilder 并支持快速视频同步技术的服务器能够将一条输入流编码为 12 条全高清 (1080p) HLS 流、24 条高清 HLS 流 (720p) 或 46 条 SD HLS 流 (480p)。

 

此外,优化的内存操作可将 RAM 消耗降低一半。

 

超出我们的最初目标三倍! 现在,我们能够以比以前更低的成本在硬件上多次对更多的数据流进行编码。

 

您也可以尝试 StreamBuilder,通过 ask@streambuilder.pro 向我们发送电子邮件,我们将向您发送分发式演示。

 

结论

面向服务器的英特尔媒体软件开发套件允许构建经济、高编码/转码性能和高机架单元数据流密度的服务器。 部署工作并不是闲庭信步,我们遇到了许多与主板 GPU 有关的问题,但是最终都将其解决。 请注意:硬件需要使用 C226 microchip 和未采用内置 GPU 的主板。

 

该解决方案的优势是:除了能够大幅提升性能之外,还可以大幅降低 CPU 利用率,消耗更少的内存,从而支持在其他任务(甚至额外 CPU 编码)上能够额外使用更多空闲资源。

有关编译器优化的更完整信息,请参阅优化通知