Intel MediaSDK2021R1中的sample_encode

岳英锐
2023-12-01

sample_encode

概述

编码示例与hIntel®MediaSDK(以下简称“SDK”)配合使用。

它演示了如何使用 SDK API 创建一个简单的控制台应用程序,该应用程序执行对数据的预处理和编码,根据特定视频压缩标准的未压缩视频流。

该示例还展示了如何集成用户定义的 用于视频处理的函数(图片旋转插件示例)到 SDK 编码管道中。 该示例可与 HEVC 解码器和编码器(以下简称“HEVC”)配合使用。 注意:要运行HEVC,请仔细阅读“HEVC插件”部分中的说明。

特征

编码示例支持以下视频格式:

格式类型
输入(未压缩)YUV420, NV12
输出(压缩)H.264(AVC,MVC–Multi-ViewCoding),H.265(withHEVC),MPEG-2video,JPEG*/MotionJPEG,HEVC(HighEfficiency VideoCoding

注意:对于格式 YUV420,编码示例假定输入文件中的顺序为 Y、U、V。

硬件、软件、如何构建应用程序以及运行软件参见《Media_Samples_Guide_Windows.pdf》。

使用

①可在安装路径下的bin目录使用命令行窗口。

②vs打开sample_encode.sln解决方案,添加命令参数:配置-》配置属性-》调试-》命令参数-》相关命令。

可执行文件需要以下命令行开关才能正常运行:

选项说明
h264\h265
-i(未压缩)视频文件、名称和路径。 必须为每个输入的 YUV 文件指定 MVC-ioption。只有 2 个支持的视图
-o输出(压缩)视频文件、名称和路径
-w输入视频帧的宽度
-h输入视频帧的高度

以下命令行开关是可选的:

选项描述
[-b] bitRate编码比特率(千比特每秒),适用于 H.264、H.265、MPEG2 和 MVC 编码器
[-f] frameRate视频帧率(每秒帧数)
[-u] usage目标用法,适用于 H.265、H.264、H.265、MPEG2 和 MVC 编码器。 预期值: 非常慢(质量),较慢,慢,中(平衡),快,较快,非常快(速度)
[-d3d]d3d11渲染显示
[-hw] hardware使用特定于平台的 SDK 实现(默认) ,硬编码
[-sw] softWare使用软件实现,如果没有指定平台特定的SDK实现则使用
[-dstw] / [-dsth]目标图片宽度和高度,调用VPPresizing
[-n] number要处理的帧数
[-q] qualityJPEG 编码器的强制质量参数。 范围内[1,100]。 100是最好的质量。
[-nv12]输入颜色格式(默认为 YUV420)。
[-tff/bff]输入流是隔行扫描的,顶部|底部字段优先,如果未指定则为渐进式
[-d3d]使用 d3d 曲面
[-d3d11]使用 d3d11 曲面

用户模块选项:

选项描述
[angle180]编码前启用180度图片旋转,默认CPU实现。 旋转需要 NV12 输入。选项 tff\
[-opencl]旋转实现通过OPENCL。例子:./sample_encode h264|h265|mpeg2|mvc|jpeg -i InputYUVFile -o OutputEncodedFile -w width -h height -angle 180 -opencl

如果在编译期间启用了 V4L2 支持,则可以使用其他选项:

选项描述
-d设备视频节点(eg:/dev/video0)
-pMipi 端口号(例如:端口 0)
-mMipi 模式配置 [预览/连续/静止/视频]
-uyvy输入原始形式 attypes V4L2 编码
-YUY2输入原始形式 attypes V4L2 编码
-i::v4l2启用 v4l2 模式

下面是执行编码示例的命令行示例:

前提条件:打开命令行窗口切换到MEDIASDK2021R1的安装路径中的bin目录中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xiCnIEZe-1625368349067)(C:\Users\86189\AppData\Roaming\Typora\typora-user-images\image-20210701165520437.png)]

$ sample_encode h264 -i input.yuv -o output.h264 –w 720 –h 480 –b 10000 –f 30 –u quality –d3d –hw

①解释如下:

sample_encode:可执行文件

h264:选项,h264方式编码

参数[-i]:后接输入的未压缩的文件的路径,注意输入文件规定格式为:YUV420,NV12

