编码示例与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] quality | JPEG 编码器的强制质量参数。 范围内[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) |
-p | Mipi 端口号(例如:端口 0) |
-m | Mipi 模式配置 [预览/连续/静止/视频] |
-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 编解码器作为插件实现,与 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
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是最好的质量。
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 基线配置文件编码如下:
应用程序可以通过在结构上附加和缓冲器在编码器初始化过程中指定霍夫曼和量化表。如果应用程序没有定义表,则 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
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 | 采样因子。 |
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 | 量化表值。 |
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> 表数˅ | 0 | 1 |
---|---|---|
1 | Y、U、V | |
2 | Y | U, V |
成员
Header.BufferId | 必须是 。MFX_EXTBUFF_JPEG_HUFFMAN |
NumDCTable | 以阵列中的直流量化表数。DCTable |
NumACTable | 以阵列中的交流量化表数。ACTable |
Bits | 每个代码长度的代码数。 |
Values | 8 位符号值列表。 |
描述
附加枚举器逐项列出了 JPEG* 编解码器。 有关其他枚举器定义,请参阅 SDK API 参考手册。 CodecFormatFourCC
名称/描述
MFX_CODEC_JPEG | JPEG 编解码器 |
---|
描述
其他枚举器逐项列出支持的 JPEG 配置文件。有关其他列举器定义,请参阅SDK API 参考手册。CodecProfile
名称/说明
MFX_PROFILE_JPEG_BASELINE | JPEG 基线配置文件 |
描述
其他枚举器逐项列出 JPEG* 颜色采样格式。有关其他列举器定义,请参阅SDK API 参考手册。ChromaFormatIdc
名称/说明
MFX_CHROMAFORMAT_JPEG_SAMPLING | 通过mfx信息MFX指定的颜色采样::SamplingFactorH``SamplingFactorV |
描述
枚举器逐项列出 JPEG 旋转选项。Rotation
名称/说明
MFX_ROTATION_0 | 无旋转 |
MFX_ROTATION_90 | 90度旋转 |
MFX_ROTATION_180 | 180度旋转 |
MFX_ROTATION_270 | 270度旋转 |
描述
为 JPEG 支持添加了额外的扩展布弗瑞德。有关其他列举器定义,请参阅SDK API 参考手册。
名称/说明
MFX_EXTBUFF_JPEG_QT | 此扩展缓冲区定义了 JPEG 编码器的量化表。 |
MFX_EXTBUFF_JPEG_HUFFMAN | 此扩展缓冲区定义了JPEG编码器的霍夫曼表。 |
描述
此枚举器逐项列出 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 扫描类型。
名称/说明
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 : 使用软编码模式,不指定默认为硬编码。