# native_avdemuxer.h

#### 概述

声明用于音视频媒体数据解析的接口。

**引用文件：** <multimedia/player\_framework/native\_avdemuxer.h>

**库：** libnative\_media\_avdemuxer.so

**系统能力：** SystemCapability.Multimedia.Media.Spliter

**起始版本：** 10

**相关模块：** AVDemuxer

**相关示例：**AVCodec

#### 汇总

#### 结构体

| 名称 | typedef关键字 | 描述 |
| --- | --- | --- |
| OH_AVDemuxer | OH_AVDemuxer | 为OH_AVDemuxer接口定义native层对象。 |
| DRM_MediaKeySystemInfo | DRM_MediaKeySystemInfo | 为DRM_MediaKeySystemInfo接口定义native层对象。 |

#### 函数

| 名称 | typedef关键字 | 描述 |
| --- | --- | --- |
| typedef void (*DRM_MediaKeySystemInfoCallback)(DRM_MediaKeySystemInfo* mediaKeySystemInfo) | DRM_MediaKeySystemInfoCallback | DRM_MediaKeySystemInfo回调函数指针类型，不返回解封装器实例，适用于单个解封装器实例场景。 需要使用OH_AVDemuxer_SetMediaKeySystemInfoCallback接口将其设置为回调。 |
| typedef void (*Demuxer_MediaKeySystemInfoCallback)(OH_AVDemuxer *demuxer, DRM_MediaKeySystemInfo *mediaKeySystemInfo) | Demuxer_MediaKeySystemInfoCallback | DRM_MediaKeySystemInfo回调函数指针类型，返回解封装器实例，适用于多个解封装器实例场景。 需要使用OH_AVDemuxer_SetDemuxerMediaKeySystemInfoCallback接口将其设置为回调，推荐使用。 |
| OH_AVDemuxer *OH_AVDemuxer_CreateWithSource(OH_AVSource *source) | - | 通过source实例创建OH_AVDemuxer实例。 source的创建、销毁及使用，详情请参考OH_AVSource。 |
| OH_AVErrCode OH_AVDemuxer_Destroy(OH_AVDemuxer *demuxer) | - | 销毁OH_AVDemuxer实例并清理内部资源。同一实例只能被销毁一次。 注意，销毁的实例在被重新创建之前不能再被使用。建议实例销毁成功后将指针置为NULL。 |
| OH_AVErrCode OH_AVDemuxer_SelectTrackByID(OH_AVDemuxer *demuxer, uint32_t trackIndex) | - | 指定读取sample的轨道，解封装器将会从该轨道中读取数据，未指定的轨道不会读取。 注意，通过多次调用接口并传入不同轨道的索引来选中多个轨道。 调用OH_AVDemuxer_ReadSample时只会读取被选中的轨道中数据，同一轨道被选择多次时，接口会返回AV_ERR_OK，并且只会生效一次。 |
| OH_AVErrCode OH_AVDemuxer_UnselectTrackByID(OH_AVDemuxer *demuxer, uint32_t trackIndex) | - | 移除读取sample的轨道，未选中的轨道的数据不会被解封装器读取。 注意，通过多次调用接口并传入不同轨道的索引来取消对多个轨道的选择。 同一轨道被多次取消选择时，接口会返回AV_ERR_OK，并且只会生效一次。 |
| OH_AVErrCode OH_AVDemuxer_ReadSample(OH_AVDemuxer *demuxer, uint32_t trackIndex, OH_AVMemory *sample, OH_AVCodecBufferAttr *info) | - | 获取指定轨道的sample及相关信息。 注意，读取轨道sample前，轨道必须被选中。调用接口后解封装器将自动前进到下一帧。 |
| OH_AVErrCode OH_AVDemuxer_ReadSampleBuffer(OH_AVDemuxer *demuxer, uint32_t trackIndex, OH_AVBuffer *sample) | - | 获取指定轨道的sample及相关信息。 注意，读取轨道sample前，轨道必须被选中。调用接口后解封装器将自动前进到下一帧。 |
| OH_AVErrCode OH_AVDemuxer_SeekToTime(OH_AVDemuxer *demuxer, int64_t millisecond, OH_AVSeekMode mode) | - | 根据设定的跳转模式，将所有选中的轨道到指定时间附近。 |
| OH_AVErrCode OH_AVDemuxer_SetMediaKeySystemInfoCallback(OH_AVDemuxer *demuxer, DRM_MediaKeySystemInfoCallback callback) | - | 设置DRM信息回调函数。 |
| OH_AVErrCode OH_AVDemuxer_SetDemuxerMediaKeySystemInfoCallback(OH_AVDemuxer *demuxer, Demuxer_MediaKeySystemInfoCallback callback) | - | 设置DRM信息回调函数。 |
| OH_AVErrCode OH_AVDemuxer_GetMediaKeySystemInfo(OH_AVDemuxer *demuxer, DRM_MediaKeySystemInfo *mediaKeySystemInfo) | - | 获取DRM信息。在Demuxer_MediaKeySystemInfoCallback或DRM_MediaKeySystemInfoCallback接口成功回调以后，调用此接口才能获取到DRM信息。 |

