harmony 鸿蒙典型场景的视频编码配置

  • 2025-06-12
  • 浏览 (4)

典型场景的视频编码配置

此文档描述了AVCodec视频编码能力在不同应用场景下的推荐配置参数,供开发者根据实际应用场景进行视频编码应用的开发。

视频编码在视频通话、视频会议、直播、视频编辑、视频分享等场景均有广泛使用,按照体验要求,上述场景可归纳划分为低时延、实时流媒体、离线编码三大类别应用场景。

本文将给出三大类别应用场景下视频编码的推荐参数配置,供开发者根据不同的应用场景下的需求进行参数配置选择。

通用开发步骤

在CMake脚本中链接动态库

target_link_libraries(sample PUBLIC libnative_media_codecbase.so)
target_link_libraries(sample PUBLIC libnative_media_core.so)
target_link_libraries(sample PUBLIC libnative_media_venc.so)

说明:

上述’sample’字样仅为示例,此处由开发者根据实际工程目录自定义。

添加头文件

#include <multimedia/player_framework/native_avcodec_videoencoder.h>
#include <multimedia/player_framework/native_avcapability.h>
#include <multimedia/player_framework/native_avcodec_base.h>
#include <multimedia/player_framework/native_avformat.h>
#include <fstream>

低时延场景

低时延编码场景包括视频通话、视频会议、连麦直播等对端到端时延要求较高的交互式应用。

开发指导

基础编码流程请参考视频编码,下面仅针对编码器配置阶段做具体说明。

  1. 校验特性。

在创建编码器实例前,校验视频编码器是否支持低时延特性。若支持,则配置编码器参数阶段可以使能低时延特性。否则不能配置此参数。

```c++
// 1.1 获取对应视频编码器能力句柄,此处以H.265为例。
OH_AVCapability *cap = OH_AVCodec_GetCapability(OH_AVCODEC_MIMETYPE_VIDEO_HEVC, true);
// 1.2 通过特性能力查询接口校验是否支持低时延特性。
bool isSupported = OH_AVCapability_IsFeatureSupported(cap, VIDEO_LOW_LATENCY);
```
  1. 配置编码器参数。

    在配置编码器参数阶段,配置适合低时延编码场景的参数。

    低时延编码场景,典型分辨率的编码参数(以H.265为例)推荐如下:

|分辨率 |帧率(fps)|码率(kpbs)|接入帧间隔(ms)|码控模式| |——————|——–|——–|——|——| |1902x1080|30 |1500 |-1| CBR| |1280x720|30 |1000 |-1| CBR| |960x540|30 |700 |-1| CBR| |640x360|30 |550 |-1| CBR| |320x180|20 |200 |-1| CBR|

