harmony 鸿蒙典型场景的视频编码配置
典型场景的视频编码配置
此文档描述了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>
低时延场景
低时延编码场景包括视频通话、视频会议、连麦直播等对端到端时延要求较高的交互式应用。
开发指导
基础编码流程请参考视频编码,下面仅针对编码器配置阶段做具体说明。
- 校验特性。
在创建编码器实例前,校验视频编码器是否支持低时延特性。若支持,则配置编码器参数阶段可以使能低时延特性。否则不能配置此参数。
```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);
```
配置编码器参数。
在配置编码器参数阶段,配置适合低时延编码场景的参数。
低时延编码场景,典型分辨率的编码参数(以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://www.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)功能。
>
(可选)在运行过程中动态配置编码器参数。
详情可参考视频编码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(音视频编解码服务)
- 所属分类: 后端技术
- 本文标签:
热门推荐
-
2、 - 优质文章
-
3、 gate.io
-
8、 golang
-
9、 openharmony
-
10、 Vue中input框自动聚焦