input.yuv:当前路径下的输入文件,yuv格式。

参数[-o]:后接输出文件路径

output.h264:输出到当前目录下并保存为output.h264。

参数[-w]:输入视频帧的宽度,注意是输入,输入的output.h264文件的宽高等同指定的宽高。

参数[-h]:输入视频帧的高度。

参数[-b]:指定编码比特率(千比特每秒)为10000bit/s。

参数[-f]:指定视频帧率(每秒帧数)为30fps。

参数[-u]:指定用法为quality,即非常慢。

参数[-d3d]:d3d渲染显示。

参数[-hw]:默认硬编码。

$ sample_encode mpeg2 -i input.yuv -o output.mpeg2 –w 1920 –h 1080 –b 15000 -u speed –nv12 –tff -hw

参数[-nv12]:输出格式为以nv12采样格式存储的文件

参数[-tff]:

$ sample_encode h264 -i input.yuv -o output.h264 –w 1920 –h 1080 –dstw 360 –dsth 240 –b 1000 –u balanced -hw

参数[-dstw] :目标图片宽度为240。

注意1:您需要安装 HEVC 才能使用 h265 编解码器运行。 在硬件库的情况下,它会首先尝试加载硬件 HEVC 插件。

以防万一,会尝试可用的软件库。

Tip:

为了获得更好的性能,请使用 NV12 颜色格式的输入流。 如果输入流为 YUV420 格式,则每一帧都被转换为 NV12 会降低整体性能。

HEVC 编码插件

HEVC 编解码器作为插件实现,与 MPEG2 和 AVC 等编解码器不同。 HEVC 编码器有 3 种实现方式: 硬件 (HW)、软件 (SW) 和 GPU 加速 (GACC) 插件。

注 1:HEVC SW 和 GACC 插件仅在 HEVC 软件包中可用,该软件包是英特尔®媒体软件开发套件的一部分 4 编码示例 API2018。 您可以从 $MFX_ROOT/include/mfxplugin.h 文件中找到可用的插件及其 ID。

注 2:从第六代英特尔酷睿处理器、英特尔® 至强® E3-1200 和 E3- 开始支持 HEVC 编码的硬件插件 1500v5 家族,采用英特尔® 处理器显卡 500 系列(代号 Skylake)。

注3:编码示例默认加载带有硬件库的硬件 HEVC 编码插件和带有软件库的软件编码插件。 你可以强制执行一个 通过使用“-p”参数和十六进制 GUID 指定插件 ID 来加载插件。

使用硬件库运行 HW HEVC 编码器的示例:

$ sample_encode h265 -i input.yuv -o output.h265 –w 720 –h 480 –b 10000 –f 30 –u quality

$ sample_encode h265 -i input.yuv -o output.h265 –w 720 –h 480 –b 10000 –f 30 –u quality -hw

运行 SW HEVC 编码器的不同方式(第一个示例使用 软件库,第二个示例使用 硬件库):

$ sample_encode h265 -i input.yuv -o output.h265 –w 720 –h 480 –b 10000 –f 30 –u quality -sw

$ sample_encode h265 -i input.yuv -o output.h265 –w 720 –h 480 –b 10000 –f 30 –u quality -p 2fca99749fdb49aeb121a5b63ef568f7

要运行 HEVC GACC 编码器,您必须使用 GUID 指定“-p”参数。 请注意 GACC 插件仅适用于硬件库。 以下命令行将强制示例使用 HEVC GACC 编码插件:

$ sample_encode h265 -i input.yuv -o output.h265 –w 720 –h 480 –b 10000 –p e5400a06c74d41f5b12d430bbaa23d0b $ sample_encode h265 -i input.yuv -o output.h265 –w 720 –h 480 –b 10000 –p e5400a06c74d41f5b12d430bbaa23d0b -hw

要以 10 位模式运行 HEVC 插件,您必须指定“-ec::p010”或“-p010”选项:

$ sample_encode h265 -i input.yuv -o output.h265 -w 720 -h 480 -b 10000 -ec::p010

$ sample_encode h265 -i input.p010 -o output.h265 -w 720 -h 480 -b 10000 -p010