#### 函数说明

#### DRM\_MediaKeySystemInfoCallback()

```
typedef void (*DRM_MediaKeySystemInfoCallback)(DRM_MediaKeySystemInfo* mediaKeySystemInfo)
```

**描述**

DRM\_MediaKeySystemInfo回调函数指针类型，不返回解封装器实例，适用于单个解封装器实例场景。

需要使用OH\_AVDemuxer\_SetMediaKeySystemInfoCallback接口将其设置为回调。

**系统能力：** SystemCapability.Multimedia.Media.Spliter

**起始版本：** 11

**废弃版本：** 14

**替代接口：** Demuxer\_MediaKeySystemInfoCallback

#### Demuxer\_MediaKeySystemInfoCallback()

```
typedef void (*Demuxer_MediaKeySystemInfoCallback)(OH_AVDemuxer *demuxer, DRM_MediaKeySystemInfo *mediaKeySystemInfo)
```

**描述**

DRM\_MediaKeySystemInfo回调函数指针类型，返回解封装器实例，适用于多个解封装器实例场景。

需要使用OH\_AVDemuxer\_SetDemuxerMediaKeySystemInfoCallback接口将其设置为回调，推荐使用。

**系统能力：** SystemCapability.Multimedia.Media.Spliter

**起始版本：** 12

#### OH\_AVDemuxer\_CreateWithSource()

```
OH_AVDemuxer *OH_AVDemuxer_CreateWithSource(OH_AVSource *source)
```

**描述**

通过source实例创建OH\_AVDemuxer实例。

source的创建、销毁及使用，详情请参考OH\_AVSource。

**系统能力：** SystemCapability.Multimedia.Media.Spliter

**起始版本：** 10

**参数：**

| 参数项 | 描述 |
| --- | --- |
| OH_AVSource *source | 指向OH_AVSource实例的指针。 |

**返回：**

| 类型 | 说明 |
| --- | --- |
| OH_AVDemuxer * | 返回一个指向OH_AVDemuxer实例的指针。 如果执行成功，则返回指向OH_AVDemuxer实例的指针，否则返回NULL。 可能的失败原因： 1. source无效，即空指针或非OH_AVSource实例。 2. 非OH_AVSource实例。 |

#### OH\_AVDemuxer\_Destroy()

```
OH_AVErrCode OH_AVDemuxer_Destroy(OH_AVDemuxer *demuxer)
```

**描述**

销毁OH\_AVDemuxer实例并清理内部资源。同一实例只能被销毁一次。

注意，销毁的实例在被重新创建之前不能再被使用。建议实例销毁成功后将指针置为NULL。

**系统能力：** SystemCapability.Multimedia.Media.Spliter

**起始版本：** 10

**参数：**

| 参数项 | 描述 |
| --- | --- |
| OH_AVDemuxer *demuxer | 指向OH_AVDemuxer实例的指针。 |

**返回：**

| 类型 | 说明 |
| --- | --- |
| OH_AVErrCode | AV_ERR_OK：执行成功。 AV_ERR_INVALID_VAL：当输入的demuxer指针为空或非解封装器实例。 |

#### OH\_AVDemuxer\_SelectTrackByID()

```
OH_AVErrCode OH_AVDemuxer_SelectTrackByID(OH_AVDemuxer *demuxer, uint32_t trackIndex)
```

**描述**

指定读取sample的轨道，解封装器将会从该轨道中读取数据，未指定的轨道不会读取。

注意，通过多次调用接口并传入不同轨道的索引来选中多个轨道。

调用OH\_AVDemuxer\_ReadSample时只会读取被选中的轨道中数据，同一轨道被选择多次时，接口会返回AV\_ERR\_OK，并且只会生效一次。

**系统能力：** SystemCapability.Multimedia.Media.Spliter

**起始版本：** 10

**参数：**

| 参数项 | 描述 |
| --- | --- |
| OH_AVDemuxer *demuxer | 指向OH_AVDemuxer实例的指针。 |
| uint32_t trackIndex | 需选择的轨道的索引。 |

**返回：**

| 类型 | 说明 |
| --- | --- |
| OH_AVErrCode | AV_ERR_OK：执行成功。 AV_ERR_INVALID_VAL： 1. 输入的demuxer指针为空或为非解封装器实例。 2. 轨道的索引超出范围。 3. 不支持读取轨道。 AV_ERR_OPERATE_NOT_PERMIT：demuxer没有正确的初始化。 |

