1# AVDemuxer 2 3 4## 概述 5 6AVDemuxer模块提供从媒体文件码流中提取[sample](../../media/avcodec/audio-video-demuxer.md)的接口。 7 8对应的开发指南及样例可参考[媒体数据解析](../../media/avcodec/audio-video-demuxer.md)。 9 10**系统能力:** SystemCapability.Multimedia.Media.Spliter 11 12**起始版本:** 10 13 14 15## 汇总 16 17 18### 文件 19 20| 名称 | 描述 | 21| -------- | -------- | 22| [native_avdemuxer.h](native__avdemuxer_8h.md) | 声明用于音视频媒体数据解析的接口。 | 23 24### 类型定义 25 26| 名称 | 描述 | 27| -------- | -------- | 28| typedef void(* [DRM_MediaKeySystemInfoCallback](#drm_mediakeysysteminfocallback)) (DRM_MediaKeySystemInfo *mediaKeySystemInfo) | [DRM_MediaKeySystemInfo](../apis-drm-kit/_d_r_m___media_key_system_info.md)回调函数指针类型,不返回解封装器实例,适用于单个解封装器实例场景。需要使用[OH_AVDemuxer_SetMediaKeySystemInfoCallback](#oh_avdemuxer_setmediakeysysteminfocallback)接口将其设置为回调。(API14废弃) | 29| typedef void(* [Demuxer_MediaKeySystemInfoCallback](#demuxer_mediakeysysteminfocallback)) (OH_AVDemuxer *demuxer, DRM_MediaKeySystemInfo *mediaKeySystemInfo)| [DRM_MediaKeySystemInfo](../apis-drm-kit/_d_r_m___media_key_system_info.md)回调函数指针类型,返回解封装器实例,适用于多个解封装器实例场景。需要使用[OH_AVDemuxer_SetDemuxerMediaKeySystemInfoCallback](#oh_avdemuxer_setdemuxermediakeysysteminfocallback)接口将其设置为回调,推荐使用。 | 30 31 32### 函数 33 34| 名称 | 描述 | 35| -------- | -------- | 36| OH_AVDemuxer \* [OH_AVDemuxer_CreateWithSource](#oh_avdemuxer_createwithsource) ([OH_AVSource](_a_v_source.md#oh_avsource) \*source) | 通过source实例创建OH_AVDemuxer实例。 | 37| [OH_AVErrCode](_core.md#oh_averrcode) [OH_AVDemuxer_Destroy](#oh_avdemuxer_destroy) (OH_AVDemuxer \*demuxer) | 销毁OH_AVDemuxer实例并清理内部资源。 | 38| [OH_AVErrCode](_core.md#oh_averrcode) [OH_AVDemuxer_SelectTrackByID](#oh_avdemuxer_selecttrackbyid) (OH_AVDemuxer \*demuxer, uint32_t trackIndex) | 指定读取sample的轨道,解封装器将会从该轨道中读取数据,未指定的轨道不会读取。 | 39| [OH_AVErrCode](_core.md#oh_averrcode) [OH_AVDemuxer_UnselectTrackByID](#oh_avdemuxer_unselecttrackbyid) (OH_AVDemuxer \*demuxer, uint32_t trackIndex) | 移除读取sample的轨道,未选中的轨道的数据不会被解封装器读取。 | 40| [OH_AVErrCode](_core.md#oh_averrcode) [OH_AVDemuxer_ReadSample](#oh_avdemuxer_readsample) (OH_AVDemuxer \*demuxer, uint32_t trackIndex, [OH_AVMemory](_core.md#oh_avmemory) \*sample, [OH_AVCodecBufferAttr](_o_h___a_v_codec_buffer_attr.md) \*info) | 获取指定轨道的sample及相关信息(API11废弃)。 | 41| [OH_AVErrCode](_core.md#oh_averrcode) [OH_AVDemuxer_ReadSampleBuffer](#oh_avdemuxer_readsamplebuffer) (OH_AVDemuxer \*demuxer, uint32_t trackIndex, [OH_AVBuffer](_core.md#oh_avbuffer) \*sample) | 获取指定轨道的sample。 | 42| [OH_AVErrCode](_core.md#oh_averrcode) [OH_AVDemuxer_SeekToTime](#oh_avdemuxer_seektotime) (OH_AVDemuxer \*demuxer, int64_t millisecond, [OH_AVSeekMode](_codec_base.md#oh_avseekmode) mode) | 根据设定的[跳转模式](_codec_base.md#oh_avseekmode-1),将所有选中的轨道到指定时间附近。 | 43| [OH_AVErrCode](_core.md#oh_averrcode) [OH_AVDemuxer_SetMediaKeySystemInfoCallback](#oh_avdemuxer_setmediakeysysteminfocallback) (OH_AVDemuxer \*demuxer, DRM_MediaKeySystemInfoCallback callback) | 设置异步DRM信息回调函数。(API14废弃) | 44| [OH_AVErrCode](_core.md#oh_averrcode) [OH_AVDemuxer_SetDemuxerMediaKeySystemInfoCallback](#oh_avdemuxer_setdemuxermediakeysysteminfocallback) (OH_AVDemuxer \*demuxer, Demuxer_MediaKeySystemInfoCallback callback) | 设置异步DRM信息回调函数。 | 45| [OH_AVErrCode](_core.md#oh_averrcode) [OH_AVDemuxer_GetMediaKeySystemInfo](#oh_avdemuxer_getmediakeysysteminfo) (OH_AVDemuxer \*demuxer, DRM_MediaKeySystemInfo \*mediaKeySystemInfo) | 获取DRM信息。 | 46 47 48## 类型定义说明 49 50### Demuxer_MediaKeySystemInfoCallback 51 52``` 53typedef void(* Demuxer_MediaKeySystemInfoCallback) (OH_AVDemuxer *demuxer, DRM_MediaKeySystemInfo *mediaKeySystemInfo) 54``` 55 56**描述** 57媒体密钥系统信息回调函数指针类型。 58 59**系统能力:** SystemCapability.Multimedia.Media.Spliter 60 61**起始版本:** 12 62 63 64### DRM_MediaKeySystemInfoCallback 65 66``` 67typedef void(* DRM_MediaKeySystemInfoCallback) (DRM_MediaKeySystemInfo *mediaKeySystemInfo) 68``` 69 70**描述** 71媒体密钥系统信息回调函数指针类型。 72 73**系统能力:** SystemCapability.Multimedia.Media.Spliter 74 75**起始版本:** 11 76 77**废弃版本:** 14 78 79**替代接口:**[Demuxer_MediaKeySystemInfoCallback](#demuxer_mediakeysysteminfocallback) 80 81 82## 函数说明 83 84 85### OH_AVDemuxer_CreateWithSource() 86 87``` 88OH_AVDemuxer* OH_AVDemuxer_CreateWithSource (OH_AVSource *source) 89``` 90**描述** 91通过source实例创建OH_AVDemuxer实例。 92 93source的创建、销毁及使用,详情请参考[OH_AVSource](_a_v_source.md)。 94 95**系统能力:** SystemCapability.Multimedia.Media.Spliter 96 97**起始版本:** 10 98 99**参数:** 100 101| 名称 | 描述 | 102| -------- | -------- | 103| source | 指向OH_AVSource实例的指针。 | 104 105**返回:** 106 107返回一个指向OH_AVDemuxer实例的指针。 108 109如果执行成功,则返回指向OH_AVDemuxer实例的指针,否则返回NULL。 110 111可能的失败原因: 1121. source无效,即空指针; 1132. 非OH_AVSource实例。 114 115 116### OH_AVDemuxer_Destroy() 117 118``` 119OH_AVErrCode OH_AVDemuxer_Destroy (OH_AVDemuxer *demuxer) 120``` 121**描述** 122销毁OH_AVDemuxer实例并清理内部资源。同一实例只能被销毁一次。注意,销毁的实例在被重新创建之前不能再被使用。建议实例销毁成功后将指针置为NULL。 123 124**系统能力:** SystemCapability.Multimedia.Media.Spliter 125 126**起始版本:** 10 127 128**参数:** 129 130| 名称 | 描述 | 131| -------- | -------- | 132| demuxer | 指向OH_AVDemuxer实例的指针。 | 133 134**返回:** 135 136返回函数结果: 137 138AV_ERR_OK:执行成功。 139 140AV_ERR_INVALID_VAL:输入的demuxer指针为空或为非解封装器实例。 141 142 143### OH_AVDemuxer_GetMediaKeySystemInfo() 144 145``` 146OH_AVErrCode OH_AVDemuxer_GetMediaKeySystemInfo (OH_AVDemuxer *demuxer, DRM_MediaKeySystemInfo *mediaKeySystemInfo) 147``` 148**描述** 149获取DRM信息。在[Demuxer_MediaKeySystemInfoCallback](#demuxer_mediakeysysteminfocallback)或[DRM_MediaKeySystemInfoCallback](#drm_mediakeysysteminfocallback)成功回调以后,调用此接口才能获取到DRM信息。 150 151**系统能力:** SystemCapability.Multimedia.Media.Spliter 152 153**起始版本:** 11 154 155**参数:** 156 157| 名称 | 描述 | 158| -------- | -------- | 159| demuxer | 指向OH_AVDemuxer实例的指针。 | 160| mediaKeySystemInfo | 指向DRM信息的指针,请参阅[DRM_MediaKeySystemInfo](../apis-drm-kit/_d_r_m___media_key_system_info.md)。 | 161 162**返回:** 163 164返回函数结果: 165 166AV_ERR_OK:执行成功。 167 168AV_ERR_INVALID_VAL: 169 170 1. 输入的demuxer指针为空或为非解封装器实例; 171 2. mediaKeySystemInfo为nullptr。 172 173 174### OH_AVDemuxer_ReadSample() 175 176``` 177OH_AVErrCode OH_AVDemuxer_ReadSample (OH_AVDemuxer *demuxer, uint32_t trackIndex, OH_AVMemory *sample, OH_AVCodecBufferAttr *info) 178``` 179**描述** 180获取指定轨道的sample及相关信息。 181 182注意,读取轨道sample前,轨道必须被选中。调用接口后解封装器将自动前进到下一帧。 183 184**系统能力:** SystemCapability.Multimedia.Media.Spliter 185 186**起始版本:** 10 187 188**废弃版本:** 11 189 190**替代接口:**[OH_AVDemuxer_ReadSampleBuffer](#oh_avdemuxer_readsamplebuffer) 191 192**参数:** 193 194| 名称 | 描述 | 195| -------- | -------- | 196| demuxer | 指向OH_AVDemuxer实例的指针。 | 197| trackIndex | 本次读取压缩帧的轨道的索引。 | 198| sample | 指向OH_AVMemory实例的指针,用于储存压缩帧数据。 | 199| info | 指向OH_AVCodecBufferAttr实例的指针,用于储存压缩帧的相关信息。 | 200 201**返回:** 202 203返回函数结果: 204 205AV_ERR_OK:执行成功。 206 207AV_ERR_INVALID_VAL: 208 209 1. 输入的demuxer指针为空或为非解封装器实例; 210 2. 轨道的索引超出范围; 211 3. 不支持读取轨道; 212 4. 输入sample为空; 213 5. 输入info为空。 214 215AV_ERR_OPERATE_NOT_PERMIT: 216 217 1. 轨道的索引没有被选中; 218 2. demuxer没有正确的初始化。 219 220AV_ERR_NO_MEMORY:sample容量不足以存储所有帧数据。 221 222AV_ERR_UNKNOWN:无法从文件中读取或解析帧。 223 224 225### OH_AVDemuxer_ReadSampleBuffer() 226 227``` 228OH_AVErrCode OH_AVDemuxer_ReadSampleBuffer (OH_AVDemuxer *demuxer, uint32_t trackIndex, OH_AVBuffer *sample) 229``` 230**描述** 231获取指定轨道的sample及相关信息。 232 233注意,读取轨道sample前,轨道必须被选中,可使用[OH_AVDemuxer_SelectTrackByID](#oh_avdemuxer_selecttrackbyid)。调用接口后解封装器将自动前进到下一帧。 234 235**系统能力:** SystemCapability.Multimedia.Media.Spliter 236 237**起始版本:** 11 238 239**参数:** 240 241| 名称 | 描述 | 242| -------- | -------- | 243| demuxer | 指向OH_AVDemuxer实例的指针。 | 244| trackIndex | 本次读取压缩帧的轨道的索引。 | 245| sample | 指向OH_AVBuffer实例的指针,用于储存压缩帧数据以及相关信息。 | 246 247**返回:** 248 249返回函数结果: 250 251AV_ERR_OK:执行成功。 252 253AV_ERR_INVALID_VAL: 254 255 1. 输入的demuxer指针为空或为非解封装器实例; 256 2. sample为空指针; 257 3. 轨道的索引超出范围; 258 4. 输入sample为空。 259 260AV_ERR_OPERATE_NOT_PERMIT: 261 262 1. 轨道的索引没有被选中; 263 2. demuxer没有正确的初始化。 264 265AV_ERR_NO_MEMORY:sample容量不足以存储所有帧数据。 266 267AV_ERR_UNKNOWN:无法从文件中读取或解析帧。 268 269 270### OH_AVDemuxer_SeekToTime() 271 272``` 273OH_AVErrCode OH_AVDemuxer_SeekToTime (OH_AVDemuxer *demuxer, int64_t millisecond, OH_AVSeekMode mode) 274``` 275**描述** 276根据设定的[跳转模式](_codec_base.md#oh_avseekmode-1),将所有选中的轨道到指定时间附近。 277 278**系统能力:** SystemCapability.Multimedia.Media.Spliter 279 280**起始版本:** 10 281 282**参数:** 283 284| 名称 | 描述 | 285| -------- | -------- | 286| demuxer | 指向OH_AVDemuxer实例的指针。 | 287| millisecond | 期望跳转位置对应的时间,单位为毫秒,该时间戳是相对文件开始的位置。 | 288| mode | 跳转的模式,参考[OH_AVSeekMode](_codec_base.md#oh_avseekmode)。 | 289 290**返回:** 291 292返回函数结果: 293 294AV_ERR_OK:执行成功。 295 296AV_ERR_INVALID_VAL: 297 298 1. 输入的demuxer指针为空或为非解封装器实例; 299 2. 毫秒值超出范围。 300 301AV_ERR_OPERATE_NOT_PERMIT: 302 303 1. 轨道的索引没有被选中; 304 2. demuxer没有正确的初始化; 305 3. 资源无法seek。 306 307AV_ERR_UNKNOWN: 308 309 1. seek失败; 310 2. OH_AVSeekMode选择SEEK_MODE_NEXT_SYNC,并且时间点后无I帧,可能会跳转失败。 311 312 313### OH_AVDemuxer_SelectTrackByID() 314 315``` 316OH_AVErrCode OH_AVDemuxer_SelectTrackByID (OH_AVDemuxer *demuxer, uint32_t trackIndex) 317``` 318**描述** 319指定读取sample的轨道,解封装器将会从该轨道中读取数据,未指定的轨道不会读取。注意,通过多次调用接口并传入不同轨道的索引来选中多个轨道。 调用OH_AVDemuxer_ReadSample时只会读取被选中的轨道中数据,同一轨道被选择多次时,接口会返回AV_ERR_OK,并且只会生效一次。 320 321**系统能力:** SystemCapability.Multimedia.Media.Spliter 322 323**起始版本:** 10 324 325**参数:** 326 327| 名称 | 描述 | 328| -------- | -------- | 329| demuxer | 指向OH_AVDemuxer实例的指针。 | 330| trackIndex | 需选择的轨道的索引。 | 331 332**返回:** 333 334返回函数结果: 335 336AV_ERR_OK:执行成功。 337 338AV_ERR_OPERATE_NOT_PERMIT:demuxer没有正确的初始化。 339 340AV_ERR_INVALID_VAL: 341 342 1. 输入的demuxer指针为空或为非解封装器实例; 343 2. 轨道的索引超出范围; 344 3. 不支持读取轨道。 345 346 347### OH_AVDemuxer_SetDemuxerMediaKeySystemInfoCallback() 348 349``` 350OH_AVErrCode OH_AVDemuxer_SetDemuxerMediaKeySystemInfoCallback (OH_AVDemuxer *demuxer, Demuxer_MediaKeySystemInfoCallback callback) 351``` 352**描述** 353设置DRM信息回调函数。 354 355**系统能力:** SystemCapability.Multimedia.Media.Spliter 356 357**起始版本:** 12 358 359**参数:** 360 361| 名称 | 描述 | 362| -------- | -------- | 363| demuxer | 指向OH_AVDemuxer实例的指针。 | 364| callback | 回调函数,详见[Demuxer_MediaKeySystemInfoCallback](#demuxer_mediakeysysteminfocallback)。 | 365 366**返回:** 367 368返回函数结果: 369 370AV_ERR_OK:执行成功。 371 372AV_ERR_OPERATE_NOT_PERMIT:demuxer没有正确的初始化。 373 374AV_ERR_INVALID_VAL:输入的demuxer指针为空或为非解封装器实例。 375 376 377### OH_AVDemuxer_SetMediaKeySystemInfoCallback() 378 379``` 380OH_AVErrCode OH_AVDemuxer_SetMediaKeySystemInfoCallback (OH_AVDemuxer *demuxer, DRM_MediaKeySystemInfoCallback callback) 381``` 382**描述** 383设置DRM信息回调函数。 384 385**系统能力:** SystemCapability.Multimedia.Media.Spliter 386 387**起始版本:** 11 388 389**废弃版本:** 14 390 391**替代接口:**[OH_AVDemuxer_SetDemuxerMediaKeySystemInfoCallback](#oh_avdemuxer_setdemuxermediakeysysteminfocallback) 392 393**参数:** 394 395| 名称 | 描述 | 396| -------- | -------- | 397| demuxer | 指向OH_AVDemuxer实例的指针。 | 398| callback | 回调函数,详见[DRM_MediaKeySystemInfoCallback](#drm_mediakeysysteminfocallback)。 | 399 400**返回:** 401 402返回函数结果: 403 404AV_ERR_OK:执行成功。 405 406AV_ERR_OPERATE_NOT_PERMIT:demuxer没有正确的初始化。 407 408AV_ERR_INVALID_VAL:输入的demuxer指针为空或为非解封装器实例。 409 410 411### OH_AVDemuxer_UnselectTrackByID() 412 413``` 414OH_AVErrCode OH_AVDemuxer_UnselectTrackByID (OH_AVDemuxer *demuxer, uint32_t trackIndex) 415``` 416**描述** 417移除读取sample的轨道,未选中的轨道的数据不会被解封装器读取。注意,通过多次调用接口并传入不同轨道的索引来取消对多个轨道的选择。 同一轨道被多次取消选择时,接口会返回AV_ERR_OK,并且只会生效一次。 418 419**系统能力:** SystemCapability.Multimedia.Media.Spliter 420 421**起始版本:** 10 422 423**参数:** 424 425| 名称 | 描述 | 426| -------- | -------- | 427| demuxer | 指向OH_AVDemuxer实例的指针。 | 428| trackIndex | 需取消选择的轨道的索引。 | 429 430**返回:** 431 432返回函数结果: 433 434AV_ERR_OK:执行成功。 435 436AV_ERR_OPERATE_NOT_PERMIT:demuxer没有正确的初始化。 437 438AV_ERR_INVALID_VAL:输入的demuxer指针为空或非解封装器实例。