示例中的变量说明如下:
- videoEnc:视频编码器实例的指针。创建方式可参考[视频编码Surface模式](https://m.seaxiang.com/blog/YJCghV#surface模式)“步骤-2:创建编码器实例对象”。

```c++
// 2.1 创建AVFormat参数实例。
OH_AVFormat *format = OH_AVFormat_Create();

// 2.2 填充编码参数键值对(以1080p@30fps SDR输入源为例)。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, 1920); // 必须配置,视频宽。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, 1080); // 必须配置,视频高。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, AV_PIXEL_FORMAT_NV12); // 必须配置,视频源数据排布格式。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_RANGE_FLAG, 0); // VUI信息,0:limited range 1:full range。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_COLOR_PRIMARIES, OH_ColorPrimary::COLOR_PRIMARY_BT709); // VUI信息,视频源色域。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_TRANSFER_CHARACTERISTICS, OH_TransferCharacteristic::TRANSFER_CHARACTERISTIC_BT709); // VUI信息,OETF/EOTF曲线。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_MATRIX_COEFFICIENTS, OH_MatrixCoefficient:: MATRIX_COEFFICIENT_BT709); // VUI信息,YUV和RGB转换矩阵。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_PROFILE, OH_HEVCProfile::HEVC_PROFILE_MAIN); // 视频编码器profile。
OH_AVFormat_SetDoubleValue(format, OH_MD_KEY_FRAME_RATE, 30.0); // 必须配置,视频帧率。
if (isSupported) {
    // 使能低时延特性:YUV进一帧,出一帧码流数据。
    // 如果查询视频编码器支持低时延特性(isSupported = true),则必须配置。
    OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENABLE_LOW_LATENCY, 1);
}
OH_AVFormat_SetIntValue(format, OH_MD_KEY_I_FRAME_INTERVAL, -1); // 必须配置,接入帧间隔。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENCODE_BITRATE_MODE, OH_BitrateMode::BITRATE_MODE_CBR); // 必须配置,码控模式配置为CBR。
OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, 1500000); // 必须配置,设置码率,单位为bps。

// 2.3 配置视频编码器的编码参数。
int32_t ret = OH_VideoEncoder_Configure(videoEnc, format);
if (ret != AV_ERR_OK) {
    // 异常处理。
}
// 2.4 配置完成后销毁AVFormat实例。
OH_AVFormat_Destroy(format);
```
> **注意:**
> 接入帧间隔-1表示只有第一帧为接入帧,开发者可以根据传输情和画质情况,在运行过程中动态配置编码器参数,实现插入新的接入帧(IDR)功能。
> 
  1. (可选)在运行过程中动态配置编码器参数。

    详情可参考视频编码Surface模式“步骤-9:OH_VideoEncoder_SetParameter()在运行过程中动态配置编码器参数”。

    // 3.1 创建AVFormat参数实例。
    OH_AVFormat *format = OH_AVFormat_Create();
    // 3.2 填充编码参数键值对(动态请求IDR帧)。
    OH_AVFormat_SetIntValue(format, OH_MD_KEY_REQUEST_I_FRAME, true);
    // 3.3 设置编码器参数生效。
    ret = OH_VideoEncoder_SetParameter(videoEnc, format);
    if (ret != AV_ERR_OK) {
        // 异常处理。
    }
    // 3.4 配置完成后销毁AVFormat实例。
    OH_AVFormat_Destroy(format);
    

    如果需要适配网络波动,推荐结合采用时域可分层视频编码配置。

实时流媒体编码

实时流媒体编码场景包括泛娱乐直播、游戏直播等对视频端到端时延要求不高的应用场景。

开发指导

基础编码流程请参考视频编码,下面仅针对编码器配置阶段,对配置实时流媒体编码场景的参数做具体说明。

娱乐直播场景,典型分辨率的编码参数(以H.265为例)推荐如下:

分辨率 帧率(fps) 码率(kpbs) 接入帧间隔(ms) 码控模式
1080x1920 25 3000 2000 VBR
720x1080 25 1500 2000 VBR
544x960 25 1000 2000 VBR
480x864 25 800 2000 VBR

游戏直播场景,典型分辨率的编码参数(以H.265为例)推荐如下:

分辨率 帧率(fps) 码率(kpbs) 接入帧间隔(ms) 码控模式
1080x1920 60 6000 5000 VBR
// 1. 创建AVFormat参数实例。
OH_AVFormat *format = OH_AVFormat_Create();
// 2. 填充编码参数键值对(以1080p@25fps SDR输入源为例)。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, 1080); // 必须配置,视频宽。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, 1920); // 必须配置,视频高。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, AV_PIXEL_FORMAT_NV12); // 必须配置,视频源数据排布格式。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_RANGE_FLAG, 0); // VUI信息,0:limited range 1:full range。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_COLOR_PRIMARIES, OH_ColorPrimary::COLOR_PRIMARY_BT709); // VUI信息,视频源色域。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_TRANSFER_CHARACTERISTICS, OH_TransferCharacteristic::TRANSFER_CHARACTERISTIC_BT709); // VUI信息,OETF/EOTF曲线。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_MATRIX_COEFFICIENTS, OH_MatrixCoefficient:: MATRIX_COEFFICIENT_BT709); // VUI信息,YUV和RGB转换矩阵。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_PROFILE, OH_HEVCProfile::HEVC_PROFILE_MAIN); // 视频编码器profile。
OH_AVFormat_SetDoubleValue(format, OH_MD_KEY_FRAME_RATE, 25.0); // 必须配置,视频帧率。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_I_FRAME_INTERVAL, 2000); // 必须配置,接入帧间隔,单位为ms。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENCODE_BITRATE_MODE, OH_BitrateMode::BITRATE_MODE_VBR); // 必须配置,码控模式配置为VBR。
OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, 3000000); // 必须配置,设置码率,单位为bps。
// 3. 配置视频编码器的编码参数。
int32_t ret = OH_VideoEncoder_Configure(videoEnc, format);
if (ret != AV_ERR_OK) {
    // 异常处理。
}
// 4. 配置完成后销毁AVFormat实例。
OH_AVFormat_Destroy(format);