#### OH\_AVDemuxer\_UnselectTrackByID()

```
OH_AVErrCode OH_AVDemuxer_UnselectTrackByID(OH_AVDemuxer *demuxer, uint32_t trackIndex)
```

**描述**

移除读取sample的轨道，未选中的轨道的数据不会被解封装器读取。

注意，通过多次调用接口并传入不同轨道的索引来取消对多个轨道的选择。

同一轨道被多次取消选择时，接口会返回AV\_ERR\_OK，并且只会生效一次。

**系统能力：** SystemCapability.Multimedia.Media.Spliter

**起始版本：** 10

**参数：**

| 参数项 | 描述 |
| --- | --- |
| OH_AVDemuxer *demuxer | 指向OH_AVDemuxer实例的指针。 |
| uint32_t trackIndex | 需取消选择的轨道的索引。 |

**返回：**

| 类型 | 说明 |
| --- | --- |
| OH_AVErrCode | AV_ERR_OK：执行成功。 AV_ERR_INVALID_VAL：输入的demuxer指针为空或为非解封装器实例。 AV_ERR_OPERATE_NOT_PERMIT：demuxer没有正确的初始化。 |

#### OH\_AVDemuxer\_ReadSample()

```
OH_AVErrCode OH_AVDemuxer_ReadSample(OH_AVDemuxer *demuxer, uint32_t trackIndex, OH_AVMemory *sample, OH_AVCodecBufferAttr *info)
```

**描述**

获取指定轨道的sample及相关信息。

注意，读取轨道sample前，轨道必须被选中。调用接口后解封装器将自动前进到下一帧。

**系统能力：** SystemCapability.Multimedia.Media.Spliter

**起始版本：** 10

**废弃版本：** 11

**替代接口：** OH\_AVDemuxer\_ReadSampleBuffer

**参数：**

| 参数项 | 描述 |
| --- | --- |
| OH_AVDemuxer *demuxer | 指向OH_AVDemuxer实例的指针。 |
| uint32_t trackIndex | 本次读取压缩帧的轨道的索引。 |
| OH_AVMemory *sample | 指向OH_AVMemory实例的指针，用于储存压缩帧数据。 |
| OH_AVCodecBufferAttr *info | 指向OH_AVCodecBufferAttr实例的指针，用于储存压缩帧的相关信息。 |

**返回：**

| 类型 | 说明 |
| --- | --- |
| OH_AVErrCode | AV_ERR_OK：执行成功。 AV_ERR_INVALID_VAL： 1. 输入的demuxer指针为空或为非解封装器实例。 2. 轨道的索引超出范围。 3. 不支持读取轨道。 4. 输入sample为空。 5. 输入info为空。 AV_ERR_OPERATE_NOT_PERMIT： 1. 轨道的索引没有被选中。 2. demuxer没有正确的初始化。 AV_ERR_NO_MEMORY：sample容量不足以存储所有帧数据。 AV_ERR_UNKNOWN：无法从文件中读取或解析帧。 |

#### OH\_AVDemuxer\_ReadSampleBuffer()

```
OH_AVErrCode OH_AVDemuxer_ReadSampleBuffer(OH_AVDemuxer *demuxer, uint32_t trackIndex, OH_AVBuffer *sample)
```

**描述**

获取指定轨道的sample及相关信息。

注意，读取轨道sample前，轨道必须被选中，可使用OH\_AVDemuxer\_SelectTrackByID。调用接口后解封装器将自动前进到下一帧。

**系统能力：** SystemCapability.Multimedia.Media.Spliter

**起始版本：** 11

**参数：**

| 参数项 | 描述 |
| --- | --- |
| OH_AVDemuxer *demuxer | 指向OH_AVDemuxer实例的指针。 |
| uint32_t trackIndex | 本次读取压缩帧的轨道的索引。 |
| OH_AVBuffer *sample | 指向OH_AVBuffer实例的指针，用于储存压缩帧数据以及相关信息。 |

**返回：**

| 类型 | 说明 |
| --- | --- |
| OH_AVErrCode | AV_ERR_OK：执行成功。 AV_ERR_INVALID_VAL： 1. 输入的demuxer指针为空或为非解封装器实例。 2. sample为空指针。 3. 轨道的索引超出范围。 4. 输入sample为空。 AV_ERR_OPERATE_NOT_PERMIT： 1. 轨道的索引没有被选中。 2. demuxer没有正确的初始化。 AV_ERR_NO_MEMORY：sample容量不足以存储所有帧数据。 AV_ERR_UNKNOWN：无法从文件中读取或解析帧。 |

#### OH\_AVDemuxer\_SeekToTime()

