1# VideoEncoder
2
3
4## 概述
5
6VideoEncoder模块提供用于视频编码的接口。
7
8**系统能力:** SystemCapability.Multimedia.VideoEncoder
9
10**起始版本:** 9
11
12接口在每个版本,对每种模式的支持情况说明,如下图所示。
13
14![meaning](figures/meaning.PNG)
15
16![desciption of encode api history](figures/video-encode-api.PNG)
17
18## 汇总
19
20
21### 文件
22
23| 名称 | 描述 | 
24| -------- | -------- |
25| [native_avcodec_videoencoder.h](native__avcodec__videoencoder_8h.md) | 声明用于视频编码的接口。  |
26
27
28### 类型定义
29
30| 名称 | 描述 | 
31| -------- | -------- |
32| typedef void(\* [OH_VideoEncoder_OnNeedInputParameter](#oh_videoencoder_onneedinputparameter)) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index, OH_AVFormat \*parameter, void \*userData) | 配置随帧参数,当需要设置index对应帧的编码参数时,可以通过该接口设置。只在Surface模式生效。  | 
33
34### 枚举
35
36| 名称 | 描述 | 
37| -------- | -------- |
38| [OH_VideoEncodeBitrateMode](#oh_videoencodebitratemode) { CBR = 0, VBR = 1, CQ = 2 } | 视频编码器的码率控制模式。  | 
39
40
41### 函数
42
43| 名称 | 描述 | 
44| -------- | -------- |
45| [OH_AVCodec](_codec_base.md#oh_avcodec) \* [OH_VideoEncoder_CreateByMime](#oh_videoencoder_createbymime) (const char \*mime) | 根据MIME类型创建视频编码器实例,推荐使用。  |
46| [OH_AVCodec](_codec_base.md#oh_avcodec) \* [OH_VideoEncoder_CreateByName](#oh_videoencoder_createbyname) (const char \*name) | 根据视频编码器名称创建视频编码器实例。  |
47| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_Destroy](#oh_videoencoder_destroy) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec) | 清理编码器内部资源,销毁编码器实例。  | 
48| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_SetCallback](#oh_videoencoder_setcallback) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, [OH_AVCodecAsyncCallback](_o_h___a_v_codec_async_callback.md) callback, void \*userData) | 设置OH_AVCodecCallback回调函数,让应用可以响应视频编码器生成的事件。(API11废弃)  |
49| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_RegisterCallback](#oh_videoencoder_registercallback) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, [OH_AVCodecCallback](_o_h___a_v_codec_callback.md) callback, void \*userData) | 注册OH_AVCodecCallback回调函数,让应用可以响应视频编码器生成的事件。  | 
50| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_RegisterParameterCallback](#oh_videoencoder_registerparametercallback) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, [OH_VideoEncoder_OnNeedInputParameter](#oh_videoencoder_onneedinputparameter) onInputParameter, void \*userData) | 注册OH_AVCodecCallback输入参数回调函数,让应用可以响应视频编码器生成的事件。  | 
51| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_Configure](#oh_videoencoder_configure) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, OH_AVFormat \*format) | 配置视频编码器的编码参数,通常需要配置要编码的视频轨的描述信息,如宽、高、像素格式等。  |
52| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_Prepare](#oh_videoencoder_prepare) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec) | 准备编码器的内部资源。  | 
53| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_Start](#oh_videoencoder_start) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec) | 调用OH_VideoEncoder_Prepare接口成功后调用此接口启动编码器。  |
54| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_Stop](#oh_videoencoder_stop) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec) | 停止编码器,释放输入输出buffer。  |
55| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_Flush](#oh_videoencoder_flush) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec) | 清除编码器中缓存的输入和输出数据及参数集如H264格式的PPS/SPS。  |
56| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_Reset](#oh_videoencoder_reset) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec) | 重置编码器,编码器回到初始化状态。  |
57| OH_AVFormat \* [OH_VideoEncoder_GetOutputDescription](#oh_videoencoder_getoutputdescription) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec) | 获取编码器输出数据的OH_AVFormat信息。  |
58| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_SetParameter](#oh_videoencoder_setparameter) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, OH_AVFormat \*format) | 在编码器运行时设置编码器参数。  | 
59| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_GetSurface](#oh_videoencoder_getsurface) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, [OHNativeWindow](_codec_base.md#ohnativewindow) \*\*window) | 从视频编码器获取输入surface。  |
60| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_FreeOutputData](#oh_videoencoder_freeoutputdata) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index) | 将处理后的输出缓冲区返回给编码器。(API11废弃)   |
61| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_NotifyEndOfStream](#oh_videoencoder_notifyendofstream) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec) | 通知视频编码器输入流已结束。  | 
62| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_PushInputData](#oh_videoencoder_pushinputdata) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index, [OH_AVCodecBufferAttr](_o_h___a_v_codec_buffer_attr.md) attr) | 将填入数据的输入缓冲区提交给视频编码器。(API11废弃)   |
63| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_PushInputBuffer](#oh_videoencoder_pushinputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index) | Buffer模式下,将index对应的OH_AVBuffer送入编码器编码。  |
64| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_PushInputParameter](#oh_videoencoder_pushinputparameter) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index) | Surface模式下,将index对应帧的编码参数送入编码器编码。  | 
65| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_FreeOutputBuffer](#oh_videoencoder_freeoutputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index) | 将处理后的index对应的OH_AVBuffer返回给编码器。  | 
66| OH_AVFormat \* [OH_VideoEncoder_GetInputDescription](#oh_videoencoder_getinputdescription) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec) | 编码器接收到的图像的描述信息。  |
67| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_IsValid](#oh_videoencoder_isvalid) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, bool \*isValid) | 检查当前编码实例是否有效。  | 
68
69
70## 类型定义说明
71
72### OH_VideoEncoder_OnNeedInputParameter
73
74```
75typedef void(* OH_VideoEncoder_OnNeedInputParameter) (OH_AVCodec *codec, uint32_t index, OH_AVFormat *parameter, void *userData)
76```
77**描述**
78配置随帧参数,当需要设置index对应帧的编码参数时,可以通过该接口设置。只在Surface模式生效。 
79
80该接口只能在Surface模式下使用,使用前需要调用OH_VideoEncoder_RegisterParameterCallback接口注册。
81
82在Buffer模式下,OH_AVBuffer可以直接携带帧的编码参数,当前可以支持的随帧参数有帧级QPMin/QPMax,指定LTR设置参考帧。
83
84**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
85
86**起始版本:** 12
87
88**参数:**
89
90| 名称 | 描述 | 
91| -------- | -------- |
92| codec | 指向视频编码实例的指针。  | 
93| index | 对应编码帧的index。  | 
94| parameter | 编码参数。  | 
95| userData | 调用者执行回调所依赖的数据。  |
96
97
98## 枚举类型说明
99
100
101### OH_VideoEncodeBitrateMode
102
103```
104enum OH_VideoEncodeBitrateMode
105```
106**描述**
107视频编码器的码率控制模式。
108
109**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
110
111**起始版本:** 9
112
113| 枚举值 | 描述 | 
114| -------- | -------- |
115| CBR  | 恒定码率模式。   | 
116| VBR  | 可变码率模式。   | 
117| CQ  | 恒定QP模式。   | 
118
119
120## 函数说明
121
122
123### OH_VideoEncoder_Configure()
124
125```
126OH_AVErrCode OH_VideoEncoder_Configure (OH_AVCodec *codec, OH_AVFormat *format )
127```
128**描述**
129配置视频编码器的编码参数,通常需要配置要编码的视频轨的描述信息,如宽、高、像素格式等。必须在调用OH_VideoEncoder_Prepare接口之前,调用此接口。
130
131该接口对配置参数进行合法性校验,部分非法参数不会强校验,使用默认值或直接丢弃。部分非法参数会强校验,具体规则如下:
132
133以下参数的配置范围可通过[能力查询](../../media/avcodec/obtain-supported-codecs.md)获取,OH_MD_KEY_I_FRAME_INTERVAL暂不支持。
134
135设置OH_MD_KEY_VIDEO_ENCODER_ENABLE_TEMPORAL_SCALABILITY、OH_MD_KEY_VIDEO_ENCODER_LTR_FRAME_COUNT接口时如果当前平台不支持,不报错,走正常编码流程。
136
137参数校验:
138
139| Key                                                                       | 配置正常范围的值 | 配置超出范围的值 | 不配置该参数 |
140| ------------------------------------------------------------------------- | -------- | -------- | ------ |
141| OH_MD_KEY_WIDTH                                                           | AV_ERR_OK       | AV_ERR_INVALID_VAL       | AV_ERR_INVALID_VAL     |
142| OH_MD_KEY_HEIGHT                                                          | AV_ERR_OK       | AV_ERR_INVALID_VAL       | AV_ERR_INVALID_VAL     |
143| OH_MD_KEY_PIXEL_FORMAT 请参阅[OH_AVPixelFormat](_core.md#oh_avpixelformat) | AV_ERR_OK       | AV_ERR_UNSUPPORT       | AV_ERR_OK    |
144| OH_MD_KEY_FRAME_RATE                                                       | AV_ERR_OK       | AV_ERR_INVALID_VAL       |AV_ERR_OK        |
145| OH_MD_KEY_PROFILE 请参阅[OH_MD_KEY_PROFILE](_codec_base.md#oh_md_key_profile)    | AV_ERR_OK       | AV_ERR_INVALID_VAL       |AV_ERR_OK       |
146| OH_MD_KEY_I_FRAME_INTERVAL                                                 | AV_ERR_OK       | \\       | AV_ERR_OK       |
147
148| OH_MD_KEY_<br>BITRATE | OH_MD_KEY_<br>QUALITY | OH_MD_KEY_<br>VIDEO_ENCODER_BITRATE_MODE | 返回值 | 说明                     |
149| :-------------------- | :-------------------- | :--------------------------------------- | ---- | ---------------------- |
150| \\                    | \\                    | \\                                       |  AV_ERR_OK    | 使用编码器默认值               |
151| 超出范围                  | 超出范围                  | 不支持的模式                                   | AV_ERR_INVALID_VAL   | 异常值均报错                 |
152| 正常值                   | 正常值                   | \\                                       | AV_ERR_INVALID_VAL   | Bitrate 与 Quality 冲突   |
153| 正常值                   | \\                    | \\                                       | AV_ERR_OK     | 使能默认码控模式               |
154| 正常值                   | \\                    | VBR、CBR                                  | AV_ERR_OK     |                        |
155| 正常值                   | \\                    | CQ                                       | AV_ERR_INVALID_VAL   | Bitrate 与 CQ 模式冲突      |
156| \\                    | 正常值                   | \\                                       | AV_ERR_OK     | 使能 CQ 模式               |
157| \\                    | 正常值                   | CQ                                       | AV_ERR_OK     |                        |
158| \\                    | 正常值                   | VBR、CBR                                  | AV_ERR_INVALID_VAL   | Quality 与 VBR、CBR 模式冲突 |
159| \\                    | \\                    | VBR、CBR                                  | AV_ERR_OK     | 使用编码器默认码率              |
160| \\                    | \\                    | CQ                                       | AV_ERR_OK    | 使用默认quality  |
161
162
163**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
164
165**起始版本:** 9
166
167**参数:**
168
169| 名称 | 描述 | 
170| -------- | -------- |
171| codec | 指向视频编码实例的指针。  | 
172| format | 指向OH_AVFormat的指针,用于给出要编码的视频轨的描述。  | 
173
174**返回:**
175
176返回接口结果:
177
178AV_ERR_OK:执行成功。
179
180AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
181
182AV_ERR_INVALID_VAL:
183
184    1. 输入的codec指针为非编码器实例,或者为空指针;
185    2. 输入format参数不支持。
186
187AV_ERR_UNKNOWN:未知错误。
188
189AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
190
191AV_ERR_INVALID_STATE:本接口必须在OH_VideoEncoder_Prepare接口前调用,如果在其他状态时调用,则返回此错误码。
192
193
194### OH_VideoEncoder_CreateByMime()
195
196```
197OH_AVCodec* OH_VideoEncoder_CreateByMime (const char *mime)
198```
199**描述**
200根据MIME类型创建视频编码器实例,推荐使用。
201
202**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
203
204**起始版本:** 9
205
206**参数:**
207
208| 名称 | 描述 | 
209| -------- | -------- |
210| mime | MIME类型描述字符串,请参阅[AVCODEC_MIMETYPE](_codec_base.md#变量)。 | 
211
212**返回:**
213
214成功则返回一个指向视频编码实例的指针。如果输入为不支持的编码器类型或内存不足时,则返回NULL。
215
216
217### OH_VideoEncoder_CreateByName()
218
219```
220OH_AVCodec* OH_VideoEncoder_CreateByName (const char *name)
221```
222**描述**
223根据视频编码器名称创建视频编码器实例。使用此接口的前提是知道编码器的确切名称,编码器的名称可以通过能力查询获取。
224
225**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
226
227**起始版本:** 9
228
229**参数:**
230
231| 名称 | 描述 | 
232| -------- | -------- |
233| name | 视频编码器名称。  | 
234
235**返回:**
236
237成功则返回一个指向视频编码实例的指针。如果输入是不支持编码器名称或者内存资源不足,则返回NULL。
238
239
240### OH_VideoEncoder_Destroy()
241
242```
243OH_AVErrCode OH_VideoEncoder_Destroy (OH_AVCodec *codec)
244```
245**描述**
246清理编码器内部资源,销毁编码器实例。不能重复销毁。
247
248**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
249
250**起始版本:** 9
251
252**参数:**
253
254| 名称 | 描述 | 
255| -------- | -------- |
256| codec | 指向视频编码实例的指针。  | 
257
258**返回:**
259
260返回接口结果:
261
262AV_ERR_OK:执行成功。
263
264AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
265
266AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
267
268AV_ERR_UNKNOWN:未知错误。
269
270AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
271
272
273### OH_VideoEncoder_Flush()
274
275```
276OH_AVErrCode OH_VideoEncoder_Flush (OH_AVCodec *codec)
277```
278**描述**
279
280清除编码器中缓存的输入和输出数据及参数集如H264格式的PPS/SPS281
282调用此接口后,以前通过异步回调上报的所有缓冲区index都将失效,请确保不要访问这些index对应的缓冲区。该接口不能连续调用。
283
284**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
285
286**起始版本:** 9
287
288**参数:**
289
290| 名称 | 描述 | 
291| -------- | -------- |
292| codec | 指向视频编码实例的指针。  | 
293
294**返回:**
295
296返回接口结果:
297
298AV_ERR_OK:执行成功。
299
300AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
301
302AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
303
304AV_ERR_UNKNOWN:未知错误。
305
306AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
307
308AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。
309
310
311### OH_VideoEncoder_FreeOutputBuffer()
312
313```
314OH_AVErrCode OH_VideoEncoder_FreeOutputBuffer (OH_AVCodec *codec, uint32_t index )
315```
316**描述**
317将处理后的index对应的OH_AVBuffer退回给编码器。调用者使用完需要及时调用此接口释放输出缓存区,否则会阻塞编码流程。
318
319**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
320
321**起始版本:** 11
322
323**参数:**
324
325| 名称 | 描述 | 
326| -------- | -------- |
327| codec | 指向视频编码实例的指针。  | 
328| index | 输出缓冲区对应的索引值。 由[OH_AVCodecOnNewOutputBuffer](_codec_base.md#oh_avcodeconnewoutputbuffer)给出。 |
329
330**返回:**
331
332返回接口结果:
333
334AV_ERR_OK:执行成功。
335
336AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
337
338AV_ERR_INVALID_VAL:
339
340    1. 输入的codec指针为非编码器实例,或者为空指针;
341    2. 输入format参数不支持;
342    3. index非法或者连续给同一个index,该错误不影响后续编码流程
343
344AV_ERR_UNKNOWN:未知错误。
345
346AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
347
348AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。
349
350
351### OH_VideoEncoder_GetInputDescription()
352
353```
354OH_AVFormat* OH_VideoEncoder_GetInputDescription (OH_AVCodec *codec)
355```
356**描述**
357编码器接收到的图像的描述信息。调用[OH_VideoEncoder_Configure](#oh_videoencoder_configure)后调用此接口。 
358
359需要注意的是,返回指针所指向的OH_AVFormat实例的生命周期需要由调用者通过调用OH_AVFormat_Destroy接口释放,请参阅[OH_AVFormat_Destroy](_core.md#oh_avformat_destroy)。
360
361**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
362
363**起始版本:** 10
364
365**参数:**
366
367| 名称 | 描述 | 
368| -------- | -------- |
369| codec | 指向视频编码实例的指针。  | 
370
371**返回:**
372
373返回指向OH_AVFormat实例的指针。当codec指针非编码实例,或者为空指针,则返回NULL。
374
375
376### OH_VideoEncoder_GetOutputDescription()
377
378```
379OH_AVFormat* OH_VideoEncoder_GetOutputDescription (OH_AVCodec *codec)
380```
381**描述**
382获取编码器输出数据的OH_AVFormat信息。
383
384需要注意的是,返回值指向的OH_AVFormat实例的生命周期需要调用者通过调用接口OH_AVFormat_Destroy()释放。
385
386**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
387
388**起始版本:** 9
389
390**参数:**
391
392| 名称 | 描述 | 
393| -------- | -------- |
394| codec | 指向视频编码实例的指针。  | 
395
396**返回:**
397
398返回指向OH_AVFormat实例的指针。当输入的codec指针非编码实例,或者为空指针,则返回NULL。
399
400
401### OH_VideoEncoder_GetSurface()
402
403```
404OH_AVErrCode OH_VideoEncoder_GetSurface (OH_AVCodec *codec, OHNativeWindow ** window )
405```
406**描述**
407从视频编码器获取输入surface,必须在调用OH_VideoEncoder_Prepare接口之前调用此接口。
408
409**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
410
411**起始版本:** 9
412
413**参数:**
414
415| 名称 | 描述 | 
416| -------- | -------- |
417| codec | 指向视频编码实例的指针。  | 
418| window | 指向OHNativeWindow实例的指针, 请参阅[OHNativeWindow](_codec_base.md#ohnativewindow)。 应用负责管理window的生命周期,结束时调用OH_NativeWindow_DestroyNativeWindow释放。  | 
419
420**返回:**
421
422返回接口结果:
423
424AV_ERR_OK:执行成功。
425
426AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
427
428AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
429
430
431### OH_VideoEncoder_IsValid()
432
433```
434OH_AVErrCode OH_VideoEncoder_IsValid (OH_AVCodec *codec, bool *isValid )
435```
436**描述**
437检查当前编码实例是否有效。
438
439**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
440
441**起始版本:** 10
442
443**参数:**
444
445| 名称 | 描述 | 
446| -------- | -------- |
447| codec | 指向视频编码实例的指针。  | 
448| isValid | 输出参数,指向布尔类型的指针。指向布尔实例的指针,如果编码器实例有效,则为true,如果编码器实例无效,则为false。建议调用者将isValid初始化为false。  |
449
450**返回:**
451
452返回接口结果:
453
454AV_ERR_OK:执行成功。
455
456AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
457
458
459### OH_VideoEncoder_NotifyEndOfStream()
460
461```
462OH_AVErrCode OH_VideoEncoder_NotifyEndOfStream (OH_AVCodec *codec)
463```
464**描述**
465通知视频编码器输入流已结束。建议使用此接口进行通知。该接口只在Surface模式下使用,Buffer模式通过OH_AVBuffer携带EOS信息,通知输入流的结束。
466
467**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
468
469**起始版本:** 9
470
471**参数:**
472
473| 名称 | 描述 | 
474| -------- | -------- |
475| codec | 指向视频编码实例的指针。  | 
476
477**返回:**
478
479返回接口结果:
480
481AV_ERR_OK:执行成功。
482
483AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
484
485AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
486
487AV_ERR_UNKNOWN:未知错误。
488
489AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
490
491AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。
492
493
494### OH_VideoEncoder_Prepare()
495
496```
497OH_AVErrCode OH_VideoEncoder_Prepare (OH_AVCodec *codec)
498```
499**描述**
500准备编码器的内部资源,在OH_VideoEncoder_Configure接口后调用。
501
502**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
503
504**起始版本:** 9
505
506**参数:**
507
508| 名称 | 描述 | 
509| -------- | -------- |
510| codec | 指向视频编码实例的指针。  | 
511
512**返回:**
513
514返回接口结果:
515
516AV_ERR_OK:执行成功。
517
518AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
519
520AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
521
522
523### OH_VideoEncoder_PushInputBuffer()
524
525```
526OH_AVErrCode OH_VideoEncoder_PushInputBuffer (OH_AVCodec *codec, uint32_t index )
527```
528**描述**
529Buffer模式下,将index对应的OH_AVBuffer送入编码器编码。
530
531**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
532
533**起始版本:** 11
534
535**参数:**
536
537| 名称 | 描述 | 
538| -------- | -------- |
539| codec | 指向视频编码实例的指针。  | 
540| index | 输入缓冲区对应的索引值。由[OH_AVCodecOnNeedInputBuffer](_codec_base.md#oh_avcodeconneedinputbuffer)给出。 | 
541
542**返回:**
543
544返回接口结果:
545
546AV_ERR_OK:执行成功。
547
548AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
549
550AV_ERR_INVALID_VAL:
551
552    1. 输入的codec指针为非编码器实例,或者为空指针;
553    2. 输入format参数不支持。
554
555AV_ERR_UNKNOWN:未知错误。
556
557AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
558
559AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。
560
561
562### OH_VideoEncoder_PushInputParameter()
563
564```
565OH_AVErrCode OH_VideoEncoder_PushInputParameter (OH_AVCodec *codec, uint32_t index)
566```
567**描述**
568Surface模式下,将index对应帧的编码参数送入编码器编码。
569
570**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
571
572**起始版本:** 12
573
574**参数:**
575
576| 名称 | 描述 | 
577| -------- | -------- |
578| codec | 指向视频编码实例的指针。  | 
579| index | 输入参数缓冲区对应的索引值。由[OH_VideoEncoder_OnNeedInputParameter](#oh_videoencoder_onneedinputparameter)给出。  | 
580
581**返回:**
582
583返回接口结果:
584
585AV_ERR_OK:执行成功。
586
587AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
588
589AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
590
591AV_ERR_UNKNOWN:未知错误。
592
593AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
594
595AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。
596
597
598### OH_VideoEncoder_RegisterCallback()
599
600```
601OH_AVErrCode OH_VideoEncoder_RegisterCallback (OH_AVCodec *codec, OH_AVCodecCallback callback, void *userData )
602```
603**描述**
604注册OH_AVCodecCallback回调函数,让应用可以响应视频编码器生成的事件。在调用OH_VideoEncoder_Prepare接口之前,必须调用此接口。
605
606**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
607
608**起始版本:** 11
609
610**参数:**
611
612| 名称 | 描述 | 
613| -------- | -------- |
614| codec | 指向视频编码实例的指针。  | 
615| callback | 所有回调函数的集合,请参阅[OH_AVCodecCallback](_o_h___a_v_codec_callback.md)。  | 
616| userData | 调用者执行回调所依赖的数据。  | 
617
618**返回:**
619
620返回接口结果:
621
622AV_ERR_OK:执行成功。
623
624AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
625
626AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
627
628AV_ERR_UNKNOWN:未知错误。
629
630AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
631
632AV_ERR_INVALID_STATE:本接口必须在OH_VideoEncoder_Prepare接口前调用,如果在其他状态时调用,则返回此错误码。
633
634
635### OH_VideoEncoder_RegisterParameterCallback()
636
637```
638OH_AVErrCode OH_VideoEncoder_RegisterParameterCallback (OH_AVCodec *codec, OH_VideoEncoder_OnNeedInputParameter onInputParameter, void *userData)
639```
640**描述**
641注册OH_AVCodecCallback输入参数回调函数,让应用可以响应视频编码器生成的事件。编码Surface模式,需要设置随帧参数时,须使用该接口。
642
643如果使用该接口,必须在[OH_VideoEncoder_Configure](#oh_videoencoder_configure)之前调用该接口。
644
645**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
646
647**起始版本:** 12
648
649**参数:**
650
651| 名称 | 描述 | 
652| -------- | -------- |
653| codec | 指向视频编码实例的指针。  | 
654| onInputParameter | 输入参数回调指针, 请参阅[OH_VideoEncoder_OnNeedInputParameter](#oh_videoencoder_onneedinputparameter)。  | 
655| userData | 调用者执行回调所依赖的数据。  |
656
657**返回:**
658
659返回接口结果:
660
661AV_ERR_OK:执行成功。
662
663AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
664
665AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
666
667AV_ERR_UNKNOWN:未知错误。
668
669AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
670
671AV_ERR_INVALID_STATE:本接口必须在OH_VideoEncoder_Prepare接口前调用,如果在其他状态时调用,则返回此错误码。
672
673
674### OH_VideoEncoder_Reset()
675
676```
677OH_AVErrCode OH_VideoEncoder_Reset (OH_AVCodec *codec)
678```
679**描述**
680重置编码器,编码器回到初始化状态。如果要继续编码,需要再次调用OH_VideoEncoder_Configure接口配置编码器实例。
681
682**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
683
684**起始版本:** 9
685
686**参数:**
687
688| 名称 | 描述 | 
689| -------- | -------- |
690| codec | 指向视频编码实例的指针。  | 
691
692**返回:**
693
694返回接口结果:
695
696AV_ERR_OK:执行成功。
697
698AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
699
700AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
701
702AV_ERR_UNKNOWN:未知错误。
703
704AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
705
706
707### OH_VideoEncoder_SetParameter()
708
709```
710OH_AVErrCode OH_VideoEncoder_SetParameter (OH_AVCodec *codec, OH_AVFormat *format )
711```
712**描述**
713在编码器运行时设置编码器参数。 
714
715注意,此接口只有在编码器启动后才能调用。 同时,不正确的参数设置可能会导致编码失败。
716
717**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
718
719**起始版本:** 9
720
721**参数:**
722
723| 名称 | 描述 | 
724| -------- | -------- |
725| codec | 指向视频编码实例的指针。  | 
726| format | 指向OH_AVFormat实例的指针。  | 
727
728**返回:**
729
730返回接口结果:
731
732AV_ERR_OK:执行成功。
733
734AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
735
736AV_ERR_INVALID_VAL:
737
738    1. 输入的codec指针为非编码器实例,或者为空指针;
739    2. 输入format参数不支持。
740
741AV_ERR_UNKNOWN:未知错误。
742
743AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
744
745AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。
746
747
748### OH_VideoEncoder_Start()
749
750```
751OH_AVErrCode OH_VideoEncoder_Start (OH_AVCodec *codec)
752```
753**描述**
754调用OH_VideoEncoder_Prepare接口成功后调用此接口启动解码器。成功启动后,编码器将开始报告注册的回调事件。
755
756Surface模式下,在surface中有正确的输入后,每完成一帧编码会触发OnNewOutputBuffer。
757
758Buffer模式下,编码器会立即触发输入回调,调用者每完成一次输入,编码器执行编码,每完成一帧编码会触发OnNewOutputBuffer。
759
760**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
761
762**起始版本:** 9
763
764**参数:**
765
766| 名称 | 描述 | 
767| -------- | -------- |
768| codec | 指向视频编码实例的指针。  | 
769
770**返回:**
771
772返回接口结果:
773
774AV_ERR_OK:执行成功。
775
776AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
777
778AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
779
780AV_ERR_UNKNOWN:未知错误。
781
782AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
783
784AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。
785
786
787### OH_VideoEncoder_Stop()
788
789```
790OH_AVErrCode OH_VideoEncoder_Stop (OH_AVCodec *codec)
791```
792**描述**
793停止编码器,释放输入输出buffer。停止之后,可以通过调用OH_VideoEncoder_Start接口重新进入Running状态。
794
795**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
796
797**起始版本:** 9
798
799**参数:**
800
801| 名称 | 描述 | 
802| -------- | -------- |
803| codec | 指向视频编码实例的指针。  | 
804
805**返回:**
806
807返回接口结果:
808
809AV_ERR_OK:执行成功。
810
811AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
812
813AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
814
815AV_ERR_UNKNOWN:未知错误。
816
817AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
818
819AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。
820
821
822## 废弃函数说明
823
824
825### OH_VideoEncoder_SetCallback()
826
827```
828OH_AVErrCode OH_VideoEncoder_SetCallback (OH_AVCodec *codec, OH_AVCodecAsyncCallback callback, void *userData )
829```
830**描述**
831设置OH_AVCodecCallback回调函数,让应用可以响应视频编码器生成的事件。在调用OH_VideoEncoder_Prepare接口之前,必须调用此接口。
832
833**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
834
835**起始版本:** 9
836
837**废弃版本:** 11
838
839**替代接口:**[OH_VideoEncoder_RegisterCallback](#oh_videoencoder_registercallback)
840
841**参数:**
842
843| 名称 | 描述 | 
844| -------- | -------- |
845| codec | 指向视频编码实例的指针。  | 
846| callback | 所有回调函数的集合,请参阅[OH_AVCodecAsyncCallback](_o_h___a_v_codec_async_callback.md)。  | 
847| userData | 调用者执行回调所依赖的数据。  |
848
849**返回:**
850
851返回接口结果:
852
853AV_ERR_OK:执行成功。
854
855AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
856
857AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
858
859AV_ERR_UNKNOWN:未知错误。
860
861AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
862
863AV_ERR_INVALID_STATE:本接口必须在OH_VideoEncoder_Prepare接口前调用,如果在其他状态时调用,则返回此错误码。
864
865
866### OH_VideoEncoder_PushInputData()
867
868```
869OH_AVErrCode OH_VideoEncoder_PushInputData (OH_AVCodec *codec, uint32_t index, OH_AVCodecBufferAttr attr )
870```
871**描述**
872将填入数据的输入缓冲区提交给视频编码器。
873
874**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
875
876**起始版本:** 10
877
878**废弃版本:** 11
879
880**替代接口:**[OH_VideoEncoder_PushInputBuffer](#oh_videoencoder_pushinputbuffer)
881
882**参数:**
883
884| 名称 | 描述 | 
885| -------- | -------- |
886| codec | 指向视频编码实例的指针。  | 
887| index | 输入缓冲区对应的索引值。由[OH_AVCodecOnNeedInputData](_codec_base.md#oh_avcodeconneedinputdata)给出。  | 
888| attr | 缓冲区中包含数据的描述信息。  | 
889
890**返回:**
891
892返回接口结果:
893
894AV_ERR_OK:执行成功。
895
896AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
897
898AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
899
900AV_ERR_UNKNOWN:未知错误。
901
902AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
903
904AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。
905
906
907### OH_VideoEncoder_FreeOutputData()
908
909```
910OH_AVErrCode OH_VideoEncoder_FreeOutputData (OH_AVCodec *codec, uint32_t index )
911```
912**描述**
913将处理后的输出缓冲区返回给编码器。
914
915**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
916
917**起始版本:** 9
918
919**废弃版本:** 11
920
921**替代接口:**[OH_VideoEncoder_FreeOutputBuffer](#oh_videoencoder_freeoutputbuffer)
922
923**参数:**
924
925| 名称 | 描述 | 
926| -------- | -------- |
927| codec | 指向视频编码实例的指针。  | 
928| index | 输出缓冲区对应的索引值。由[OH_AVCodecOnNewOutputData](_codec_base.md#oh_avcodeconnewoutputdata)给出。  | 
929
930**返回:**
931
932返回接口结果:
933
934AV_ERR_OK:执行成功。
935
936AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
937
938AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
939
940AV_ERR_UNKNOWN:未知错误。
941
942AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
943
944AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。