1# 典型场景的视频编码配置 2 3此文档描述了AVCodec视频编码能力在不同应用场景下的推荐配置参数,供开发者根据实际应用场景进行视频编码应用的开发。 4 5视频编码在视频通话、视频会议、直播、视频编辑、视频分享等场景均有广泛使用,按照体验要求,上述场景可归纳划分为低时延、实时流媒体、离线编码三大类别应用场景。 6 7本文将给出三大类别应用场景下视频编码的推荐参数配置,供开发者根据不同的应用场景下的需求进行参数配置选择。 8 9 10## 通用开发步骤 11 12**在CMake脚本中链接动态库** 13 14```cmake 15target_link_libraries(sample PUBLIC libnative_media_codecbase.so) 16target_link_libraries(sample PUBLIC libnative_media_core.so) 17target_link_libraries(sample PUBLIC libnative_media_venc.so) 18``` 19 20> **说明:** 21> 22> 上述'sample'字样仅为示例,此处由开发者根据实际工程目录自定义。 23> 24 25**添加头文件** 26 27```c++ 28#include <multimedia/player_framework/native_avcodec_videoencoder.h> 29#include <multimedia/player_framework/native_avcapability.h> 30#include <multimedia/player_framework/native_avcodec_base.h> 31#include <multimedia/player_framework/native_avformat.h> 32#include <fstream> 33``` 34 35## 低时延场景 36 37低时延编码场景包括视频通话、视频会议、连麦直播等对端到端时延要求较高的交互式应用。 38 39**开发指导** 40 41基础编码流程请参考[视频编码](video-encoding.md),下面仅针对编码器配置阶段做具体说明。 42 431. 配置编码器参数。 44 45 在配置编码器参数阶段,配置适合低时延编码场景的参数。 46 47 低时延编码场景,典型分辨率的编码参数(以H.265为例)推荐如下: 48 49 | 分辨率 | 帧率(fps) | 码率(kpbs)| 接入帧间隔(ms) | 码控模式 | 50 | ------------------| -------- | -------- | ------ | ------ | 51 | 1920x1080 | 30 | 1500 | -1 | CBR | 52 | 1280x720 | 30 | 1000 | -1 | CBR | 53 | 960x540 | 30 | 700 | -1 | CBR | 54 | 640x360 | 30 | 550 | -1 | CBR | 55 | 320x180 | 20 | 200 | -1 | CBR | 56 57 58 示例中的变量说明如下: 59 - videoEnc:视频编码器实例的指针。创建方式可参考[视频编码Surface模式](video-encoding.md#surface模式)“步骤-2:创建编码器实例对象”。 60 61 ```c++ 62 // 1.1 创建AVFormat参数实例。 63 OH_AVFormat *format = OH_AVFormat_Create(); 64 65 // 1.2 填充编码参数键值对(以1080p@30fps SDR输入源为例)。 66 OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, 1920); // 必须配置,视频宽。 67 OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, 1080); // 必须配置,视频高。 68 OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, AV_PIXEL_FORMAT_NV12); // 必须配置,视频源数据排布格式。 69 OH_AVFormat_SetIntValue(format, OH_MD_KEY_RANGE_FLAG, 0); // VUI信息,0:limited range 1:full range。 70 OH_AVFormat_SetIntValue(format, OH_MD_KEY_COLOR_PRIMARIES, OH_ColorPrimary::COLOR_PRIMARY_BT709); // VUI信息,视频源色域。 71 OH_AVFormat_SetIntValue(format, OH_MD_KEY_TRANSFER_CHARACTERISTICS, OH_TransferCharacteristic::TRANSFER_CHARACTERISTIC_BT709); // VUI信息,OETF/EOTF曲线。 72 OH_AVFormat_SetIntValue(format, OH_MD_KEY_MATRIX_COEFFICIENTS, OH_MatrixCoefficient:: MATRIX_COEFFICIENT_BT709); // VUI信息,YUV和RGB转换矩阵。 73 OH_AVFormat_SetIntValue(format, OH_MD_KEY_PROFILE, OH_HEVCProfile::HEVC_PROFILE_MAIN); // 视频编码器profile。 74 OH_AVFormat_SetDoubleValue(format, OH_MD_KEY_FRAME_RATE, 30.0); // 必须配置,视频帧率。 75 OH_AVFormat_SetIntValue(format, OH_MD_KEY_I_FRAME_INTERVAL, -1); // 必须配置,接入帧间隔。 76 OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENCODE_BITRATE_MODE, OH_BitrateMode::BITRATE_MODE_CBR); // 必须配置,码控模式配置为CBR。 77 OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, 1500000); // 必须配置,设置码率,单位为bps。 78 79 // 1.3 配置视频编码器的编码参数。 80 int32_t ret = OH_VideoEncoder_Configure(videoEnc, format); 81 if (ret != AV_ERR_OK) { 82 // 异常处理。 83 } 84 // 1.4 配置完成后销毁AVFormat实例。 85 OH_AVFormat_Destroy(format); 86 ``` 87 > **注意:** 88 > 接入帧间隔-1表示只有第一帧为接入帧,开发者可以根据传输情况和画质情况,在运行过程中动态配置编码器参数,实现插入新的接入帧(IDR)功能。 89 > 90 912. (可选)在运行过程中动态配置编码器参数。 92 93 详情可参考[视频编码Surface模式](video-encoding.md#surface模式)“步骤-9:OH_VideoEncoder_SetParameter()在运行过程中动态配置编码器参数”。 94 95 ```c++ 96 // 2.1 创建AVFormat参数实例。 97 OH_AVFormat *format = OH_AVFormat_Create(); 98 // 2.2 填充编码参数键值对(动态请求IDR帧)。 99 OH_AVFormat_SetIntValue(format, OH_MD_KEY_REQUEST_I_FRAME, true); 100 // 2.3 设置编码器参数生效。 101 ret = OH_VideoEncoder_SetParameter(videoEnc, format); 102 if (ret != AV_ERR_OK) { 103 // 异常处理。 104 } 105 // 2.4 配置完成后销毁AVFormat实例。 106 OH_AVFormat_Destroy(format); 107 ``` 108 如果需要适配网络波动,推荐结合采用[时域可分层视频编码](video-encoding-temporal-scalability.md)配置。 109 110## 实时流媒体编码 111 112实时流媒体编码场景包括泛娱乐直播、游戏直播等对视频端到端时延要求不高的应用场景。 113 114**开发指导** 115 116基础编码流程请参考[视频编码](video-encoding.md),下面仅针对编码器配置阶段,对配置实时流媒体编码场景的参数做具体说明。 117 118娱乐直播场景,典型分辨率的编码参数(以H.265为例)推荐如下: 119 120| 分辨率 | 帧率(fps) | 码率(kpbs)| 接入帧间隔(ms) | 码控模式 | 121| ------------------| -------- | -------- | ------ | ------ | 122| 1920x1080 | 25 | 3000 | 2000 | VBR | 123| 1080x720 | 25 | 1500 | 2000 | VBR | 124| 960x544 | 25 | 1000 | 2000 | VBR | 125| 864x480 | 25 | 800 | 2000 | VBR | 126 127游戏直播场景,典型分辨率的编码参数(以H.265为例)推荐如下: 128 129| 分辨率 | 帧率(fps) | 码率(kpbs)| 接入帧间隔(ms) | 码控模式 | 130| ------------------| -------- | -------- | ------ | ------ | 131| 1920x1080 | 60 | 6000 | 5000 | VBR | 132 133```c++ 134// 1. 创建AVFormat参数实例。 135OH_AVFormat *format = OH_AVFormat_Create(); 136// 2. 填充编码参数键值对(以1080p@25fps SDR输入源为例)。 137OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, 1080); // 必须配置,视频宽。 138OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, 1920); // 必须配置,视频高。 139OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, AV_PIXEL_FORMAT_NV12); // 必须配置,视频源数据排布格式。 140OH_AVFormat_SetIntValue(format, OH_MD_KEY_RANGE_FLAG, 0); // VUI信息,0:limited range 1:full range。 141OH_AVFormat_SetIntValue(format, OH_MD_KEY_COLOR_PRIMARIES, OH_ColorPrimary::COLOR_PRIMARY_BT709); // VUI信息,视频源色域。 142OH_AVFormat_SetIntValue(format, OH_MD_KEY_TRANSFER_CHARACTERISTICS, OH_TransferCharacteristic::TRANSFER_CHARACTERISTIC_BT709); // VUI信息,OETF/EOTF曲线。 143OH_AVFormat_SetIntValue(format, OH_MD_KEY_MATRIX_COEFFICIENTS, OH_MatrixCoefficient:: MATRIX_COEFFICIENT_BT709); // VUI信息,YUV和RGB转换矩阵。 144OH_AVFormat_SetIntValue(format, OH_MD_KEY_PROFILE, OH_HEVCProfile::HEVC_PROFILE_MAIN); // 视频编码器profile。 145OH_AVFormat_SetDoubleValue(format, OH_MD_KEY_FRAME_RATE, 25.0); // 必须配置,视频帧率。 146OH_AVFormat_SetIntValue(format, OH_MD_KEY_I_FRAME_INTERVAL, 2000); // 必须配置,接入帧间隔,单位为ms。 147OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENCODE_BITRATE_MODE, OH_BitrateMode::BITRATE_MODE_VBR); // 必须配置,码控模式配置为VBR。 148OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, 3000000); // 必须配置,设置码率,单位为bps。 149// 3. 配置视频编码器的编码参数。 150int32_t ret = OH_VideoEncoder_Configure(videoEnc, format); 151if (ret != AV_ERR_OK) { 152 // 异常处理。 153} 154// 4. 配置完成后销毁AVFormat实例。 155OH_AVFormat_Destroy(format); 156``` 157 158 159## 离线编码场景 160 161离线编码场景包括视频编辑、视频分享等多种应用场景。 162 163 164**开发指导** 165 166基础编码流程请参考[视频编码](video-encoding.md),下面仅针对编码器配置阶段,对配置离线编码场景的编码参数做具体说明。 167 168视频编辑场景,典型分辨率的编码参数(以H.265为例)推荐如下: 169 170| 分辨率 | 帧率(fps) | 码率(kpbs)| 接入帧间隔(ms) | 码控模式 | 171| ------------------| -------- | -------- | ------ | ------ | 172| 3840x2160 | 30 | 25000 | 5000 | VBR | 173| 2560x1440 | 30 | 15000 | 5000 | VBR | 174| 1920x1080 | 30 | 10000 | 5000 | VBR | 175| 1280x720 | 30 | 5000 | 5000 | VBR | 176| 854x480 | 30 | 2000 | 5000 | VBR | 177 178视频分享场景,典型分辨率的编码参数(以H.265为例)推荐如下: 179 180| 分辨率 | 帧率(fps) | 码率(kpbs)| 接入帧间隔(ms) | 码控模式 | 181| ------------------| -------- | -------- | ------ | ------ | 182| 3840x2160 | 30 | 5600 | 5000 | VBR | 183| 2560x1440 | 30 | 4900 | 5000 | VBR | 184| 1920x1080 | 30 | 2100 | 5000 | VBR | 185| 1280x720 | 30 | 1400 | 5000 | VBR | 186| 854x480 | 30 | 400 | 5000 | VBR | 187 188```c++ 189// 1. 创建AVFormat参数实例。 190OH_AVFormat *format = OH_AVFormat_Create(); 191// 2. 填充编码参数键值对(以1080p@30fps SDR输入源为例)。 192OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, 1920); // 必须配置,视频宽。 193OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, 1080); // 必须配置,视频高。 194OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, AV_PIXEL_FORMAT_NV12); // 必须配置,视频源数据排布格式。 195OH_AVFormat_SetIntValue(format, OH_MD_KEY_RANGE_FLAG, 0); // VUI信息,0:limited range 1:full range。 196OH_AVFormat_SetIntValue(format, OH_MD_KEY_COLOR_PRIMARIES, OH_ColorPrimary::COLOR_PRIMARY_BT709); // VUI信息,视频源色域。 197OH_AVFormat_SetIntValue(format, OH_MD_KEY_TRANSFER_CHARACTERISTICS, OH_TransferCharacteristic::TRANSFER_CHARACTERISTIC_BT709); // VUI信息,OETF/EOTF曲线。 198OH_AVFormat_SetIntValue(format, OH_MD_KEY_MATRIX_COEFFICIENTS, OH_MatrixCoefficient:: MATRIX_COEFFICIENT_BT709); // YUV和RGB转换矩阵。 199OH_AVFormat_SetIntValue(format, OH_MD_KEY_PROFILE, OH_HEVCProfile::HEVC_PROFILE_MAIN); // 视频编码器profile。 200OH_AVFormat_SetDoubleValue(format, OH_MD_KEY_FRAME_RATE, 30.0); // 必须配置,视频帧率。 201OH_AVFormat_SetIntValue(format, OH_MD_KEY_I_FRAME_INTERVAL, 5000); // 必须配置,接入帧间隔,单位为ms。 202OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENCODE_BITRATE_MODE, OH_BitrateMode::BITRATE_MODE_VBR); // 必须配置,码控模式配置为VBR。 203OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, 2100000); // 必须配置,设置码率,单位为bps。 204// 3. 配置视频编码器的编码参数。 205int32_t ret = OH_VideoEncoder_Configure(videoEnc, format); 206if (ret != AV_ERR_OK) { 207 // 异常处理。 208} 209// 4. 配置完成后销毁AVFormat实例。 210OH_AVFormat_Destroy(format); 211``` 212