• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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    ```c++
48    // 1.1 获取对应视频编码器能力句柄,此处以H.265为例。
49    OH_AVCapability *cap = OH_AVCodec_GetCapability(OH_AVCODEC_MIMETYPE_VIDEO_HEVC, true);
50    // 1.2 通过特性能力查询接口校验是否支持低时延特性。
51    bool isSupported = OH_AVCapability_IsFeatureSupported(cap, VIDEO_LOW_LATENCY);
52    ```
53
542. 配置编码器参数。
55
56    在配置编码器参数阶段,配置适合低时延编码场景的参数。
57
58    低时延编码场景,典型分辨率的编码参数(以H.265为例)推荐如下:
59
60    | 分辨率            | 帧率(fps) | 码率(kpbs)| 接入帧间隔(ms) | 码控模式 |
61    | ------------------| -------- | -------- | ------ | ------ |
62    | 1902x1080  | 30       | 1500     | -1 |  CBR  |
63    | 1280x720  | 30       | 1000     | -1 |  CBR  |
64    | 960x540  | 30       | 700    | -1 |  CBR  |
65    | 640x360  | 30       | 550     | -1 |  CBR  |
66    | 320x180  | 20       | 200     | -1 |  CBR  |
67
68
69    示例中的变量说明如下:
70    - videoEnc:视频编码器实例的指针。创建方式可参考[视频编码Surface模式](video-encoding.md#surface模式)“步骤-2:创建编码器实例对象”。
71
72    ```c++
73    // 2.1 创建AVFormat参数实例。
74    OH_AVFormat *format = OH_AVFormat_Create();
75
76    // 2.2 填充编码参数键值对(以1080p@30fps SDR输入源为例)。
77    OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, 1920); // 必须配置,视频宽。
78    OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, 1080); // 必须配置,视频高。
79    OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, AV_PIXEL_FORMAT_NV12); // 必须配置,视频源数据排布格式。
80    OH_AVFormat_SetIntValue(format, OH_MD_KEY_RANGE_FLAG, 0); // VUI信息,0:limited range 1:full range。
81    OH_AVFormat_SetIntValue(format, OH_MD_KEY_COLOR_PRIMARIES, OH_ColorPrimary::COLOR_PRIMARY_BT709); // VUI信息,视频源色域。
82    OH_AVFormat_SetIntValue(format, OH_MD_KEY_TRANSFER_CHARACTERISTICS, OH_TransferCharacteristic::TRANSFER_CHARACTERISTIC_BT709); // VUI信息,OETF/EOTF曲线。
83    OH_AVFormat_SetIntValue(format, OH_MD_KEY_MATRIX_COEFFICIENTS, OH_MatrixCoefficient:: MATRIX_COEFFICIENT_BT709); // VUI信息,YUV和RGB转换矩阵。
84    OH_AVFormat_SetIntValue(format, OH_MD_KEY_PROFILE, OH_HEVCProfile::HEVC_PROFILE_MAIN); // 视频编码器profile。
85    OH_AVFormat_SetDoubleValue(format, OH_MD_KEY_FRAME_RATE, 30.0); // 必须配置,视频帧率。
86    if (isSupported) {
87        // 使能低时延特性:YUV进一帧,出一帧码流数据。
88        // 如果查询视频编码器支持低时延特性(isSupported = true),则必须配置。
89        OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENABLE_LOW_LATENCY, 1);
90    }
91    OH_AVFormat_SetIntValue(format, OH_MD_KEY_I_FRAME_INTERVAL, -1); // 必须配置,接入帧间隔。
92    OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENCODE_BITRATE_MODE, OH_BitrateMode::BITRATE_MODE_CBR); // 必须配置,码控模式配置为CBR。
93    OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, 1500000); // 必须配置,设置码率,单位为bps。
94
95    // 2.3 配置视频编码器的编码参数。
96    int32_t ret = OH_VideoEncoder_Configure(videoEnc, format);
97    if (ret != AV_ERR_OK) {
98        // 异常处理。
99    }
100    // 2.4 配置完成后销毁AVFormat实例。
101    OH_AVFormat_Destroy(format);
102    ```
103    > **注意:**
104    > 接入帧间隔-1表示只有第一帧为接入帧,开发者可以根据传输情和画质情况,在运行过程中动态配置编码器参数,实现插入新的接入帧(IDR)功能。
105    >
106
1073. (可选)在运行过程中动态配置编码器参数。
108
109    详情可参考[视频编码Surface模式](video-encoding.md#surface模式)“步骤-9:OH_VideoEncoder_SetParameter()在运行过程中动态配置编码器参数”。
110
111    ```c++
112    // 3.1 创建AVFormat参数实例。
113    OH_AVFormat *format = OH_AVFormat_Create();
114    // 3.2 填充编码参数键值对(动态请求IDR帧)。
115    OH_AVFormat_SetIntValue(format, OH_MD_KEY_REQUEST_I_FRAME, true);
116    // 3.3 设置编码器参数生效。
117    ret = OH_VideoEncoder_SetParameter(videoEnc, format);
118    if (ret != AV_ERR_OK) {
119        // 异常处理。
120    }
121    // 3.4 配置完成后销毁AVFormat实例。
122    OH_AVFormat_Destroy(format);
123    ```
124    如果需要适配网络波动,推荐结合采用[时域可分层视频编码](video-encoding-temporal-scalability.md)配置。
125
126## 实时流媒体编码
127
128实时流媒体编码场景包括泛娱乐直播、游戏直播等对视频端到端时延要求不高的应用场景。
129
130**开发指导**
131
132基础编码流程请参考[视频编码](video-encoding.md),下面仅针对编码器配置阶段,对配置实时流媒体编码场景的参数做具体说明。
133
134娱乐直播场景,典型分辨率的编码参数(以H.265为例)推荐如下:
135
136| 分辨率            | 帧率(fps) | 码率(kpbs)| 接入帧间隔(ms) | 码控模式 |
137| ------------------| -------- | -------- | ------ | ------ |
138| 1080x1920  | 25       | 3000     | 2000 |  VBR  |
139| 720x1080  | 25       | 1500     | 2000 |  VBR  |
140| 544x960  | 25       | 1000    | 2000 |  VBR  |
141| 480x864  | 25       | 800     | 2000 |  VBR  |
142
143游戏直播场景,典型分辨率的编码参数(以H.265为例)推荐如下:
144
145| 分辨率            | 帧率(fps) | 码率(kpbs)| 接入帧间隔(ms) | 码控模式 |
146| ------------------| -------- | -------- | ------ | ------ |
147| 1080x1920  | 60      | 6000     | 5000 |  VBR  |
148
149```c++
150// 1. 创建AVFormat参数实例。
151OH_AVFormat *format = OH_AVFormat_Create();
152// 2. 填充编码参数键值对(以1080p@25fps SDR输入源为例)。
153OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, 1080); // 必须配置,视频宽。
154OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, 1920); // 必须配置,视频高。
155OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, AV_PIXEL_FORMAT_NV12); // 必须配置,视频源数据排布格式。
156OH_AVFormat_SetIntValue(format, OH_MD_KEY_RANGE_FLAG, 0); // VUI信息,0:limited range 1:full range。
157OH_AVFormat_SetIntValue(format, OH_MD_KEY_COLOR_PRIMARIES, OH_ColorPrimary::COLOR_PRIMARY_BT709); // VUI信息,视频源色域。
158OH_AVFormat_SetIntValue(format, OH_MD_KEY_TRANSFER_CHARACTERISTICS, OH_TransferCharacteristic::TRANSFER_CHARACTERISTIC_BT709); // VUI信息,OETF/EOTF曲线。
159OH_AVFormat_SetIntValue(format, OH_MD_KEY_MATRIX_COEFFICIENTS, OH_MatrixCoefficient:: MATRIX_COEFFICIENT_BT709); // VUI信息,YUV和RGB转换矩阵。
160OH_AVFormat_SetIntValue(format, OH_MD_KEY_PROFILE, OH_HEVCProfile::HEVC_PROFILE_MAIN); // 视频编码器profile。
161OH_AVFormat_SetDoubleValue(format, OH_MD_KEY_FRAME_RATE, 25.0); // 必须配置,视频帧率。
162OH_AVFormat_SetIntValue(format, OH_MD_KEY_I_FRAME_INTERVAL, 2000); // 必须配置,接入帧间隔,单位为ms。
163OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENCODE_BITRATE_MODE, OH_BitrateMode::BITRATE_MODE_VBR); // 必须配置,码控模式配置为VBR。
164OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, 3000000); // 必须配置,设置码率,单位为bps。
165// 3. 配置视频编码器的编码参数。
166int32_t ret = OH_VideoEncoder_Configure(videoEnc, format);
167if (ret != AV_ERR_OK) {
168    // 异常处理。
169}
170// 4. 配置完成后销毁AVFormat实例。
171OH_AVFormat_Destroy(format);
172```
173
174
175## 离线编码场景
176
177离线编码场景包括视频编辑、视频分享等多种应用场景。
178
179
180**开发指导**
181
182基础编码流程请参考[视频编码](video-encoding.md),下面仅针对编码器配置阶段,对配置离线编码场景的编码参数做具体说明。
183
184视频编辑场景,典型分辨率的编码参数(以H.265为例)推荐如下:
185
186| 分辨率            | 帧率(fps) | 码率(kpbs)| 接入帧间隔(ms) | 码控模式 |
187| ------------------| -------- | -------- | ------ | ------ |
188| 3840x2160  | 30       | 25000     | 5000 |  VBR  |
189| 2560x1440  | 30       | 15000     | 5000 |  VBR  |
190| 1920x1080  | 30       | 10000    | 5000 |  VBR  |
191| 1280x720  | 30       | 5000     | 5000 |  VBR  |
192| 854x480  | 30       | 2000     | 5000 |  VBR  |
193
194视频分享场景,典型分辨率的编码参数(以H.265为例)推荐如下:
195
196| 分辨率            | 帧率(fps) | 码率(kpbs)| 接入帧间隔(ms) | 码控模式 |
197| ------------------| -------- | -------- | ------ | ------ |
198| 3840x2160  | 30       | 5600     | 5000 |  VBR  |
199| 2560x1440  | 30       | 4900     | 5000 |  VBR  |
200| 1920x1080  | 30       | 2100    | 5000 |  VBR  |
201| 1280x720  | 30       | 1400     | 5000 |  VBR  |
202| 854x480  | 30       | 400     | 5000 |  VBR  |
203
204```c++
205// 1. 创建AVFormat参数实例。
206OH_AVFormat *format = OH_AVFormat_Create();
207// 2. 填充编码参数键值对(以1080p@30fps SDR输入源为例)。
208OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, 1920); // 必须配置,视频宽。
209OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, 1080); // 必须配置,视频高。
210OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, AV_PIXEL_FORMAT_NV12); // 必须配置,视频源数据排布格式。
211OH_AVFormat_SetIntValue(format, OH_MD_KEY_RANGE_FLAG, 0); // VUI信息,0:limited range 1:full range。
212OH_AVFormat_SetIntValue(format, OH_MD_KEY_COLOR_PRIMARIES, OH_ColorPrimary::COLOR_PRIMARY_BT709); // VUI信息,视频源色域。
213OH_AVFormat_SetIntValue(format, OH_MD_KEY_TRANSFER_CHARACTERISTICS, OH_TransferCharacteristic::TRANSFER_CHARACTERISTIC_BT709); // VUI信息,OETF/EOTF曲线。
214OH_AVFormat_SetIntValue(format, OH_MD_KEY_MATRIX_COEFFICIENTS, OH_MatrixCoefficient:: MATRIX_COEFFICIENT_BT709); // YUV和RGB转换矩阵。
215OH_AVFormat_SetIntValue(format, OH_MD_KEY_PROFILE, OH_HEVCProfile::HEVC_PROFILE_MAIN); // 视频编码器profile。
216OH_AVFormat_SetDoubleValue(format, OH_MD_KEY_FRAME_RATE, 30.0); // 必须配置,视频帧率。
217OH_AVFormat_SetIntValue(format, OH_MD_KEY_I_FRAME_INTERVAL, 5000); // 必须配置,接入帧间隔,单位为ms。
218OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENCODE_BITRATE_MODE, OH_BitrateMode::BITRATE_MODE_VBR); // 必须配置,码控模式配置为VBR。
219OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, 2100000); // 必须配置,设置码率,单位为bps。
220// 3. 配置视频编码器的编码参数。
221int32_t ret = OH_VideoEncoder_Configure(videoEnc, format);
222if (ret != AV_ERR_OK) {
223    // 异常处理。
224}
225// 4. 配置完成后销毁AVFormat实例。
226OH_AVFormat_Destroy(format);
227```
228