```
OH_AVErrCode OH_AVDemuxer_SeekToTime(OH_AVDemuxer *demuxer, int64_t millisecond, OH_AVSeekMode mode)
```

**描述**

根据设定的跳转模式，将所有选中的轨道到指定时间附近。

**系统能力：** SystemCapability.Multimedia.Media.Spliter

**起始版本：** 10

**参数：**

| 参数项 | 描述 |
| --- | --- |
| OH_AVDemuxer *demuxer | 指向OH_AVDemuxer实例的指针。 |
| int64_t millisecond | 期望跳转位置对应的时间，单位为ms，该时间戳是相对文件开始的位置。 |
| OH_AVSeekMode mode | 跳转的模式。 |

**返回：**

| 类型 | 说明 |
| --- | --- |
| OH_AVErrCode | AV_ERR_OK：执行成功。 AV_ERR_INVALID_VAL： 1. 输入的demuxer指针为空或为非解封装器实例。 2. 毫秒值超出范围。 AV_ERR_OPERATE_NOT_PERMIT： 1. 轨道的索引没有被选中。 2. demuxer没有正确的初始化。 3. 资源无法seek。 AV_ERR_UNKNOWN： 1. seek失败。 2. OH_AVSeekMode选择SEEK_MODE_NEXT_SYNC，并且时间点后无I帧，可能会跳转失败。 |

#### OH\_AVDemuxer\_SetMediaKeySystemInfoCallback()

```
OH_AVErrCode OH_AVDemuxer_SetMediaKeySystemInfoCallback(OH_AVDemuxer *demuxer, DRM_MediaKeySystemInfoCallback callback)
```

**描述**

设置DRM信息回调函数。

**系统能力：** SystemCapability.Multimedia.Media.Spliter

**起始版本：** 11

**废弃版本：** 14

**替代接口：** OH\_AVDemuxer\_SetDemuxerMediaKeySystemInfoCallback

**参数：**

| 参数项 | 描述 |
| --- | --- |
| OH_AVDemuxer *demuxer | 指向OH_AVDemuxer实例的指针。 |
| DRM_MediaKeySystemInfoCallback callback | 回调函数。 |

**返回：**

| 类型 | 说明 |
| --- | --- |
| OH_AVErrCode | AV_ERR_OK：操作成功。 AV_ERR_OPERATE_NOT_PERMIT：demuxer没有正确的初始化。 AV_ERR_INVALID_VAL：输入的demuxer指针为空或为非解封装器实例。 |

#### OH\_AVDemuxer\_SetDemuxerMediaKeySystemInfoCallback()

```
OH_AVErrCode OH_AVDemuxer_SetDemuxerMediaKeySystemInfoCallback(OH_AVDemuxer *demuxer, Demuxer_MediaKeySystemInfoCallback callback)
```

**描述**

设置DRM信息回调函数。

**系统能力：** SystemCapability.Multimedia.Media.Spliter

**起始版本：** 12

**参数：**

| 参数项 | 描述 |
| --- | --- |
| OH_AVDemuxer *demuxer | 指向OH_AVDemuxer实例的指针。 |
| Demuxer_MediaKeySystemInfoCallback callback | 回调函数。 |

**返回：**

| 类型 | 说明 |
| --- | --- |
| OH_AVErrCode | AV_ERR_OK：操作成功。 AV_ERR_OPERATE_NOT_PERMIT：demuxer没有正确的初始化。 AV_ERR_INVALID_VAL：输入的demuxer指针为空或为非解封装器实例。 |

#### OH\_AVDemuxer\_GetMediaKeySystemInfo()

```
OH_AVErrCode OH_AVDemuxer_GetMediaKeySystemInfo(OH_AVDemuxer *demuxer, DRM_MediaKeySystemInfo *mediaKeySystemInfo)
```

**描述**

获取DRM信息。在Demuxer\_MediaKeySystemInfoCallback或DRM\_MediaKeySystemInfoCallback接口成功回调以后，调用此接口才能获取到DRM信息。

**系统能力：** SystemCapability.Multimedia.Media.Spliter

**起始版本：** 11

**参数：**

| 参数项 | 描述 |
| --- | --- |
| OH_AVDemuxer *demuxer | 指向OH_AVDemuxer实例的指针。 |
| DRM_MediaKeySystemInfo *mediaKeySystemInfo | 指向DRM信息的指针。 |

**返回：**

| 类型 | 说明 |
| --- | --- |
| OH_AVErrCode | AV_ERR_OK：操作成功。 AV_ERR_OPERATE_NOT_PERMIT：解封装引擎未初始化或初始化失败。 AV_ERR_INVALID_VAL： 1. 输入的demuxer指针为空或为非解封装器实例。 2. mediaKeySystemInfo为nullptr。 |