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