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