1# AVMuxer 2 3<!--Kit: AVCodec Kit--> 4<!--Subsystem: Multimedia--> 5<!--Owner: @mr-chencxy--> 6<!--Designer: @dpy2650---> 7<!--Tester: @baotianhao--> 8<!--Adviser: @zengyawen--> 9 10## 概述 11 12AVMuxer模块提供用于音视频封装功能的接口。 13 14对应的开发指南及样例可参考[媒体数据封装](../../media/avcodec/audio-video-muxer.md)。 15 16**系统能力:** SystemCapability.Multimedia.Media.Muxer 17 18**起始版本:** 10 19 20 21## 汇总 22 23 24### 文件 25 26| 名称 | 描述 | 27| -------- | -------- | 28| [native_avmuxer.h](native__avmuxer_8h.md) | 声明用于音视频封装的Native API。 | 29 30 31### 类型定义 32 33| 名称 | 描述 | 34| -------- | -------- | 35| typedef struct [OH_AVMuxer](#oh_avmuxer) [OH_AVMuxer](#oh_avmuxer) | 定义封装接口native层对象类型。 | 36 37 38### 函数 39 40| 名称 | 描述 | 41| -------- | -------- | 42| [OH_AVMuxer](#oh_avmuxer) \* [OH_AVMuxer_Create](#oh_avmuxer_create) (int32_t fd, [OH_AVOutputFormat](_codec_base.md#oh_avoutputformat) format) | 通过文件描述符fd和封装格式创建OH_AVMuxer实例。 | 43| [OH_AVErrCode](_core.md#oh_averrcode) [OH_AVMuxer_SetRotation](#oh_avmuxer_setrotation) ([OH_AVMuxer](#oh_avmuxer) \*muxer, int32_t rotation) | 设置视频的旋转角度(顺时针,且旋转角度必须为0、90、180或270)。 | 44| [OH_AVErrCode](_core.md#oh_averrcode) [OH_AVMuxer_SetFormat](#oh_avmuxer_setformat) ([OH_AVMuxer](#oh_avmuxer) \*muxer, [OH_AVFormat](_core.md#oh_avformat) \*format) | 设置format数据到封装器。 | 45| [OH_AVErrCode](_core.md#oh_averrcode) [OH_AVMuxer_AddTrack](#oh_avmuxer_addtrack) ([OH_AVMuxer](#oh_avmuxer) \*muxer, int32_t \*trackIndex, [OH_AVFormat](_core.md#oh_avformat) \*trackFormat) | 向封装器添加音视频轨。| 46| [OH_AVErrCode](_core.md#oh_averrcode) [OH_AVMuxer_Start](#oh_avmuxer_start) ([OH_AVMuxer](#oh_avmuxer) \*muxer) | 开始封装。| 47| [OH_AVErrCode](_core.md#oh_averrcode) [OH_AVMuxer_WriteSample](#oh_avmuxer_writesample) ([OH_AVMuxer](#oh_avmuxer) \*muxer, uint32_t trackIndex, [OH_AVMemory](_core.md#oh_avmemory) \*sample, [OH_AVCodecBufferAttr](_o_h___a_v_codec_buffer_attr.md) info) | 将sample写入封装器(API11已废弃)。 | 48| [OH_AVErrCode](_core.md#oh_averrcode) [OH_AVMuxer_WriteSampleBuffer](#oh_avmuxer_writesamplebuffer) ([OH_AVMuxer](#oh_avmuxer) \*muxer, uint32_t trackIndex, const [OH_AVBuffer](_core.md#oh_avbuffer) \*sample) | 将sample写入封装器。 | 49| [OH_AVErrCode](_core.md#oh_averrcode) [OH_AVMuxer_Stop](#oh_avmuxer_stop) ([OH_AVMuxer](#oh_avmuxer) \*muxer) | 停止封装。 | 50| [OH_AVErrCode](_core.md#oh_averrcode) [OH_AVMuxer_Destroy](#oh_avmuxer_destroy) ([OH_AVMuxer](#oh_avmuxer) \*muxer) | 清理内部资源,销毁OH_AVMuxer实例。 | 51 52 53## 类型定义说明 54 55 56### OH_AVMuxer 57 58``` 59typedef struct OH_AVMuxer OH_AVMuxer 60``` 61**描述** 62定义封装接口native层对象类型。 63 64**起始版本:** 10 65 66 67## 函数说明 68 69 70### OH_AVMuxer_AddTrack() 71 72``` 73OH_AVErrCode OH_AVMuxer_AddTrack (OH_AVMuxer *muxer, int32_t *trackIndex, OH_AVFormat *trackFormat) 74``` 75**描述** 76向封装器添加音视频轨。每调用一次本接口可以在封装器中添加一个音视频轨。该接口必须在OH_AVMuxer_Start前调用。 77 78**系统能力:** SystemCapability.Multimedia.Media.Muxer 79 80**起始版本:** 10 81 82**参数:** 83 84| 名称 | 描述 | 85| -------- | -------- | 86| muxer | 指向OH_AVMuxer实例的指针。 | 87| trackIndex | 用于获取该轨的索引,该值在OH_AVMuxer_WriteSample接口中使用。 如果音视频轨添加成功,该值大于或等于0,否则小于0。 | 88| trackFormat | 指向OH_AVFormat实例的指针。 | 89 90**返回:** 91 92执行成功返回AV_ERR_OK,否则返回具体错误码,参考[OH_AVErrCode](_core.md#oh_averrcode)。 93 94AV_ERR_INVALID_VAL,muxer为空指针,或trackIndex无效,或trackFormat无效。 AV_ERR_OPERATE_NOT_PERMIT,不允许调用该接口,请检查接口调用顺序。AV_ERR_UNSUPPORT,不支持的mime类型。 AV_ERR_NO_MEMORY,申请内存失败。AV_ERR_UNKNOWN,未知错误。 95 96 97### OH_AVMuxer_Create() 98 99``` 100OH_AVMuxer* OH_AVMuxer_Create (int32_t fd, OH_AVOutputFormat format) 101``` 102**描述** 103通过文件描述符fd和封装格式创建OH_AVMuxer实例。 104 105**系统能力:** SystemCapability.Multimedia.Media.Muxer 106 107**起始版本:** 10 108 109**参数:** 110 111| 名称 | 描述 | 112| -------- | -------- | 113| fd | 用读写方式打开(O_RDWR),由调用者关闭该fd。 | 114| format | 封装输出的文件格式,参考[OH_AVOutputFormat](_codec_base.md#oh_avoutputformat-1)。 | 115 116**返回:** 117 118返回一个指向OH_AVMuxer实例的指针, 在封装使用结束后需要调用OH_AVMuxer_Destroy销毁。 119 120 121### OH_AVMuxer_Destroy() 122 123``` 124OH_AVErrCode OH_AVMuxer_Destroy (OH_AVMuxer *muxer) 125``` 126**描述** 127清理内部资源,销毁OH_AVMuxer实例。 128 129注意不能重复销毁,否则会导致程序崩溃。 130 131**系统能力:** SystemCapability.Multimedia.Media.Muxer 132 133**起始版本:** 10 134 135**参数:** 136 137| 名称 | 描述 | 138| -------- | -------- | 139| muxer | 指向OH_AVMuxer实例的指针。 | 140 141**返回:** 142 143执行成功返回AV_ERR_OK,需调用者置空muxer;否则返回具体错误码,参考[OH_AVErrCode](_core.md#oh_averrcode)。 144 145AV_ERR_INVALID_VAL,muxer为空指针。 146 147 148### OH_AVMuxer_SetRotation() 149 150``` 151OH_AVErrCode OH_AVMuxer_SetRotation (OH_AVMuxer *muxer, int32_t rotation) 152``` 153**描述** 154设置视频的旋转角度(顺时针,且旋转角度必须为0、90、180或270)。该接口必须在OH_AVMuxer_Start前调用。 155 156**系统能力:** SystemCapability.Multimedia.Media.Muxer 157 158**起始版本:** 10 159 160**参数:** 161 162| 名称 | 描述 | 163| -------- | -------- | 164| muxer | 指向OH_AVMuxer实例的指针。 | 165| rotation | 角度,必须为0、90、180 或 270。 | 166 167**返回:** 168 169执行成功返回AV_ERR_OK,否则返回具体错误码,参考[OH_AVErrCode](_core.md#oh_averrcode)。 170 171AV_ERR_INVALID_VAL,muxer为空指针,或rotation无效。AV_ERR_OPERATE_NOT_PERMIT,不允许调用该接口,请检查接口调用顺序。 172 173 174### OH_AVMuxer_SetFormat() 175 176``` 177OH_AVErrCode OH_AVMuxer_SetFormat(OH_AVMuxer *muxer, OH_AVFormat *format) 178``` 179**描述** 180设置format数据到封装器。 181 182API 14起,支持设置创建时间OH_MD_KEY_CREATION_TIME。若创建时间未写入成功,请排查OH_MD_KEY_CREATION_TIME字符串设置是否符合ISO 8601标准的时间格式且为UTC时间。 183 184API 20起,支持: 185- 设置文件的描述性文本信息OH_MD_KEY_COMMENT。若文件描述信息未写入成功,请排查OH_MD_KEY_COMMENT是否为字符串类型或字符长度大于等于1且小于等于256。 186- 设置MP4 moov的位置OH_MD_KEY_ENABLE_MOOV_FRONT。OH_MD_KEY_ENABLE_MOOV_FRONT为0时moov后置,为1时前置,默认后置。 187 188**系统能力:** SystemCapability.Multimedia.Media.Muxer 189 190**起始版本:** 14 191 192**参数:** 193 194| 名称 | 描述 | 195| -------- | -------- | 196| muxer | 指向OH_AVMuxer实例的指针。 | 197| format | 指向OH_AVFormat实例的指针。文件级元数据集。 | 198 199**返回:** 200 201AV_ERR_OK,设置format参数正确。 202 203AV_ERR_INVALID_VAL,muxer为空指针,或format无效。AV_ERR_OPERATE_NOT_PERMIT,不允许调用该接口,请检查接口调用顺序。 204 205 206### OH_AVMuxer_Start() 207 208``` 209OH_AVErrCode OH_AVMuxer_Start (OH_AVMuxer *muxer) 210``` 211**描述** 212开始封装。该接口必须在OH_AVMuxer_AddTrack后,OH_AVMuxer_WriteSample前调用。 213 214**系统能力:** SystemCapability.Multimedia.Media.Muxer 215 216**起始版本:** 10 217 218**参数:** 219 220| 名称 | 描述 | 221| -------- | -------- | 222| muxer | 指向OH_AVMuxer实例的指针。 | 223 224**返回:** 225 226执行成功返回AV_ERR_OK,否则返回具体错误码,参考[OH_AVErrCode](_core.md#oh_averrcode)。 227 228AV_ERR_INVALID_VAL,muxer为空指针。AV_ERR_OPERATE_NOT_PERMIT,不允许调用该接口,请检查接口调用顺序。AV_ERR_UNKNOWN,未知错误。 229 230 231### OH_AVMuxer_Stop() 232 233``` 234OH_AVErrCode OH_AVMuxer_Stop (OH_AVMuxer *muxer) 235``` 236**描述** 237停止封装。封装器停止后不支持重新开始。 238 239**系统能力:** SystemCapability.Multimedia.Media.Muxer 240 241**起始版本:** 10 242 243**参数:** 244 245| 名称 | 描述 | 246| -------- | -------- | 247| muxer | 指向OH_AVMuxer实例的指针。 | 248 249**返回:** 250 251执行成功返回AV_ERR_OK,否则返回具体错误码,参考[OH_AVErrCode](_core.md#oh_averrcode)。 252 253AV_ERR_INVALID_VAL,muxer为空指针。AV_ERR_OPERATE_NOT_PERMIT,不允许调用该接口,请检查接口调用顺序。 254 255 256### OH_AVMuxer_WriteSample() 257 258``` 259OH_AVErrCode OH_AVMuxer_WriteSample (OH_AVMuxer *muxer, uint32_t trackIndex, OH_AVMemory *sample, OH_AVCodecBufferAttr info) 260``` 261**描述** 262将sample写入封装器。该接口必须在OH_AVMuxer_Start后,OH_AVMuxer_Stop前调用。调用者需要按info中的时间顺序将sample写入正确的音视频轨。 263 264**系统能力:** SystemCapability.Multimedia.Media.Muxer 265 266**起始版本:** 10 267 268**废弃版本:** 11 269 270**替代接口:**[OH_AVMuxer_WriteSampleBuffer](#oh_avmuxer_writesamplebuffer) 271 272**参数:** 273 274| 名称 | 描述 | 275| -------- | -------- | 276| muxer | 指向OH_AVMuxer实例的指针。 | 277| trackIndex | 数据对应的音视频轨的索引。 | 278| sample | 编码或解封装得到的数据。 | 279| info | sample对应的描述信息,参考[OH_AVCodecBufferAttr](_o_h___a_v_codec_buffer_attr.md)。 | 280 281**返回:** 282 283执行成功返回AV_ERR_OK,否则返回具体错误码,参考[OH_AVErrCode](_core.md#oh_averrcode)。 284 285AV_ERR_INVALID_VAL,muxer为空指针,或trackIndex无效,或sample无效,或info无效。AV_ERR_OPERATE_NOT_PERMIT,不允许调用该接口,请检查接口调用顺序。AV_ERR_NO_MEMORY,申请内存失败。AV_ERR_UNKNOWN,未知错误。 286 287 288### OH_AVMuxer_WriteSampleBuffer() 289 290``` 291OH_AVErrCode OH_AVMuxer_WriteSampleBuffer (OH_AVMuxer *muxer, uint32_t trackIndex, const OH_AVBuffer *sample) 292``` 293**描述** 294将sample写入封装器。该接口必须在OH_AVMuxer_Start后,OH_AVMuxer_Stop前调用。 调用者需要按sample中的时间顺序将sample写入正确的音视频轨。 295 296**系统能力:** SystemCapability.Multimedia.Media.Muxer 297 298**起始版本:** 11 299 300**参数:** 301 302| 名称 | 描述 | 303| -------- | -------- | 304| muxer | 指向OH_AVMuxer实例的指针。 | 305| trackIndex | 数据对应的音视频轨的索引。 | 306| sample | 编码或解封装得到的数据及属性。 | 307 308**返回:** 309 310执行成功返回AV_ERR_OK,否则返回具体错误码,参考[OH_AVErrCode](_core.md#oh_averrcode)。 311 312AV_ERR_INVALID_VAL,muxer为空指针,或trackIndex无效,或sample无效。 AV_ERR_OPERATE_NOT_PERMIT,不允许调用该接口,请检查接口调用顺序。 AV_ERR_NO_MEMORY,申请内存失败。AV_ERR_UNKNOWN,未知错误。 313