• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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](_codec_base.md#媒体编解码格式)类型创建视频编码器实例,推荐使用。  |
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详情请参见:[获取支持的编解码能力](../../media/avcodec/obtain-supported-codecs.md#创建指定名称的编解码器)。
226
227**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
228
229**起始版本:** 9
230
231**参数:**
232
233| 名称 | 描述 |
234| -------- | -------- |
235| name | 视频编码器名称。  |
236
237**返回:**
238
239成功则返回一个指向视频编码实例的指针。如果输入是不支持编码器名称或者内存资源不足,则返回NULL。
240
241
242### OH_VideoEncoder_Destroy()
243
244```
245OH_AVErrCode OH_VideoEncoder_Destroy (OH_AVCodec *codec)
246```
247**描述**
248清理编码器内部资源,销毁编码器实例。不能重复销毁。
249
250**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
251
252**起始版本:** 9
253
254**参数:**
255
256| 名称 | 描述 |
257| -------- | -------- |
258| codec | 指向视频编码实例的指针。  |
259
260**返回:**
261
262返回接口结果:
263
264AV_ERR_OK:执行成功。
265
266AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
267
268AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
269
270AV_ERR_UNKNOWN:未知错误。
271
272AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
273
274
275### OH_VideoEncoder_Flush()
276
277```
278OH_AVErrCode OH_VideoEncoder_Flush (OH_AVCodec *codec)
279```
280**描述**
281
282清除编码器中缓存的输入和输出数据及参数集如H264格式的PPS/SPS283
284调用此接口后,以前通过异步回调上报的所有缓冲区index都将失效,请确保不要访问这些index对应的缓冲区。该接口不能连续调用。
285
286**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
287
288**起始版本:** 9
289
290**参数:**
291
292| 名称 | 描述 |
293| -------- | -------- |
294| codec | 指向视频编码实例的指针。  |
295
296**返回:**
297
298返回接口结果:
299
300AV_ERR_OK:执行成功。
301
302AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
303
304AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
305
306AV_ERR_UNKNOWN:未知错误。
307
308AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
309
310AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。
311
312
313### OH_VideoEncoder_FreeOutputBuffer()
314
315```
316OH_AVErrCode OH_VideoEncoder_FreeOutputBuffer (OH_AVCodec *codec, uint32_t index )
317```
318**描述**
319将处理后的index对应的OH_AVBuffer退回给编码器。调用者使用完需要及时调用此接口释放输出缓存区,否则会阻塞编码流程。
320
321详情请参见:[视频编码](../../media/avcodec/video-encoding.md) “Surface模式的步骤-14或Buffer模式步骤-10”。
322
323**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
324
325**起始版本:** 11
326
327**参数:**
328
329| 名称 | 描述 |
330| -------- | -------- |
331| codec | 指向视频编码实例的指针。  |
332| index | 输出缓冲区对应的索引值。 由[OH_AVCodecOnNewOutputBuffer](_codec_base.md#oh_avcodeconnewoutputbuffer)给出。 |
333
334**返回:**
335
336返回接口结果:
337
338AV_ERR_OK:执行成功。
339
340AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
341
342AV_ERR_INVALID_VAL:
343
344    1. 输入的codec指针为非编码器实例,或者为空指针;
345    2. 输入format参数不支持;
346    3. index非法或者连续给同一个index,该错误不影响后续编码流程
347
348AV_ERR_UNKNOWN:未知错误。
349
350AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
351
352AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。
353
354
355### OH_VideoEncoder_GetInputDescription()
356
357```
358OH_AVFormat* OH_VideoEncoder_GetInputDescription (OH_AVCodec *codec)
359```
360**描述**
361编码器接收到的图像的描述信息。调用[OH_VideoEncoder_Configure](#oh_videoencoder_configure)后调用此接口。
362
363需要注意的是,返回指针所指向的OH_AVFormat实例的生命周期需要由调用者通过调用OH_AVFormat_Destroy接口释放,请参阅[OH_AVFormat_Destroy](_core.md#oh_avformat_destroy)。
364
365**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
366
367**起始版本:** 10
368
369**参数:**
370
371| 名称 | 描述 |
372| -------- | -------- |
373| codec | 指向视频编码实例的指针。  |
374
375**返回:**
376
377返回指向OH_AVFormat实例的指针。当codec指针非编码实例,或者为空指针,则返回NULL。
378
379
380### OH_VideoEncoder_GetOutputDescription()
381
382```
383OH_AVFormat* OH_VideoEncoder_GetOutputDescription (OH_AVCodec *codec)
384```
385**描述**
386获取编码器输出数据的OH_AVFormat信息。
387
388需要注意的是,返回值指向的OH_AVFormat实例的生命周期需要调用者通过调用接口[OH_AVFormat_Destroy](_core.md#oh_avformat_destroy)释放。
389
390**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
391
392**起始版本:** 9
393
394**参数:**
395
396| 名称 | 描述 |
397| -------- | -------- |
398| codec | 指向视频编码实例的指针。  |
399
400**返回:**
401
402返回指向OH_AVFormat实例的指针。当输入的codec指针非编码实例,或者为空指针,则返回NULL。
403
404
405### OH_VideoEncoder_GetSurface()
406
407```
408OH_AVErrCode OH_VideoEncoder_GetSurface (OH_AVCodec *codec, OHNativeWindow ** window )
409```
410**描述**
411从视频编码器获取输入surface,必须在调用OH_VideoEncoder_Configure接口之后OH_VideoEncoder_Prepare接口之前调用此接口。
412
413**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
414
415**起始版本:** 9
416
417**参数:**
418
419| 名称 | 描述 |
420| -------- | -------- |
421| codec | 指向视频编码实例的指针。  |
422| window | 指向OHNativeWindow实例的指针, 请参阅[OHNativeWindow](_codec_base.md#ohnativewindow)。 应用负责管理window的生命周期,结束时调用OH_NativeWindow_DestroyNativeWindow释放。  |
423
424**返回:**
425
426返回接口结果:
427
428AV_ERR_OK:执行成功。
429
430AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
431
432AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
433
434
435### OH_VideoEncoder_IsValid()
436
437```
438OH_AVErrCode OH_VideoEncoder_IsValid (OH_AVCodec *codec, bool *isValid )
439```
440**描述**
441检查当前编码实例是否有效。
442
443**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
444
445**起始版本:** 10
446
447**参数:**
448
449| 名称 | 描述 |
450| -------- | -------- |
451| codec | 指向视频编码实例的指针。  |
452| isValid | 输出参数,指向布尔类型的指针。指向布尔实例的指针,如果编码器实例有效,则为true,如果编码器实例无效,则为false。建议调用者将isValid初始化为false。  |
453
454**返回:**
455
456返回接口结果:
457
458AV_ERR_OK:执行成功。
459
460AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
461
462
463### OH_VideoEncoder_NotifyEndOfStream()
464
465```
466OH_AVErrCode OH_VideoEncoder_NotifyEndOfStream (OH_AVCodec *codec)
467```
468**描述**
469通知视频编码器输入流已结束。建议使用此接口进行通知。该接口只在Surface模式下使用,Buffer模式通过OH_AVBuffer携带EOS信息,通知输入流的结束。
470
471**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
472
473**起始版本:** 9
474
475**参数:**
476
477| 名称 | 描述 |
478| -------- | -------- |
479| codec | 指向视频编码实例的指针。  |
480
481**返回:**
482
483返回接口结果:
484
485AV_ERR_OK:执行成功。
486
487AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
488
489AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
490
491AV_ERR_UNKNOWN:未知错误。
492
493AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
494
495AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。
496
497
498### OH_VideoEncoder_Prepare()
499
500```
501OH_AVErrCode OH_VideoEncoder_Prepare (OH_AVCodec *codec)
502```
503**描述**
504准备编码器的内部资源,在OH_VideoEncoder_Configure接口后调用。
505
506**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
507
508**起始版本:** 9
509
510**参数:**
511
512| 名称 | 描述 |
513| -------- | -------- |
514| codec | 指向视频编码实例的指针。  |
515
516**返回:**
517
518返回接口结果:
519
520AV_ERR_OK:执行成功。
521
522AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
523
524AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
525
526
527### OH_VideoEncoder_PushInputBuffer()
528
529```
530OH_AVErrCode OH_VideoEncoder_PushInputBuffer (OH_AVCodec *codec, uint32_t index )
531```
532**描述**
533Buffer模式下,将index对应的OH_AVBuffer送入编码器编码。
534
535**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
536
537**起始版本:** 11
538
539**参数:**
540
541| 名称 | 描述 |
542| -------- | -------- |
543| codec | 指向视频编码实例的指针。  |
544| index | 输入缓冲区对应的索引值。由[OH_AVCodecOnNeedInputBuffer](_codec_base.md#oh_avcodeconneedinputbuffer)给出。 |
545
546**返回:**
547
548返回接口结果:
549
550AV_ERR_OK:执行成功。
551
552AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
553
554AV_ERR_INVALID_VAL:
555
556    1. 输入的codec指针为非编码器实例,或者为空指针;
557    2. 输入format参数不支持。
558
559AV_ERR_UNKNOWN:未知错误。
560
561AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
562
563AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。
564
565
566### OH_VideoEncoder_PushInputParameter()
567
568```
569OH_AVErrCode OH_VideoEncoder_PushInputParameter (OH_AVCodec *codec, uint32_t index)
570```
571**描述**
572Surface模式下,将index对应帧的编码参数送入编码器编码。
573
574**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
575
576**起始版本:** 12
577
578**参数:**
579
580| 名称 | 描述 |
581| -------- | -------- |
582| codec | 指向视频编码实例的指针。  |
583| index | 输入参数缓冲区对应的索引值。由[OH_VideoEncoder_OnNeedInputParameter](#oh_videoencoder_onneedinputparameter)给出。  |
584
585**返回:**
586
587返回接口结果:
588
589AV_ERR_OK:执行成功。
590
591AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
592
593AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
594
595AV_ERR_UNKNOWN:未知错误。
596
597AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
598
599AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。
600
601
602### OH_VideoEncoder_RegisterCallback()
603
604```
605OH_AVErrCode OH_VideoEncoder_RegisterCallback (OH_AVCodec *codec, OH_AVCodecCallback callback, void *userData )
606```
607**描述**
608注册OH_AVCodecCallback回调函数,让应用可以响应视频编码器生成的事件。在调用OH_VideoEncoder_Prepare接口之前,必须调用此接口。
609
610**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
611
612**起始版本:** 11
613
614**参数:**
615
616| 名称 | 描述 |
617| -------- | -------- |
618| codec | 指向视频编码实例的指针。  |
619| callback | 所有回调函数的集合,请参阅[OH_AVCodecCallback](_o_h___a_v_codec_callback.md)。  |
620| userData | 调用者执行回调所依赖的数据。  |
621
622**返回:**
623
624返回接口结果:
625
626AV_ERR_OK:执行成功。
627
628AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
629
630AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
631
632AV_ERR_UNKNOWN:未知错误。
633
634AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
635
636AV_ERR_INVALID_STATE:本接口必须在OH_VideoEncoder_Prepare接口前调用,如果在其他状态时调用,则返回此错误码。
637
638
639### OH_VideoEncoder_RegisterParameterCallback()
640
641```
642OH_AVErrCode OH_VideoEncoder_RegisterParameterCallback (OH_AVCodec *codec, OH_VideoEncoder_OnNeedInputParameter onInputParameter, void *userData)
643```
644**描述**
645注册OH_AVCodecCallback输入参数回调函数,让应用可以响应视频编码器生成的事件。编码Surface模式,需要设置随帧参数时,须使用该接口。
646
647如果使用该接口,必须在[OH_VideoEncoder_Configure](#oh_videoencoder_configure)之前调用该接口。
648
649**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
650
651**起始版本:** 12
652
653**参数:**
654
655| 名称 | 描述 |
656| -------- | -------- |
657| codec | 指向视频编码实例的指针。  |
658| onInputParameter | 输入参数回调指针, 请参阅[OH_VideoEncoder_OnNeedInputParameter](#oh_videoencoder_onneedinputparameter)。  |
659| userData | 调用者执行回调所依赖的数据。  |
660
661**返回:**
662
663返回接口结果:
664
665AV_ERR_OK:执行成功。
666
667AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
668
669AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
670
671AV_ERR_UNKNOWN:未知错误。
672
673AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
674
675AV_ERR_INVALID_STATE:本接口必须在OH_VideoEncoder_Prepare接口前调用,如果在其他状态时调用,则返回此错误码。
676
677
678### OH_VideoEncoder_Reset()
679
680```
681OH_AVErrCode OH_VideoEncoder_Reset (OH_AVCodec *codec)
682```
683**描述**
684重置编码器,编码器回到初始化状态。如果要继续编码,需要再次调用OH_VideoEncoder_Configure接口配置编码器实例。
685
686**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
687
688**起始版本:** 9
689
690**参数:**
691
692| 名称 | 描述 |
693| -------- | -------- |
694| codec | 指向视频编码实例的指针。  |
695
696**返回:**
697
698返回接口结果:
699
700AV_ERR_OK:执行成功。
701
702AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
703
704AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
705
706AV_ERR_UNKNOWN:未知错误。
707
708AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
709
710
711### OH_VideoEncoder_SetParameter()
712
713```
714OH_AVErrCode OH_VideoEncoder_SetParameter (OH_AVCodec *codec, OH_AVFormat *format )
715```
716**描述**
717在编码器运行时设置编码器参数。
718
719注意,此接口只有在编码器启动后才能调用。 同时,不正确的参数设置可能会导致编码失败。
720
721**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
722
723**起始版本:** 9
724
725**参数:**
726
727| 名称 | 描述 |
728| -------- | -------- |
729| codec | 指向视频编码实例的指针。  |
730| format | 指向OH_AVFormat实例的指针。  |
731
732**返回:**
733
734返回接口结果:
735
736AV_ERR_OK:执行成功。
737
738AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
739
740AV_ERR_INVALID_VAL:
741
742    1. 输入的codec指针为非编码器实例,或者为空指针;
743    2. 输入format参数不支持。
744
745AV_ERR_UNKNOWN:未知错误。
746
747AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
748
749AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。
750
751
752### OH_VideoEncoder_Start()
753
754```
755OH_AVErrCode OH_VideoEncoder_Start (OH_AVCodec *codec)
756```
757**描述**
758调用OH_VideoEncoder_Prepare接口成功后调用此接口启动解码器。成功启动后,编码器将开始报告注册的回调事件。
759
760Surface模式下,在surface中有正确的输入后,每完成一帧编码会触发OnNewOutputBuffer。
761
762Buffer模式下,编码器会立即触发输入回调,调用者每完成一次输入,编码器执行编码,每完成一帧编码会触发OnNewOutputBuffer。
763
764**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
765
766**起始版本:** 9
767
768**参数:**
769
770| 名称 | 描述 |
771| -------- | -------- |
772| codec | 指向视频编码实例的指针。  |
773
774**返回:**
775
776返回接口结果:
777
778AV_ERR_OK:执行成功。
779
780AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
781
782AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
783
784AV_ERR_UNKNOWN:未知错误。
785
786AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
787
788AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。
789
790
791### OH_VideoEncoder_Stop()
792
793```
794OH_AVErrCode OH_VideoEncoder_Stop (OH_AVCodec *codec)
795```
796**描述**
797停止编码器,释放输入输出buffer。停止之后,可以通过调用OH_VideoEncoder_Start接口重新进入Running状态。
798
799**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
800
801**起始版本:** 9
802
803**参数:**
804
805| 名称 | 描述 |
806| -------- | -------- |
807| codec | 指向视频编码实例的指针。  |
808
809**返回:**
810
811返回接口结果:
812
813AV_ERR_OK:执行成功。
814
815AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
816
817AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
818
819AV_ERR_UNKNOWN:未知错误。
820
821AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
822
823AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。
824
825
826## 废弃函数说明
827
828
829### OH_VideoEncoder_SetCallback()
830
831```
832OH_AVErrCode OH_VideoEncoder_SetCallback (OH_AVCodec *codec, OH_AVCodecAsyncCallback callback, void *userData )
833```
834**描述**
835设置OH_AVCodecCallback回调函数,让应用可以响应视频编码器生成的事件。在调用OH_VideoEncoder_Prepare接口之前,必须调用此接口。
836
837**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
838
839**起始版本:** 9
840
841**废弃版本:** 11
842
843**替代接口:**[OH_VideoEncoder_RegisterCallback](#oh_videoencoder_registercallback)
844
845**参数:**
846
847| 名称 | 描述 |
848| -------- | -------- |
849| codec | 指向视频编码实例的指针。  |
850| callback | 所有回调函数的集合,请参阅[OH_AVCodecAsyncCallback](_o_h___a_v_codec_async_callback.md)。  |
851| userData | 调用者执行回调所依赖的数据。  |
852
853**返回:**
854
855返回接口结果:
856
857AV_ERR_OK:执行成功。
858
859AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
860
861AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
862
863AV_ERR_UNKNOWN:未知错误。
864
865AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
866
867AV_ERR_INVALID_STATE:本接口必须在OH_VideoEncoder_Prepare接口前调用,如果在其他状态时调用,则返回此错误码。
868
869
870### OH_VideoEncoder_PushInputData()
871
872```
873OH_AVErrCode OH_VideoEncoder_PushInputData (OH_AVCodec *codec, uint32_t index, OH_AVCodecBufferAttr attr )
874```
875**描述**
876将填入数据的输入缓冲区提交给视频编码器。
877
878**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
879
880**起始版本:** 10
881
882**废弃版本:** 11
883
884**替代接口:**[OH_VideoEncoder_PushInputBuffer](#oh_videoencoder_pushinputbuffer)
885
886**参数:**
887
888| 名称 | 描述 |
889| -------- | -------- |
890| codec | 指向视频编码实例的指针。  |
891| index | 输入缓冲区对应的索引值。由[OH_AVCodecOnNeedInputData](_codec_base.md#oh_avcodeconneedinputdata)给出。  |
892| attr | 缓冲区中包含数据的描述信息。  |
893
894**返回:**
895
896返回接口结果:
897
898AV_ERR_OK:执行成功。
899
900AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
901
902AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
903
904AV_ERR_UNKNOWN:未知错误。
905
906AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
907
908AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。
909
910
911### OH_VideoEncoder_FreeOutputData()
912
913```
914OH_AVErrCode OH_VideoEncoder_FreeOutputData (OH_AVCodec *codec, uint32_t index )
915```
916**描述**
917将处理后的输出缓冲区返回给编码器。
918
919**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder
920
921**起始版本:** 9
922
923**废弃版本:** 11
924
925**替代接口:**[OH_VideoEncoder_FreeOutputBuffer](#oh_videoencoder_freeoutputbuffer)
926
927**参数:**
928
929| 名称 | 描述 |
930| -------- | -------- |
931| codec | 指向视频编码实例的指针。  |
932| index | 输出缓冲区对应的索引值。由[OH_AVCodecOnNewOutputData](_codec_base.md#oh_avcodeconnewoutputdata)给出。  |
933
934**返回:**
935
936返回接口结果:
937
938AV_ERR_OK:执行成功。
939
940AV_ERR_NO_MEMORY:输入的编码实例内部异常,如内部出现异常空指针。
941
942AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。
943
944AV_ERR_UNKNOWN:未知错误。
945
946AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。
947
948AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。