离线编码场景

离线编码场景包括视频编辑、视频分享等多种应用场景。

开发指导

基础编码流程请参考视频编码,下面仅针对编码器配置阶段,对配置离线编码场景的编码参数做具体说明。

视频编辑场景,典型分辨率的编码参数(以H.265为例)推荐如下:

分辨率 帧率(fps) 码率(kpbs) 接入帧间隔(ms) 码控模式
3840x2160 30 25000 5000 VBR
2560x1440 30 15000 5000 VBR
1920x1080 30 10000 5000 VBR
1280x720 30 5000 5000 VBR
854x480 30 2000 5000 VBR

视频分享场景,典型分辨率的编码参数(以H.265为例)推荐如下:

分辨率 帧率(fps) 码率(kpbs) 接入帧间隔(ms) 码控模式
3840x2160 30 5600 5000 VBR
2560x1440 30 4900 5000 VBR
1920x1080 30 2100 5000 VBR
1280x720 30 1400 5000 VBR
854x480 30 400 5000 VBR
// 1. 创建AVFormat参数实例。
OH_AVFormat *format = OH_AVFormat_Create();
// 2. 填充编码参数键值对(以1080p@30fps SDR输入源为例)。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, 1920); // 必须配置,视频宽。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, 1080); // 必须配置,视频高。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, AV_PIXEL_FORMAT_NV12); // 必须配置,视频源数据排布格式。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_RANGE_FLAG, 0); // VUI信息,0:limited range 1:full range。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_COLOR_PRIMARIES, OH_ColorPrimary::COLOR_PRIMARY_BT709); // VUI信息,视频源色域。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_TRANSFER_CHARACTERISTICS, OH_TransferCharacteristic::TRANSFER_CHARACTERISTIC_BT709); // VUI信息,OETF/EOTF曲线。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_MATRIX_COEFFICIENTS, OH_MatrixCoefficient:: MATRIX_COEFFICIENT_BT709); // YUV和RGB转换矩阵。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_PROFILE, OH_HEVCProfile::HEVC_PROFILE_MAIN); // 视频编码器profile。
OH_AVFormat_SetDoubleValue(format, OH_MD_KEY_FRAME_RATE, 30.0); // 必须配置,视频帧率。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_I_FRAME_INTERVAL, 5000); // 必须配置,接入帧间隔,单位为ms。
OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENCODE_BITRATE_MODE, OH_BitrateMode::BITRATE_MODE_VBR); // 必须配置,码控模式配置为VBR。
OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, 2100000); // 必须配置,设置码率,单位为bps。
// 3. 配置视频编码器的编码参数。
int32_t ret = OH_VideoEncoder_Configure(videoEnc, format);
if (ret != AV_ERR_OK) {
    // 异常处理。
}
// 4. 配置完成后销毁AVFormat实例。
OH_AVFormat_Destroy(format);

你可能感兴趣的鸿蒙文章

harmony 鸿蒙AVCodec Kit(音视频编解码服务)

harmony 鸿蒙音频解码

harmony 鸿蒙音频编码

harmony 鸿蒙媒体数据解析

harmony 鸿蒙媒体数据封装

harmony 鸿蒙AVCodec Kit简介

harmony 鸿蒙AVCodec支持的格式

harmony 鸿蒙获取支持的编解码能力

harmony 鸿蒙创建视频解码器和NativeWindow初始化并行

harmony 鸿蒙视频解码

0  赞