已知限制

  • 并非支持所有可选开关的组合。 如果指定了选项–angle 180 或–opencl,则options-tff|bff, - dstw、-dsth、-d3d 和 MVC 输出不可用
  • Encoding Sample 如果用 –opencl 选项运行, 要求输入视频帧宽度按 4 对齐。
  • 如果使用 HEVC 插件(h265 视频类型),默认使用的插件类型(硬件或软件)取决于 -sw 或 -hw 示例选项。但是,硬件 HEVC 插件仅适用于特定的 cplat 形式。 强制使用特定的 HEVC 插件 实现,请使用 -poption 和正确的插件 GUID。 示例在将非英特尔 VGA 控制器作为第一个(主要)控制器的系统上可能无法正常运行,因为英特尔设备不是 列表中的第一个 要解决此问题,请交换 DRI 设备文件的名称:$ cd /dev && mv card0 tmp && mv card1 card0 && mv tmp card1 并对文件 control64/65 执行相同操作并渲染 D128/129
  • 由于库限制,HECV 10Bit 编码仅适用于 HEVC SW 插件

总结

sample_encode.exe 支持两种编码器:h264 和 h265

①h264包含的编码类型:AVC,MVC–Multi-ViewCoding

②h265(withHEVC)包含的编码类型:,MPEG-2video,JPEG*/MotionJPEG,HEVC(HighEfficiency VideoCoding

注意:需要安装 HEVC 才能使用 h265 编解码器运行

使用sample_encode.exe编码必须指定输入视频/图片的宽高!!!使用jpeg编码时必须指定[-q]选项,即编码器的强制质量参数。 范围内[1,100]。 100是最好的质量。

支持JPEG编码

JPEG编码

专用词汇及缩写

SDK英特尔®媒体软件开发套件
API应用程序编程界面
DECODE视频解码
EXIF*数码相机使用的图像文件格式
JFIF*数码相机使用的图像文件格式
JPEG*图片压缩算法
Motion JPEG使用 JPEG 的动态图像压缩算法
NV12原始视频帧的 YCbCr 4:2:0 颜色格式
RGB4原始照片的 RGB 颜色格式,或 RGB32

编码程序

JPEG编码程序伪代码

// encoder initialization
MFXVideoENCODE_Init (…);
// single frame/picture encoding
MFXVideoENCODE_EncodeFrameAsync (…);
MFXVideoCORE_SyncOperation(…);
// close down
MFXVideoENCODE_Close(…);

编码支持 JPEG 基线配置文件编码如下:

  • 基于 DCT 的流程
  • 源图像:每个组件中的 8 位示例
  • 顺序
  • 霍夫曼编码:2个交流和2个直流表
  • 3个可加载量化矩阵
  • 交错和非交错扫描
  • 单次和多次扫描
  • 色度子采样比:
    • 色度 4:0:0 (灰色图像)
    • 色度 4:1:1
    • 色度 4:2:0
    • 色度水平 4:2:2
    • 色度垂直 4:2:2
    • 色度 4:4:4
  • 3 个频道图像

应用程序可以通过在结构上附加和缓冲器在编码器初始化过程中指定霍夫曼和量化表。如果应用程序没有定义表,则 SDK 编码器使用国际电联-T* 推荐 T.81 中推荐的表。如果应用程序没有定义量化表,则必须指定结构中的参数。在这种情况下,SDK 编码器根据指定参数缩放默认量表。mfxExtJPEGQuantTables``mfxExtJPEGHuffmanTables``mfxVideoParam``Quality``mfxInfoMFX``Quality

应用程序应正确配置色度采样格式和颜色格式。 和结构领域的使用。例如,要编码 4:2:2 垂直采样 YCbCr 图片,应用程序应设置为和设置为。要编码 4:4:4 采样 RGB 图片,应用程序应设置为和设置为。FourCC``ChromaFormat``mfxFrameInfo``FourCC``MFX_FOURCC_YUY2``ChromaFormat``MFX_CHROMAFORMAT_YUV422V``FourCC``MFX_FOURCC_RGB4``ChromaFormat``MFX_CHROMAFORMAT_YUV444

SDK 编码器支持不同平台上的不同色度采样和颜色格式集。应用程序必须调用功能,以检查是否支持所需的颜色格式在给定的平台上,然后初始化编码器与适当的值和结构。MFXVideoENCODE_Query``FourCC``ChromaFormat``mfxFrameInfo

应用程序不应定义扫描次数和组件数。它们由 SDK 编码器从结构中的标记和色度类型中派生。如果指定了交错编码,则将对包含所有图像组件的扫描进行编码。否则,扫描次数等于组件数。SDK 编码器使用下一个组件 ID - luma (Y) 的"1",色度 Cb (U) 的"2"和色度 Cr (V) 的"3"。Interleaved``mfxInfoMFX

应用程序应分配足够大的缓冲区来保存编码图片。大致上,其上限可以使用下一个方程计算:

BufferSizeInKB = 4 + (Width * Height * BytesPerPx + 1023) / 1024;

其中和是像素的图片的重量和高度,是一个像素的分形数。它等于 1 的单色图片,1.5 为 NV12 和 YV12 颜色格式,2 为 YUY2 颜色格式,3 为 RGB32 颜色格式(阿尔法通道未编码)。Width``Height``BytesPerPx

参考结构

mfxInfoMFX

typedef struct {
    mfxU32  reserved[7];

    mfxU16  reserved4;
    mfxU16  BRCParamMultiplier;

    mfxFrameInfo    FrameInfo;
    mfxU32  CodecId;
    mfxU16  CodecProfile;
    mfxU16  CodecLevel;
    mfxU16  NumThread;

    union {
        struct {   /* MPEG-2/H.264 Encoding Options */
      ...
        };
        struct {   /* H.264, MPEG-2 and VC-1 Decoding Options */
      ...
        };
        struct {   /* JPEG Decoding Options */
            mfxU16  JPEGChromaFormat;
            mfxU16  Rotation;
            mfxU16  JPEGColorFormat;
            mfxU16  InterleavedDec;
            mfxU8   SamplingFactorH[4];
            mfxU8   SamplingFactorV[4];
            mfxU16  reserved3[5];
        };
        struct {   /* JPEG Encoding Options */
            mfxU16  Interleaved;
            mfxU16  Quality;
            mfxU16  RestartInterval;
            mfxU16  reserved5[10];
        };
    };
} mfxInfoMFX;

成员

JPEGChromaFormat指定用于编码 JPEG 图片的色度采样格式。有关详细信息,请参阅SDK API 参考手册中的色度前举。
Rotation输出 JPEG 图片的旋转选项;有关详细信息,请参阅旋转列举器。
JPEGColorFormat指定用于编码 JPEG 图片的颜色格式。有关详细信息,请参阅JPEG 颜色格式列举器。
InterleavedDec指定解码器的 JPEG 扫描类型。有关详细信息,请参阅JPEG 扫描类型说明。
Interleaved非交错或交错扫描。如果等于图像被编码为交错,则所有组件都编码在一次扫描中。有关详细信息,请参阅JPEG 扫描类型说明。MFX_SCANTYPE_INTERLEAVED
Quality如果应用程序没有指定量化表,则指定图像质量。这是从1到100的包容性值。"100"是最好的质量。
RestartInterval在重新启动区间中指定MCU的数量。"0"表示无重新启动间隔。
SamplingFactorH,SamplingFactorV采样因子。

mfxExtJPEGQuantTables

typedef struct {
    mfxExtBuffer    Header;

    mfxU16  reserved[7];
    mfxU16  NumTable;

    mfxU16    Qm[4][64];
} mfxExtJPEGQuantTables;

描述

该结构指定了量化表。应用程序可以指定最多 4 个量化表。SDK 编码器将 ID 分配到每个表。该 ID 等于Qm阵列中的表索引。表"0"用于Y组件的编码,表"1"用于U组件,表"2"用于V组件。应用可能指定的表数少于图像中的组件数。如果指定了两个表,则表"1"用于您和 V 组件。如果只指定一个表,则用于图像中的所有组件。下表说明了此行为。

成员

Header.BufferId必须是MFX_EXTBUFF_JPEG_QT
NumTable在数组中定义的量化表数。Qm
Qm量化表值。

mfxExtJPEGHuffmanTables

typedef struct {
    mfxExtBuffer    Header;

    mfxU16  reserved[2];
    mfxU16  NumDCTable;
    mfxU16  NumACTable;

    struct {
        mfxU8   Bits[16];
        mfxU8   Values[12];
    } DCTables[4];

    struct {
        mfxU8   Bits[16];
        mfxU8   Values[162];
    } ACTables[4];
} mfxExtJPEGHuffmanTables;

描述

该结构指定了霍夫曼表。应用程序可以指定最多 2 个量化表对用于基线过程。SDK 编码器将 ID 分配到每个表。该 ID 等于表索引和阵列。表"0"用于编码Y组件,表"1"用于您和V组件。在这种情况下,应用程序可能只指定一个表,它将用于图像中的所有组件。下表说明了此行为。DCTables``ACTables

表格 ID> 表数˅01
1Y、U、V
2YU, V

成员

Header.BufferId必须是 。MFX_EXTBUFF_JPEG_HUFFMAN
NumDCTable以阵列中的直流量化表数。DCTable
NumACTable以阵列中的交流量化表数。ACTable
Bits每个代码长度的代码数。
Values8 位符号值列表。

枚举器参考扩展

CodecFormatFourCC

描述

附加枚举器逐项列出了 JPEG* 编解码器。 有关其他枚举器定义,请参阅 SDK API 参考手册。 CodecFormatFourCC

名称/描述

MFX_CODEC_JPEGJPEG 编解码器

CodecProfile

描述

其他枚举器逐项列出支持的 JPEG 配置文件。有关其他列举器定义,请参阅SDK API 参考手册CodecProfile

名称/说明

MFX_PROFILE_JPEG_BASELINEJPEG 基线配置文件

ChromaFormatIdc

描述

其他枚举器逐项列出 JPEG* 颜色采样格式。有关其他列举器定义,请参阅SDK API 参考手册ChromaFormatIdc

名称/说明

MFX_CHROMAFORMAT_JPEG_SAMPLING通过mfx信息MFX指定的颜色采样::SamplingFactorH``SamplingFactorV

Rotation

描述

枚举器逐项列出 JPEG 旋转选项。Rotation

名称/说明

MFX_ROTATION_0无旋转
MFX_ROTATION_9090度旋转
MFX_ROTATION_180180度旋转
MFX_ROTATION_270270度旋转

ExtendedBufferID

描述

为 JPEG 支持添加了额外的扩展布弗瑞德。有关其他列举器定义,请参阅SDK API 参考手册

名称/说明

MFX_EXTBUFF_JPEG_QT此扩展缓冲区定义了 JPEG 编码器的量化表。
MFX_EXTBUFF_JPEG_HUFFMAN此扩展缓冲区定义了JPEG编码器的霍夫曼表。

JPEG Color Format

描述

此枚举器逐项列出 JPEG 颜色格式选项。

名称/说明

MFX_JPEG_COLORFORMAT_UNKNOWN未知颜色格式。SDK 解码器尝试从位流信息中确定可用的颜色格式。如果不存在此类信息,则假设颜色格式。MFX_JPEG_COLORFORMAT_YCbCr
MFX_JPEG_COLORFORMAT_YCbCr位流包含Y、Cb和CR组件。
MFX_JPEG_COLORFORMAT_RGB位流包含 R、G 和 B 组件。

JPEG Scan Type

描述

此枚举器逐项列出 JPEG 扫描类型。

名称/说明

MFX_SCANTYPE_UNKNOWN未知扫描类型。
MFX_SCANTYPE_INTERLEAVED交错扫描。
MFX_SCANTYPE_NONINTERLEAVED非交错扫描。

示例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CFddYe44-1625368393473)(C:\Users\86189\AppData\Roaming\Typora\typora-user-images\image-20210702103607030.png)]

命令:

$ sample_encode jpeg -i 1920_1080.yuv -o 1920_1080_100q.jpeg -q 100 -sw -w 1920 -h 1080

解释:

sample_encode : 执行sample_encode 可执行文件

jpeg : 使用jpeg编码

-i : 输入图片路径,输入格式为.yuv

-o : 输出图片路径,输出格式为.jpeg

-q : 编码器的强制质量参数,取值范围为[1, 100], 100为最好质量,使用jpeg编码必须指定该参数

-w : 输入图片/视频的宽度, 使用sample_encode该参数必须指定

-h : 输入图片/视频的高度, 使用sample_encode该参数必须指定

-sw : 使用软编码模式,不指定默认为硬编码。

 类似资料: