diff --git a/zh-cn/application-dev/media/avcodec/Readme-CN.md b/zh-cn/application-dev/media/avcodec/Readme-CN.md index 902053a5e657511132fc97de97c7b953af3a6caa..85fff2ad0633dca68c06e361e0b8420cebe598c6 100644 --- a/zh-cn/application-dev/media/avcodec/Readme-CN.md +++ b/zh-cn/application-dev/media/avcodec/Readme-CN.md @@ -11,6 +11,7 @@ - [典型场景的视频编码配置](video-encoding-configuration-typical-scenarios.md) - [ROI视频编码](video-encoding-ROI.md) - [视频解码](video-decoding.md) + - [视频解码同步模式](synchronous-video-decoding.md) - [创建视频解码器和NativeWindow初始化并行](parallel-decoding-nativeWindow.md) - [视频可变帧率](video-variable-refreshrate.md) - 媒体数据封装与解析 diff --git a/zh-cn/application-dev/media/avcodec/figures/synchronous-video-decode.png b/zh-cn/application-dev/media/avcodec/figures/synchronous-video-decode.png new file mode 100644 index 0000000000000000000000000000000000000000..2db9a1e52621e6a92cc5a56f16f9c6fe698b93bf Binary files /dev/null and b/zh-cn/application-dev/media/avcodec/figures/synchronous-video-decode.png differ diff --git a/zh-cn/application-dev/media/avcodec/synchronous-video-decoding.md b/zh-cn/application-dev/media/avcodec/synchronous-video-decoding.md new file mode 100644 index 0000000000000000000000000000000000000000..fb0ed7293b1e1474c02ad37f4fb7831be3a5aec9 --- /dev/null +++ b/zh-cn/application-dev/media/avcodec/synchronous-video-decoding.md @@ -0,0 +1,634 @@ +# 视频解码同步模式 + +开发者可以调用本模块的Native API接口,完成同步模式的视频解码。 + +当前支持的解码能力请参考[AVCodec支持的格式](avcodec-support-formats.md#视频解码)。 + +视频解码的限制约束、支持的能力、状态机调用关系请参考[视频解码](video-decoding.md)。 + +## 适用场景 + +通常情况下,推荐使用异步模式。若需要主动请求buffer去送帧,则可以采用同步模式。 + + +## 开发指导 + +详细的API说明请参考[API文档](../../reference/apis-avcodec-kit/_video_decoder.md)。 + +- 虚线表示可选。 + +- 实线表示必选。 + +![Invoking relationship of video decode stream](figures/synchronous-video-decode.png) + +### 在 CMake 脚本中链接动态库 + +``` cmake +target_link_libraries(sample PUBLIC libnative_media_codecbase.so) +target_link_libraries(sample PUBLIC libnative_media_core.so) +target_link_libraries(sample PUBLIC libnative_media_vdec.so) +``` + +> **说明:** +> +> 上述'sample'字样仅为示例,此处由开发者根据实际工程目录自定义。 +> + +### 定义基础结构 + +本部分示例代码按照C++17标准编写,仅作参考。开发者可以参考此部分。 + +1. 添加头文件。 + + ```c++ + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + ``` + +2. 全局变量。 + + 仅做参考,可以根据实际情况将其封装到对象中。 + + ```c++ + // 视频帧宽度。 + int32_t width = 320; + // 视频帧高度。 + int32_t height = 240; + // 视频像素格式。 + OH_AVPixelFormat pixelFormat = AV_PIXEL_FORMAT_NV12; + // 解码器同步锁。 + std::shared_mutex codecMutex; + // 解码器实例指针。 + OH_AVCodec *videoDec = nullptr; + // 解码输出。 + bool outputDone = false; + // 解码输入。 + bool inputDone = false; + std::unique_ptr inFile_; + ``` + +### Surface模式 + +参考以下示例代码,开发者可以完成Surface模式下视频解码的全流程,实现同步模式的数据轮转。此处以H.264码流文件输入,解码送显输出为例。 + + +1. 创建解码器实例。 + + 通过名称创建解码器。示例中的变量说明如下: + + - videoDec:视频解码器实例的指针; + - capability:解码器能力查询实例的指针; + - OH_AVCODEC_MIMETYPE_VIDEO_AVC:AVC格式视频编解码器。 + + ```c++ + // 创建硬件解码器实例。 + OH_AVCapability *capability= OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, false, HARDWARE); + const char *name = OH_AVCapability_GetName(capability); + OH_AVCodec *videoDec = OH_VideoDecoder_CreateByName(name); + if (videoDec == nullptr) { + printf("create videoDec failed"); + return; + } + ``` +2. 调用OH_VideoDecoder_Configure()配置解码器。 + + 详细可配置选项的说明请参考[视频专有键值对](../../reference/apis-avcodec-kit/_codec_base.md#媒体数据键值对)。 + + 参数校验规则请参考[OH_VideoDecoder_Configure() 参考文档](../../reference/apis-avcodec-kit/_video_decoder.md#oh_videodecoder_configure)。 + + 参数取值范围可以通过能力查询接口获取,具体示例请参考[获取支持的编解码能力](obtain-supported-codecs.md)。 + + 目前支持的所有格式都必须配置以下选项:视频帧宽度、视频帧高度。 + + ```c++ + + OH_AVFormat *format = OH_AVFormat_Create(); + // 写入format。 + OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, width); // 必须配置。 + OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, height); // 必须配置。 + OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, pixelFormat); + OH_AVFormat_SetIntValue(format, OH_MD_KEY_ENABLE_SYNC_MODE, 1); // 同步模式配置 + // 配置解码器。 + int32_t ret = OH_VideoDecoder_Configure(videoDec, format); + if (ret != AV_ERR_OK) { + // 异常处理。 + } + OH_AVFormat_Destroy(format); + ``` + + > **注意:** + > + > 1. 使能视频解码同步模式,必须要配置OH_MD_KEY_ENABLE_SYNC_MODE为1。 + > 2. 在调用OH_VideoDecoder_Configure接口前没有调用OH_VideoDecoder_RegisterCallback接口,否则为异步模式。 + > + +3. 设置surface。 + + 示例中的变量说明如下: + - nativeWindow:获取方式请参考[视频解码](video-decoding.md)“步骤-6:设置surface” + + ```c++ + // 设置surface。 + // 配置送显窗口参数。 + int32_t ret = OH_VideoDecoder_SetSurface(videoDec, nativeWindow); + if (ret != AV_ERR_OK) { + // 异常处理。 + } + ``` + + +4. 调用OH_VideoDecoder_Prepare()解码器就绪。 + + 该接口将在解码器运行前进行一些数据的准备工作。 + + ```c++ + int32_t ret = OH_VideoDecoder_Prepare(videoDec); + if (ret != AV_ERR_OK) { + // 异常处理。 + } + ``` + +5. 调用OH_VideoDecoder_Start()启动解码器。 + + ```c++ + // 启动解码器,开始解码。 + int32_t ret = OH_VideoDecoder_Start(videoDec); + if (ret != AV_ERR_OK) { + // 异常处理。 + } + ``` + +6. 调用OH_VideoDecoder_PushInputBuffer()写入解码码流。 + + 送入输入队列进行解码,以下示例中: + - size、offset、pts、frameData:输入尺寸、偏移量、时间戳、帧数据等字段信息,获取方式可以参考[音视频解封装](./audio-video-demuxer.md)“步骤-9:开始解封装,循环获取sample”; + - flags:缓冲区标记的类别,请参考[OH_AVCodecBufferFlags](../../reference/apis-avcodec-kit/_core.md#oh_avcodecbufferflags)。 + + ```c++ + bool DecoderInput(OH_AVCodec *videoDec, int64_t timeoutUs) + { + uint32_t index; + std::shared_lock lock(codecMutex); + + OH_AVErrCode ret = OH_VideoDecoder_QueryInputBuffer(videoDec, &index, timeoutUs); + switch (ret) { + case AV_ERR_OK: { + OH_AVBuffer *buffer = OH_VideoDecoder_GetInputBuffer(videoDec, index); + if (buffer == nullptr) { + // 异常处理。 + return false; + } + // 写入码流数据。 + uint8_t *addr = OH_AVBuffer_GetAddr(buffer); + if (addr == nullptr) { + // 异常处理。 + return false; + } + // buffer数据填充。 + memcpy(addr, frameData, size); + + OH_AVCodecBufferAttr info; + // buffer属性配置。 + // 配置帧数据的输入尺寸、偏移量、时间戳等字段信息。 + info.size = size; + info.offset = offset; + info.pts = pts; + if (inFile_->eof()) { + info.flags = AVCODEC_BUFFER_FLAGS_EOS; + } else { + info.flags = flags; + } + int32_t ret = OH_AVBuffer_SetBufferAttr(buffer, &info); + if (ret != AV_ERR_OK) { + // 异常处理。 + return false; + } + ret = OH_VideoDecoder_PushInputBuffer(videoDec, index); + if (ret != AV_ERR_OK) { + // 异常处理。 + return false; + } + if (inFile_->eof()) { + inputDone = 1; + break; + } + break; + } + case AV_ERR_TRY_AGAIN_LATER: { + break; + } + default: { + // 异常处理。 + return false; + } + } + return true; + } + ``` + +7. 调用OH_VideoDecoder_RenderOutputBuffer()/OH_VideoDecoder_RenderOutputBufferAtTime()显示并释放解码帧, + 或调用OH_VideoDecoder_FreeOutputBuffer()释放解码帧。 + + ```c++ + bool DecoderOutput(OH_AVCodec *videoDec, int64_t timeoutUs) + { + uint32_t index; + std::shared_lock lock(codecMutex); + + OH_AVErrCode ret = OH_VideoDecoder_QueryOutputBuffer(videoDec, &index, timeoutUs); + switch (ret) { + case AV_ERR_OK: { + OH_AVBuffer *buffer = OH_VideoDecoder_GetOutputBuffer(videoDec, index); + if (buffer == nullptr) { + // 异常处理。 + return false; + } + + // 获取解码后信息。 + OH_AVCodecBufferAttr info; + int32_t ret = OH_AVBuffer_GetBufferAttr(buffer, &info); + if (ret != AV_ERR_OK) { + // 异常处理。 + return false; + } + if (info.flags & AVCODEC_BUFFER_FLAGS_EOS) { + outputDone = 1; + break; + } + + // 解码输出数据处理。 + // 值由开发者决定。 + bool isRender; + bool isNeedRenderAtTime; + if (isRender) { + // 显示并释放已完成处理的信息,index为对应buffer队列的下标。 + if (isNeedRenderAtTime){ + // 获取系统绝对时间,renderTimestamp由开发者结合业务指定显示时间。 + int64_t renderTimestamp = + std::chrono::duration_cast(std::chrono::high_resolution_clock::now().time_since_epoch()).count(); + ret = OH_VideoDecoder_RenderOutputBufferAtTime(videoDec, index, renderTimestamp); + } else { + ret = OH_VideoDecoder_RenderOutputBuffer(videoDec, index); + } + } else { + // 释放已完成处理的信息。 + ret = OH_VideoDecoder_FreeOutputBuffer(videoDec, index); + } + if (ret != AV_ERR_OK) { + // 异常处理。 + return false; + } + break; + } + case AV_ERR_TRY_AGAIN_LATER: { + break; + } + case AV_ERR_STREAM_CHANGED: { + OH_AVFormat *format = OH_VideoDecoder_GetOutputDescription(videoDec); + // 获取新宽高。 + OH_AVFormat_GetIntValue(format, OH_MD_KEY_VIDEO_PIC_WIDTH, &width); + OH_AVFormat_GetIntValue(format, OH_MD_KEY_VIDEO_PIC_HEIGHT, &height); + OH_AVFormat_Destroy(format); + break; + } + default: { + // 异常处理。 + return false; + } + } + return true; + } + ``` + +8. 解码输入输出。 + + ```c++ + bool result = true; + int64_t timeoutUs = 0; // 单位:微秒,负值:无限等待;0:立即退出;正值:指定时间timeout后退出。 + + while (!outputDone && result) { + if (!inputDone) { + result = DecoderInput(videoDec, timeoutUs); + } + if (!outputDone ) { + result = DecoderOutput(videoDec, timeoutUs); + } + } + ``` + +9. (可选)调用OH_VideoDecoder_Flush()刷新解码器。 + + 调用OH_VideoDecoder_Flush接口后,解码器仍处于运行态,但会清除解码器中缓存的输入和输出数据及参数集如H.264格式的PPS/SPS。 + 此时需要调用OH_VideoDecoder_Start接口重新开始解码。 + + ```c++ + // 通过codecMutex来避免调用Flush接口后,状态切换,解码线程还在跑会退出循环的问题。 + std::unique_lock lock(codecMutex); + // 刷新解码器videoDec。 + int32_t ret = OH_VideoDecoder_Flush(videoDec); + if (ret != AV_ERR_OK) { + // 异常处理。 + } + + // 重新开始解码。 + ret = OH_VideoDecoder_Start(videoDec); + if (ret != AV_ERR_OK) { + // 异常处理。 + } + ``` + +10. (可选)调用OH_VideoDecoder_Reset()重置解码器。 + + 调用OH_VideoDecoder_Reset接口后,解码器回到初始化的状态,需要调用OH_VideoDecoder_Configure接口、OH_VideoDecoder_SetSurface接口和OH_VideoDecoder_Prepare接口重新配置。 + + ```c++ + // 重置解码器videoDec。 + std::unique_lock lock(codecMutex); + int32_t ret = OH_VideoDecoder_Reset(videoDec); + if (ret != AV_ERR_OK) { + // 异常处理。 + } + + // 重新配置解码器参数。 + OH_AVFormat *format = OH_AVFormat_Create(); + ret = OH_VideoDecoder_Configure(videoDec, format); + if (ret != AV_ERR_OK) { + // 异常处理。 + } + OH_AVFormat_Destroy(format); + + // Surface模式重新配置surface,而Buffer模式不需要配置surface。 + ret = OH_VideoDecoder_SetSurface(videoDec, nativeWindow); + if (ret != AV_ERR_OK) { + // 异常处理。 + } + // 解码器重新就绪。 + ret = OH_VideoDecoder_Prepare(videoDec); + if (ret != AV_ERR_OK) { + // 异常处理。 + } + ``` + + > **注意:** + > + > 解码器回到初始化的状态,调用OH_VideoDecoder_Configure接口重新配置解码器参数时,同步模式需要重新配置OH_MD_KEY_ENABLE_SYNC_MODE为1,否则为异步模式。 + > + +11. (可选)调用OH_VideoDecoder_Stop()停止解码器。 + + 调用OH_VideoDecoder_Stop()后,解码器保留了解码实例,释放输入输出buffer。 + + ```c++ + // 终止解码器videoDec。 + std::unique_lock lock(codecMutex); + int32_t ret = OH_VideoDecoder_Stop(videoDec); + if (ret != AV_ERR_OK) { + // 异常处理。 + } + ``` + +12. 调用OH_VideoDecoder_Destroy()销毁解码器实例,释放资源。 + + ```c++ + // 调用OH_VideoDecoder_Destroy,注销解码器。 + std::unique_lock lock(codecMutex); + int32_t ret = AV_ERR_OK; + if (videoDec != nullptr) { + ret = OH_VideoDecoder_Destroy(videoDec); + videoDec = nullptr; + } + if (ret != AV_ERR_OK) { + // 异常处理。 + } + ``` + + > **说明:** + > + > 执行该步骤之后,需要开发者将videoDec指向nullptr,防止野指针导致程序错误。 + > + +### Buffer模式 + +参考以下示例代码,开发者可以完成Buffer模式下视频解码的全流程。此处以H.264文件输入,解码成YUV文件为例。 + +1. 创建解码器实例。 + + 与Surface模式相同,此处不再赘述。 + + ```c++ + // 通过codecname创建解码器,应用有特殊需求,比如选择支持某种分辨率规格的解码器,可先查询capability,再根据codec name创建解码器。 + OH_AVCapability *capability = OH_AVCodec_GetCapability(OH_AVCODEC_MIMETYPE_VIDEO_AVC, false); + const char *name = OH_AVCapability_GetName(capability); + OH_AVCodec *videoDec = OH_VideoDecoder_CreateByName(name); + if (videoDec == nullptr) { + printf("create videoDec failed"); + return; + } + ``` + +2. 调用OH_VideoDecoder_Configure()配置解码器。 + + 与Surface模式相同,此处不再赘述。 + + ```c++ + + OH_AVFormat *format = OH_AVFormat_Create(); + // 写入format。 + OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, width); // 必须配置。 + OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, height); // 必须配置。 + OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, pixelFormat); + OH_AVFormat_SetIntValue(format, OH_MD_KEY_ENABLE_SYNC_MODE, 1); // 同步模式配置。 + // 配置解码器。 + int32_t ret = OH_VideoDecoder_Configure(videoDec, format); + if (ret != AV_ERR_OK) { + // 异常处理。 + } + OH_AVFormat_Destroy(format); + ``` + + > **注意:** + > + > 1. 使能视频解码同步模式,必须要配置OH_MD_KEY_ENABLE_SYNC_MODE为1。 + > 2. 在调用OH_VideoDecoder_Configure接口前没有调用OH_VideoDecoder_RegisterCallback接口,否则为异步模式。 + > + +3. 调用OH_VideoDecoder_Prepare()解码器就绪。 + + 该接口将在解码器运行前进行一些数据的准备工作。 + + ```c++ + int32_t ret = OH_VideoDecoder_Prepare(videoDec); + if (ret != AV_ERR_OK) { + // 异常处理。 + } + ``` + +4. 调用OH_VideoDecoder_Start()启动解码器。 + + ```c++ + std::unique_ptr outputFile = std::make_unique(); + outputFile->open("/*yourpath*.yuv", std::ios::out | std::ios::binary | std::ios::ate); + // 启动解码器,开始解码。 + int32_t ret = OH_VideoDecoder_Start(videoDec); + if (ret != AV_ERR_OK) { + // 异常处理。 + } + ``` + + +5. 调用OH_VideoDecoder_PushInputBuffer()写入解码码流。 + + 与Surface模式相同,此处不再赘述。 + + ```c++ + bool DecoderInput(OH_AVCodec *videoDec, int64_t timeoutUs) + { + uint32_t index; + std::shared_lock lock(codecMutex); + + OH_AVErrCode ret = OH_VideoDecoder_QueryInputBuffer(videoDec, &index, timeoutUs); + switch (ret) { + case AV_ERR_OK: { + OH_AVBuffer *buffer = OH_VideoDecoder_GetInputBuffer(videoDec, index); + if (buffer == nullptr) { + // 异常处理。 + return false; + } + // 写入码流数据。 + uint8_t *addr = OH_AVBuffer_GetAddr(buffer); + if (addr == nullptr) { + // 异常处理。 + return false; + } + // buffer数据填充。 + memcpy(addr, frameData, size); + + OH_AVCodecBufferAttr info; + // buffer属性配置。 + // 配置帧数据的输入尺寸、偏移量、时间戳等字段信息。 + info.size = size; + info.offset = offset; + info.pts = pts; + if (inFile_->eof()) { + info.flags = AVCODEC_BUFFER_FLAGS_EOS; + } else { + info.flags = flags; + } + int32_t ret = OH_AVBuffer_SetBufferAttr(buffer, &info); + if (ret != AV_ERR_OK) { + // 异常处理。 + return false; + } + ret = OH_VideoDecoder_PushInputBuffer(videoDec, index); + if (ret != AV_ERR_OK) { + // 异常处理。 + return false; + } + if (inFile_->eof()) { + inputDone = 1; + break; + } + break; + } + case AV_ERR_TRY_AGAIN_LATER: { + break; + } + default: { + // 异常处理。 + return false; + } + } + return true; + } + ``` + +6. 调用OH_VideoDecoder_FreeOutputBuffer()释放解码帧。 + + ```c++ + bool DecoderOutput(OH_AVCodec *videoDec, int64_t timeoutUs) + { + uint32_t index; + std::shared_lock lock(codecMutex); + + OH_AVErrCode ret = OH_VideoDecoder_QueryOutputBuffer(videoDec, &index, timeoutUs); + switch (ret) { + case AV_ERR_OK: { + OH_AVBuffer *buffer = OH_VideoDecoder_GetOutputBuffer(videoDec, index); + if (buffer == nullptr) { + // 异常处理。 + return false; + } + + // 获取解码后信息。 + OH_AVCodecBufferAttr info; + int32_t ret = OH_AVBuffer_GetBufferAttr(buffer, &info); + if (ret != AV_ERR_OK) { + // 异常处理。 + return false; + } + if (info.flags & AVCODEC_BUFFER_FLAGS_EOS) { + outputDone = 1; + break; + } + + // 释放已完成处理的信息,index为对应buffer队列的下标。 + ret = OH_VideoDecoder_FreeOutputBuffer(videoDec, index); + if (ret != AV_ERR_OK) { + // 异常处理。 + return false; + } + break; + } + case AV_ERR_TRY_AGAIN_LATER: { + break; + } + case AV_ERR_STREAM_CHANGED: { + OH_AVFormat *format = OH_VideoDecoder_GetOutputDescription(videoDec); + // 获取到变化后的视频宽、高、跨距。 + OH_AVFormat_GetIntValue(format, OH_MD_KEY_VIDEO_PIC_WIDTH, &width); + OH_AVFormat_GetIntValue(format, OH_MD_KEY_VIDEO_PIC_HEIGHT, &height); + OH_AVFormat_GetIntValue(format, OH_MD_KEY_VIDEO_STRIDE, &widthStride); + OH_AVFormat_GetIntValue(format, OH_MD_KEY_VIDEO_SLICE_HEIGHT, &heightStride); + // 获取裁剪矩形信息可选。 + OH_AVFormat_GetIntValue(format, OH_MD_KEY_VIDEO_CROP_TOP, &cropTop); + OH_AVFormat_GetIntValue(format, OH_MD_KEY_VIDEO_CROP_BOTTOM, &cropBottom); + OH_AVFormat_GetIntValue(format, OH_MD_KEY_VIDEO_CROP_LEFT, &cropLeft); + OH_AVFormat_GetIntValue(format, OH_MD_KEY_VIDEO_CROP_RIGHT, &cropRight); + OH_AVFormat_Destroy(format); + break; + } + default: { + // 异常处理。 + return false; + } + } + return true; + } + ``` + +7. 解码输入输出。 + + ```c++ + bool result = true; + int64_t timeoutUs = 0; // 单位:微秒,负值:无限等待;0:立即退出;正值:指定时间timeout后退出。 + + while (!outputDone && result) { + if (!inputDone) { + result = DecoderInput(videoDec, timeoutUs); + } + if (!outputDone ) { + result = DecoderOutput(videoDec, timeoutUs); + } + } + ``` + +后续流程(包括刷新解码器、重置解码器、停止解码器、销毁解码器)与Surface模式基本一致,请参考[Surface模式](#surface模式)的步骤9-12。 \ No newline at end of file diff --git a/zh-cn/application-dev/media/avcodec/video-decoding.md b/zh-cn/application-dev/media/avcodec/video-decoding.md index 88430e78b2f54faa36fda55ea1729217c78e41d9..07f94964c9e2ba08b9dacc7124085793a9eb3ec7 100644 --- a/zh-cn/application-dev/media/avcodec/video-decoding.md +++ b/zh-cn/application-dev/media/avcodec/video-decoding.md @@ -194,8 +194,7 @@ target_link_libraries(sample PUBLIC libnative_media_vdec.so) ### Surface模式 -参考以下示例代码,开发者可以完成Surface模式下视频解码的全流程。此处以H.264码流文件输入,解码送显输出为例。 -本模块目前仅支持异步模式的数据轮转。 +参考以下示例代码,开发者可以完成Surface模式下视频解码的全流程,实现异步模式的数据轮转。此处以H.264码流文件输入,解码送显输出为例。 1. 添加头文件。 @@ -763,8 +762,8 @@ target_link_libraries(sample PUBLIC libnative_media_vdec.so) ### Buffer模式 -参考以下示例代码,开发者可以完成Buffer模式下视频解码的全流程。此处以H.264文件输入,解码成YUV文件为例。 -本模块目前仅支持异步模式的数据轮转。 +参考以下示例代码,开发者可以完成Buffer模式下视频解码的全流程,实现异步模式的数据轮转。此处以H.264文件输入,解码成YUV文件为例。 + 1. 添加头文件。 diff --git a/zh-cn/application-dev/reference/apis-avcodec-kit/_codec_base.md b/zh-cn/application-dev/reference/apis-avcodec-kit/_codec_base.md index a6532faf4a0cb57b0775e8230b3aa0fc6b411a88..465586cf0597c45f91c53f078c79f60f8ec0f77f 100644 --- a/zh-cn/application-dev/reference/apis-avcodec-kit/_codec_base.md +++ b/zh-cn/application-dev/reference/apis-avcodec-kit/_codec_base.md @@ -83,6 +83,7 @@ CodecBase模块提供用于音视频封装、解封装、编解码基础功能 | [OH_MD_KEY_VIDEO_PIC_WIDTH](#oh_md_key_video_pic_width) | 描述视频帧真实宽度的键,值类型为int32_t。该键是可选的。 | | [OH_MD_KEY_VIDEO_PIC_HEIGHT](#oh_md_key_video_pic_height) | 描述视频帧真实高度的键,值类型为int32_t。该键是可选的。 | | [OH_MD_KEY_VIDEO_ENABLE_LOW_LATENCY](#oh_md_key_video_enable_low_latency) | 使能低时延视频编解码的键,值类型为int32_t,1表示使能,0表示其它情况。该键是可选,在Configure阶段使用。 | +| [OH_MD_KEY_ENABLE_SYNC_MODE](#oh_md_key_enable_sync_mode) | 使能视频编解码同步模式的键,值类型为int32_t,1表示使能,0表示其它情况。该键是可选,在Configure阶段使用。 | | [OH_MD_KEY_VIDEO_ENCODE_BITRATE_MODE](#oh_md_key_video_encode_bitrate_mode) | 视频编码码率模式,值类型为int32_t,请参见[OH_BitrateMode](#oh_bitratemode-1)。该键是可选的。 | | [OH_MD_KEY_QUALITY](#oh_md_key_quality) | 所需编码质量的键。值类型为int32_t,此键仅适用于配置在恒定质量模式下的编码器。该键是可选的。 | | [OH_MD_KEY_REQUEST_I_FRAME](#oh_md_key_request_i_frame) | 请求立即编码I帧的键。值类型为int32_t。该键是可选的。 | @@ -308,6 +309,7 @@ CodecBase模块提供用于音视频封装、解封装、编解码基础功能 | const char \* [OH_MD_KEY_VIDEO_PIC_WIDTH](#oh_md_key_video_pic_width) | 描述视频帧真实宽度的键,值类型为int32_t。 | | const char \* [OH_MD_KEY_VIDEO_PIC_HEIGHT](#oh_md_key_video_pic_height) | 描述视频帧真实高度的键,值类型为int32_t。 | | const char \* [OH_MD_KEY_VIDEO_ENABLE_LOW_LATENCY](#oh_md_key_video_enable_low_latency) | 使能低时延视频编解码的键,值类型为int32_t,1表示使能,0表示其它情况。如果使能,则视频编码器或视频解码器持有的输入和输出数据不会超过编解码器标准所要求的数量。 | +| const char \* [OH_MD_KEY_ENABLE_SYNC_MODE](#oh_md_key_enable_sync_mode) | 使能视频编解码同步模式的键,值类型为int32_t,1表示使能,0表示其它情况。该键是可选,在Configure阶段使用。 | | const char \* [OH_MD_KEY_VIDEO_ENCODE_BITRATE_MODE](#oh_md_key_video_encode_bitrate_mode) | 视频编码码率模式,值类型为int32_t,请参见[OH_BitrateMode](#oh_bitratemode-1)。 | | const char \* [OH_MD_KEY_QUALITY](#oh_md_key_quality) | 所需编码质量的键。值类型为int32_t,此键仅适用于配置在恒定质量模式下的编码器。 | | const char \* [OH_MD_KEY_REQUEST_I_FRAME](#oh_md_key_request_i_frame) | 请求立即编码I帧的键。值类型为int32_t。 | @@ -2648,6 +2650,24 @@ const char* OH_MD_KEY_VIDEO_ENABLE_LOW_LATENCY **起始版本:** 12 +### OH_MD_KEY_ENABLE_SYNC_MODE + +``` +const char* OH_MD_KEY_ENABLE_SYNC_MODE +``` +**描述** +使能视频编解码同步模式的键,值类型为int32_t,1表示使能,0表示其它情况。该键是可选,默认值为0。 + +如果使能,需要注意: +1. 编解码器不可设置回调函数。 +2. 必须使用缓冲区查询接口替代回调。 +3. 只能在Configure阶段使用。 + +**系统能力:** SystemCapability.Multimedia.Media.CodecBase + +**起始版本:** 20 + + ### OH_MD_KEY_VIDEO_ENCODE_BITRATE_MODE ``` diff --git a/zh-cn/application-dev/reference/apis-avcodec-kit/_core.md b/zh-cn/application-dev/reference/apis-avcodec-kit/_core.md index 393f1fb172e9c35c520fcd98b9cc17310c7f44ec..c483638fda6b8f74432f57fcd2c11789d01cb98e 100644 --- a/zh-cn/application-dev/reference/apis-avcodec-kit/_core.md +++ b/zh-cn/application-dev/reference/apis-avcodec-kit/_core.md @@ -60,7 +60,7 @@ Core模块提供用于媒体系统的基础骨干能力,包含内存、错误 | [OH_AmbAttributeSet](#oh_ambattributeset-1) {
AMB_ORD_1 = 1ULL << 0U,
AMB_ORD_2 = 2ULL << 0U,
AMB_ORD_3 = 3ULL << 0U,
AMB_COM_ACN = 0ULL << 8U,
AMB_COM_FUMA = 1ULL << 8U,
AMB_NOR_N3D = 0ULL << 12U,
AMB_NOR_SN3D = 1ULL << 12U,
AMB_MODE = 1ULL << 44U
} | 高保真立体声混响设置。 | | [OH_AudioChannelLayout](#oh_audiochannellayout-1) {
CH_LAYOUT_UNKNOWN = 0ULL,
CH_LAYOUT_MONO = CH_SET_FRONT_CENTER,
CH_LAYOUT_STEREO = CH_SET_FRONT_LEFT \| CH_SET_FRONT_RIGHT,
CH_LAYOUT_STEREO_DOWNMIX = CH_SET_STEREO_LEFT \| CH_SET_STEREO_RIGHT,
CH_LAYOUT_2POINT1 = CH_LAYOUT_STEREO \| CH_SET_LOW_FREQUENCY,
CH_LAYOUT_3POINT0 = CH_LAYOUT_STEREO \| CH_SET_BACK_CENTER,
CH_LAYOUT_SURROUND = CH_LAYOUT_STEREO \| CH_SET_FRONT_CENTER,
CH_LAYOUT_3POINT1 = CH_LAYOUT_SURROUND \| CH_SET_LOW_FREQUENCY,
CH_LAYOUT_4POINT0 = CH_LAYOUT_SURROUND \| CH_SET_BACK_CENTER,
CH_LAYOUT_QUAD_SIDE = CH_LAYOUT_STEREO \| CH_SET_SIDE_LEFT \| CH_SET_SIDE_RIGHT,
CH_LAYOUT_QUAD = CH_LAYOUT_STEREO \| CH_SET_BACK_LEFT \| CH_SET_BACK_RIGHT,
CH_LAYOUT_2POINT0POINT2 = CH_LAYOUT_STEREO \| CH_SET_TOP_SIDE_LEFT \| CH_SET_TOP_SIDE_RIGHT,
CH_LAYOUT_AMB_ORDER1_ACN_N3D = AMB_MODE \| AMB_ORD_1 \| AMB_COM_ACN \| AMB_NOR_N3D, CH_LAYOUT_AMB_ORDER1_ACN_SN3D = AMB_MODE \| AMB_ORD_1 \| AMB_COM_ACN \| AMB_NOR_SN3D,
CH_LAYOUT_AMB_ORDER1_FUMA = AMB_MODE \| AMB_ORD_1 \| AMB_COM_FUMA,
CH_LAYOUT_4POINT1 = CH_LAYOUT_4POINT0 \| CH_SET_LOW_FREQUENCY,
CH_LAYOUT_5POINT0 = CH_LAYOUT_SURROUND \| CH_SET_SIDE_LEFT \| CH_SET_SIDE_RIGHT,
CH_LAYOUT_5POINT0_BACK = CH_LAYOUT_SURROUND \| CH_SET_BACK_LEFT \| CH_SET_BACK_RIGHT,
CH_LAYOUT_2POINT1POINT2 = CH_LAYOUT_2POINT0POINT2 \| CH_SET_LOW_FREQUENCY,
CH_LAYOUT_3POINT0POINT2 = CH_LAYOUT_2POINT0POINT2 \| CH_SET_FRONT_CENTER,
CH_LAYOUT_5POINT1 = CH_LAYOUT_5POINT0 \| CH_SET_LOW_FREQUENCY,
CH_LAYOUT_5POINT1_BACK = CH_LAYOUT_5POINT0_BACK \| CH_SET_LOW_FREQUENCY,
CH_LAYOUT_6POINT0 = CH_LAYOUT_5POINT0 \| CH_SET_BACK_CENTER,
CH_LAYOUT_3POINT1POINT2 = CH_LAYOUT_3POINT1 \| CH_SET_TOP_FRONT_LEFT \| CH_SET_TOP_FRONT_RIGHT,
CH_LAYOUT_6POINT0_FRONT = CH_LAYOUT_QUAD_SIDE \| CH_SET_FRONT_LEFT_OF_CENTER \| CH_SET_FRONT_RIGHT_OF_CENTER,
CH_LAYOUT_HEXAGONAL = CH_LAYOUT_5POINT0_BACK \| CH_SET_BACK_CENTER,
CH_LAYOUT_6POINT1 = CH_LAYOUT_5POINT1 \| CH_SET_BACK_CENTER,
CH_LAYOUT_6POINT1_BACK = CH_LAYOUT_5POINT1_BACK \| CH_SET_BACK_CENTER,
CH_LAYOUT_6POINT1_FRONT = CH_LAYOUT_6POINT0_FRONT \| CH_SET_LOW_FREQUENCY,
CH_LAYOUT_7POINT0 = CH_LAYOUT_5POINT0 \| CH_SET_BACK_LEFT \| CH_SET_BACK_RIGHT,
CH_LAYOUT_7POINT0_FRONT = CH_LAYOUT_5POINT0 \| CH_SET_FRONT_LEFT_OF_CENTER \| CH_SET_FRONT_RIGHT_OF_CENTER,
CH_LAYOUT_7POINT1 = CH_LAYOUT_5POINT1 \| CH_SET_BACK_LEFT \| CH_SET_BACK_RIGHT,
CH_LAYOUT_OCTAGONAL = CH_LAYOUT_5POINT0 \| CH_SET_BACK_LEFT \| CH_SET_BACK_CENTER \| CH_SET_BACK_RIGHT,
CH_LAYOUT_5POINT1POINT2 = CH_LAYOUT_5POINT1 \| CH_SET_TOP_SIDE_LEFT \| CH_SET_TOP_SIDE_RIGHT,
CH_LAYOUT_7POINT1_WIDE = CH_LAYOUT_5POINT1 \| CH_SET_FRONT_LEFT_OF_CENTER \| CH_SET_FRONT_RIGHT_OF_CENTER,
CH_LAYOUT_7POINT1_WIDE_BACK = CH_LAYOUT_5POINT1_BACK \| CH_SET_FRONT_LEFT_OF_CENTER \| CH_SET_FRONT_RIGHT_OF_CENTER,
CH_LAYOUT_AMB_ORDER2_ACN_N3D = AMB_MODE \| AMB_ORD_2 \| AMB_COM_ACN \| AMB_NOR_N3D,
CH_LAYOUT_AMB_ORDER2_ACN_SN3D = AMB_MODE \| AMB_ORD_2 \| AMB_COM_ACN \| AMB_NOR_SN3D,
CH_LAYOUT_AMB_ORDER2_FUMA = AMB_MODE \| AMB_ORD_2 \| AMB_COM_FUMA,
CH_LAYOUT_5POINT1POINT4,
CH_LAYOUT_7POINT1POINT2 = CH_LAYOUT_7POINT1 \| CH_SET_TOP_SIDE_LEFT \| CH_SET_TOP_SIDE_RIGHT,
CH_LAYOUT_7POINT1POINT4,
CH_LAYOUT_10POINT2,
CH_LAYOUT_9POINT1POINT4 = CH_LAYOUT_7POINT1POINT4 \| CH_SET_WIDE_LEFT \| CH_SET_WIDE_RIGHT,
CH_LAYOUT_9POINT1POINT6 = CH_LAYOUT_9POINT1POINT4 \| CH_SET_TOP_SIDE_LEFT \| CH_SET_TOP_SIDE_RIGHT,
CH_LAYOUT_HEXADECAGONAL,
CH_LAYOUT_AMB_ORDER3_ACN_N3D = AMB_MODE \| AMB_ORD_3 \| AMB_COM_ACN \| AMB_NOR_N3D,
CH_LAYOUT_AMB_ORDER3_ACN_SN3D = AMB_MODE \| AMB_ORD_3 \| AMB_COM_ACN \| AMB_NOR_SN3D,
CH_LAYOUT_AMB_ORDER3_FUMA = AMB_MODE \| AMB_ORD_3 \| AMB_COM_FUMA,
CH_LAYOUT_22POINT2
} | 音频声道布局。 | | [OH_AVCodecBufferFlags](#oh_avcodecbufferflags-1) {
AVCODEC_BUFFER_FLAGS_NONE = 0,
AVCODEC_BUFFER_FLAGS_EOS = 1 << 0, AVCODEC_BUFFER_FLAGS_SYNC_FRAME = 1 << 1, AVCODEC_BUFFER_FLAGS_INCOMPLETE_FRAME = 1 << 2,
AVCODEC_BUFFER_FLAGS_CODEC_DATA = 1 << 3,
AVCODEC_BUFFER_FLAGS_DISCARD = 1 << 4,
AVCODEC_BUFFER_FLAGS_DISPOSABLE = 1 << 5
} | 枚举OH_AVCodec缓冲区标记的类别。 | -| [OH_AVErrCode](#oh_averrcode-1) {
AV_ERR_OK = 0,
AV_ERR_NO_MEMORY = 1,
AV_ERR_OPERATE_NOT_PERMIT = 2,
AV_ERR_INVALID_VAL = 3,
AV_ERR_IO = 4,
AV_ERR_TIMEOUT = 5,
AV_ERR_UNKNOWN = 6,
AV_ERR_SERVICE_DIED = 7,
AV_ERR_INVALID_STATE = 8,
AV_ERR_UNSUPPORT = 9,
AV_ERR_UNSUPPORTED_FORMAT = 11,
AV_ERR_EXTEND_START = 100,
AV_ERR_DRM_BASE = 200,
AV_ERR_DRM_DECRYPT_FAILED = 201,
AV_ERR_VIDEO_BASE = 300,
AV_ERR_VIDEO_UNSUPPORTED_COLOR_SPACE_CONVERSION = 301
} | 媒体系统错误码。 | +| [OH_AVErrCode](#oh_averrcode-1) {
AV_ERR_OK = 0,
AV_ERR_NO_MEMORY = 1,
AV_ERR_OPERATE_NOT_PERMIT = 2,
AV_ERR_INVALID_VAL = 3,
AV_ERR_IO = 4,
AV_ERR_TIMEOUT = 5,
AV_ERR_UNKNOWN = 6,
AV_ERR_SERVICE_DIED = 7,
AV_ERR_INVALID_STATE = 8,
AV_ERR_UNSUPPORT = 9,
AV_ERR_UNSUPPORTED_FORMAT = 11,
AV_ERR_EXTEND_START = 100,
AV_ERR_DRM_BASE = 200,
AV_ERR_DRM_DECRYPT_FAILED = 201,
AV_ERR_VIDEO_BASE = 300,
AV_ERR_VIDEO_UNSUPPORTED_COLOR_SPACE_CONVERSION = 301,
AV_ERR_STREAM_CHANGED = 5410005,
AV_ERR_TRY_AGAIN_LATER = 5410006
} | 媒体系统错误码。 | | [OH_AVPixelFormat](#oh_avpixelformat-1) {
AV_PIXEL_FORMAT_YUVI420 = 1,
AV_PIXEL_FORMAT_NV12 = 2,
AV_PIXEL_FORMAT_NV21 = 3,
AV_PIXEL_FORMAT_SURFACE_FORMAT = 4,
AV_PIXEL_FORMAT_RGBA = 5
} | 视频像素格式的枚举类。 | @@ -486,6 +486,8 @@ enum OH_AVErrCode | AV_ERR_DRM_DECRYPT_FAILED | DRM解密失败。
**起始版本:** 12 | | AV_ERR_VIDEO_BASE | 视频起始错误码。
**起始版本:** 12 | | AV_ERR_VIDEO_UNSUPPORTED_COLOR_SPACE_CONVERSION | 视频不支持色彩空间转换。
**起始版本:** 12 | +| AV_ERR_STREAM_CHANGED | 同步模式下流格式发生变更。可以通过调用GetOutputDescription接口来获取更新后流的配置信息。
**起始版本:** 20 | +| AV_ERR_TRY_AGAIN_LATER | 同步模式下临时缓冲区查询失败,建议等待短暂间隔后重试操作。
**起始版本:** 20 | ### OH_AVPixelFormat diff --git a/zh-cn/application-dev/reference/apis-avcodec-kit/_video_decoder.md b/zh-cn/application-dev/reference/apis-avcodec-kit/_video_decoder.md index 68cebc1a3f2de3726aea1d746505d9e0cafa4056..210221cac047f31403b92814d93f45ccdb605320 100644 --- a/zh-cn/application-dev/reference/apis-avcodec-kit/_video_decoder.md +++ b/zh-cn/application-dev/reference/apis-avcodec-kit/_video_decoder.md @@ -53,7 +53,11 @@ VideoDecoder模块提供用于视频解码的接口。 | [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoDecoder_RenderOutputBufferAtTime](#oh_videodecoder_renderoutputbufferattime) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index, int64_t renderTimestampNs) | 将index对应的输出缓冲返回给解码器,缓冲中携带解码输出数据,并通知解码器在开发者指定的时间内完成在输出surface上渲染,输出缓冲包含解码数据。 | | [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoDecoder_FreeOutputBuffer](#oh_videodecoder_freeoutputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index) | 将处理后的输出缓冲区返回到解码器。 | | [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoDecoder_IsValid](#oh_videodecoder_isvalid) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, bool \*isValid) | 检查当前解码实例是否有效。 | -| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoDecoder_SetDecryptionConfig](#oh_videodecoder_setdecryptionconfig) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, MediaKeySession \*mediaKeySession, bool secureVideoPath) | 设置解密配置。 | +| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoDecoder_SetDecryptionConfig](#oh_videodecoder_setdecryptionconfig) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, MediaKeySession \*mediaKeySession, bool secureVideoPath) | 设置解密配置。 | +| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoDecoder_QueryInputBuffer](#oh_videodecoder_queryinputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t *index, int64_t timeoutUs) | 查询下一个可用输入缓冲区的索引。 | +| [OH_AVBuffer](_core.md#oh_avbuffer) [OH_VideoDecoder_GetInputBuffer](#oh_videodecoder_getinputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index) | 获取可用输入缓冲区的实例。 | +| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoDecoder_QueryOutputBuffer](#oh_videodecoder_queryoutputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t *index, int64_t timeoutUs) | 查询下一个可用输出缓冲区的索引。 | +| [OH_AVBuffer](_core.md#oh_avbuffer) [OH_VideoDecoder_GetOutputBuffer](#oh_videodecoder_getoutputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index) | 获取可用输出缓冲区的实例。 | ## 函数说明 @@ -760,6 +764,157 @@ AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。 AV_ERR_INVALID_STATE:解码器状态不支持调用本接口时调用。 +### OH_VideoDecoder_QueryInputBuffer() + +``` +OH_AVErrCode OH_VideoDecoder_QueryInputBuffer(struct OH_AVCodec *codec, uint32_t *index, int64_t timeoutUs); +``` +**描述** + +查询下一个可用输入缓冲区的索引。 + +调用此接口后需要接着调用OH_VideoDecoder_GetInputBuffer接口获取缓冲区实例,并通过OH_VideoDecoder_PushInputBuffer接口传递给解码器。 + +需要注意的是,上述操作仅在同步模式下支持。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder + +**起始版本:** 20 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| codec | 指向视频解码实例的指针。 | +| index | 输入buffer对应的索引值。| +| timeoutUs | 超时时长,单位为微秒。负值:无限等待;0:立即退出;正值:指定时间timeout后退出。 | + +**返回:** + +返回接口结果: + +AV_ERR_OK:执行成功。 + +AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。 + +AV_ERR_INVALID_VAL:输入的codec指针为非解码器实例,或者为空指针。 + +AV_ERR_UNKNOWN:未知错误。 + +AV_ERR_SERVICE_DIED:编解码服务已终止。 + +AV_ERR_INVALID_STATE:解码器状态不支持调用本接口时调用。 + +AV_ERR_OPERATE_NOT_PERMIT:禁止异步模式下使用。 + +AV_ERR_TRY_AGAIN_LATER:查询失败,建议等待短暂间隔后重试。 + + +### OH_VideoDecoder_GetInputBuffer() + +``` +OH_AVBuffer *OH_VideoDecoder_GetInputBuffer(struct OH_AVCodec *codec, uint32_t index); +``` +**描述** + +获取可用输入缓冲区的实例。 + +需要注意的是,此接口仅适用于同步模式。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder + +**起始版本:** 20 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| codec | 指向视频解码实例的指针。 | +| index | 输入buffer对应的索引值,可通过OH_VideoDecoder_QueryInputBuffer接口获取。| + +**返回:** + +如果执行成功,则返回一个指向OH_AVBuffer实例的指针,否则返回NULL。 + + +### OH_VideoDecoder_QueryOutputBuffer() + +``` +OH_AVErrCode OH_VideoDecoder_QueryOutputBuffer(struct OH_AVCodec *codec, uint32_t *index, int64_t timeoutUs); +``` +**描述** + +查询下一个可用输出缓冲区的索引。 + +通过OH_VideoDecoder_GetOutputBuffer接口获取的缓冲区实例可以通过执行以下操作来显示或释放解码帧: +1. 通过OH_VideoDecoder_FreeOutputBuffer接口将处理后的输出缓冲区返回到解码器。 +2. 通过OH_VideoDecoder_RenderOutputBuffer在输出surface上渲染。 +3. 通过OH_VideoDecoder_RenderOutputBufferAtTime在指定时间内完成输出surface上渲染。 + +需要注意的是,上述操作仅在同步模式下支持。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder + +**起始版本:** 20 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| codec | 指向视频解码实例的指针。 | +| index | 输出buffer对应的索引值。| +| timeoutUs | 超时时长,单位为微秒。负值:无限等待;0:立即退出;正值:指定时间timeout后退出。 | + +**返回:** + +返回接口结果: + +AV_ERR_OK:执行成功。 + +AV_ERR_NO_MEMORY:输入的解码器实例已经销毁。 + +AV_ERR_INVALID_VAL:输入的codec指针为非解码器实例,或者为空指针。 + +AV_ERR_UNKNOWN:未知错误。 + +AV_ERR_SERVICE_DIED:编解码服务已终止。 + +AV_ERR_INVALID_STATE:解码器状态不支持调用本接口时调用。 + +AV_ERR_OPERATE_NOT_PERMIT:禁止异步模式下使用。 + +AV_ERR_STREAM_CHANGED:流格式已变更,可以通过调用OH_VideoDecoder_GetOutputDescription接口获取新的流信息。 + +AV_ERR_TRY_AGAIN_LATER:查询失败,建议等待短暂间隔后重试。 + + +### OH_VideoDecoder_GetOutputBuffer() + +``` +OH_AVBuffer *OH_VideoDecoder_GetOutputBuffer(struct OH_AVCodec *codec, uint32_t index); +``` +**描述** + +获取可用输出缓冲区的实例。 + +需要注意的是,此接口仅适用于同步模式。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoDecoder + +**起始版本:** 20 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| codec | 指向视频解码实例的指针。 | +| index | 输出buffer对应的索引值,可通过OH_VideoDecoder_QueryOutputBuffer接口获取。| + +**返回:** + +如果执行成功,则返回一个指向OH_AVBuffer实例的指针,否则返回NULL。 + + ## 废弃函数说明 diff --git a/zh-cn/application-dev/reference/apis-avcodec-kit/_video_encoder.md b/zh-cn/application-dev/reference/apis-avcodec-kit/_video_encoder.md index 4ab895c4bebdc1219e7492dd11b65693caf64498..19895ce377a3421e90775f23f141d9b87a1e85df 100644 --- a/zh-cn/application-dev/reference/apis-avcodec-kit/_video_encoder.md +++ b/zh-cn/application-dev/reference/apis-avcodec-kit/_video_encoder.md @@ -70,7 +70,10 @@ VideoEncoder模块提供用于视频编码的接口。 | [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_FreeOutputBuffer](#oh_videoencoder_freeoutputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index) | 将处理后的index对应的OH_AVBuffer返回给编码器。 | | OH_AVFormat \* [OH_VideoEncoder_GetInputDescription](#oh_videoencoder_getinputdescription) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec) | 编码器接收到的图像的描述信息。 | | [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_IsValid](#oh_videoencoder_isvalid) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, bool \*isValid) | 检查当前编码实例是否有效。 | - +| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_QueryInputBuffer](#oh_videoencoder_queryinputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t *index, int64_t timeoutUs) | 查询下一个可用输入缓冲区的索引。 | +| [OH_AVBuffer](_core.md#oh_avbuffer) [OH_VideoEncoder_GetInputBuffer](#oh_videoencoder_getinputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index) | 获取可用输入缓冲区的实例。 | +| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_QueryOutputBuffer](#oh_videoencoder_queryoutputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t *index, int64_t timeoutUs) | 查询下一个可用输出缓冲区的索引。 | +| [OH_AVBuffer](_core.md#oh_avbuffer) [OH_VideoEncoder_GetOutputBuffer](#oh_videoencoder_getoutputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index) | 获取可用输出缓冲区的实例。 | ## 类型定义说明 @@ -766,7 +769,7 @@ AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。 OH_AVErrCode OH_VideoEncoder_Start (OH_AVCodec *codec) ``` **描述** -调用OH_VideoEncoder_Prepare接口成功后调用此接口启动解码器。成功启动后,编码器将开始报告注册的回调事件。 +调用OH_VideoEncoder_Prepare接口成功后调用此接口启动编码器。成功启动后,编码器将开始报告注册的回调事件。 Surface模式下,在surface中有正确的输入后,每完成一帧编码会触发OnNewOutputBuffer。 @@ -834,6 +837,154 @@ AV_ERR_OPERATE_NOT_PERMIT:内部执行错误。 AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。 +### OH_VideoEncoder_QueryInputBuffer() + +``` +OH_AVErrCode OH_VideoEncoder_QueryInputBuffer(struct OH_AVCodec *codec, uint32_t *index, int64_t timeoutUs); +``` +**描述** + +查询下一个可用输入缓冲区的索引。 + +调用此接口后需要接着调用OH_VideoEncoder_GetInputBuffer接口获取缓冲区实例,并通过OH_VideoEncoder_PushInputBuffer接口传递给编码器。 + +需要注意的是,上述操作仅在同步模式下支持。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder + +**起始版本:** 20 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| codec | 指向视频编码实例的指针。 | +| index | 输入buffer对应的索引值。| +| timeoutUs | 超时时长,单位为微秒。负值:无限等待;0:立即退出;正值:指定时间timeout后退出。 | + +**返回:** + +返回接口结果: + +AV_ERR_OK:执行成功。 + +AV_ERR_NO_MEMORY:输入的编码器实例已经销毁。 + +AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。 + +AV_ERR_UNKNOWN:未知错误。 + +AV_ERR_SERVICE_DIED:编解码服务已终止。 + +AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。 + +AV_ERR_OPERATE_NOT_PERMIT:禁止异步模式下使用。 + +AV_ERR_TRY_AGAIN_LATER:查询失败,建议等待短暂间隔后重试。 + + +### OH_VideoEncoder_GetInputBuffer() + +``` +OH_AVBuffer *OH_VideoEncoder_GetInputBuffer(struct OH_AVCodec *codec, uint32_t index); +``` +**描述** + +获取可用输入缓冲区的实例。 + +需要注意的是,此接口仅适用于同步模式。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder + +**起始版本:** 20 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| codec | 指向视频编码实例的指针。 | +| index | 输入buffer对应的索引值,可通过OH_VideoEncoder_QueryInputBuffer接口获取。| + +**返回:** + +如果执行成功,则返回一个指向OH_AVBuffer实例的指针,否则返回NULL。 + + +### OH_VideoEncoder_QueryOutputBuffer() + +``` +OH_AVErrCode OH_VideoEncoder_QueryOutputBuffer(struct OH_AVCodec *codec, uint32_t *index, int64_t timeoutUs); +``` +**描述** + +查询下一个可用输出缓冲区的索引。 + +通过OH_VideoEncoder_GetOutputBuffer接口获取的缓冲区实例可以通过OH_VideoEncoder_FreeOutputBuffer接口将处理后的输出缓冲区返回到编码器。 + +需要注意的是,上述操作仅在同步模式下支持。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder + +**起始版本:** 20 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| codec | 指向视频编码实例的指针。 | +| index | 输出buffer对应的索引值。| +| timeoutUs | 超时时长,单位为微秒。负值:无限等待;0:立即退出;正值:指定时间timeout后退出。 | + +**返回:** + +返回接口结果: + +AV_ERR_OK:执行成功。 + +AV_ERR_NO_MEMORY:输入的编码器实例已经销毁。 + +AV_ERR_INVALID_VAL:输入的codec指针为非编码器实例,或者为空指针。 + +AV_ERR_UNKNOWN:未知错误。 + +AV_ERR_SERVICE_DIED:编解码服务已终止。 + +AV_ERR_INVALID_STATE:编码器状态不支持调用本接口时调用。 + +AV_ERR_OPERATE_NOT_PERMIT:禁止异步模式下使用。 + +AV_ERR_STREAM_CHANGED:流格式已变更,可以通过调用OH_VideoEncoder_GetOutputDescription接口获取新的流信息。 + +AV_ERR_TRY_AGAIN_LATER:查询失败,建议等待短暂间隔后重试。 + + +### OH_VideoEncoder_GetOutputBuffer() + +``` +OH_AVBuffer *OH_VideoEncoder_GetOutputBuffer(struct OH_AVCodec *codec, uint32_t index); +``` +**描述** + +获取可用输出缓冲区的实例。 + +需要注意的是,此接口仅适用于同步模式。 + +**系统能力:** SystemCapability.Multimedia.Media.VideoEncoder + +**起始版本:** 20 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| codec | 指向视频编码实例的指针。 | +| index | 输出buffer对应的索引值,可通过OH_VideoEncoder_QueryOutputBuffer接口获取。| + +**返回:** + +如果执行成功,则返回一个指向OH_AVBuffer实例的指针,否则返回NULL。 + + ## 废弃函数说明 diff --git a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avbuffer_8h.md b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avbuffer_8h.md index 9b607560e71db9183f8d5c25e8a72738507a6eb1..595dd0d055b8f043cddc54a50f65b45c96e2d523 100644 --- a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avbuffer_8h.md +++ b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avbuffer_8h.md @@ -13,6 +13,8 @@ **相关模块:**[Core](_core.md) +**相关示例:**[AVCodec](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Media/AVCodec) + ## 汇总 diff --git a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avbuffer__info_8h.md b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avbuffer__info_8h.md index 320be5a589a6fa8b5f581feaaec60a503d5ce403..0ac5d346c11702d077e16146554a341aa88c1bc0 100644 --- a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avbuffer__info_8h.md +++ b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avbuffer__info_8h.md @@ -13,6 +13,8 @@ **相关模块:**[Core](_core.md) +**相关示例:**[AVCodec](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Media/AVCodec) + ## 汇总 diff --git a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcapability_8h.md b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcapability_8h.md index 6437ba22fa2c1f747917a5be3aa40db813d4214a..fdb7952d8a9ef8e4a2db8ace4f214c379bd9214b 100644 --- a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcapability_8h.md +++ b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcapability_8h.md @@ -11,6 +11,8 @@ **相关模块:**[AVCapability](_a_v_capability.md) +**相关示例:**[AVCodec](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Media/AVCodec) + ## 汇总 diff --git a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcodec__base_8h.md b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcodec__base_8h.md index 053d86a6500926a0176f3f154c1a400f48602ac8..d3d6892ec6c7bf78ee97706de0fbe78c11e69142 100644 --- a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcodec__base_8h.md +++ b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcodec__base_8h.md @@ -11,6 +11,8 @@ **相关模块:**[CodecBase](_codec_base.md) +**相关示例:**[AVCodec](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Media/AVCodec) + ## 汇总 @@ -187,6 +189,7 @@ | const char \* [OH_MD_KEY_VIDEO_PIC_WIDTH](_codec_base.md#oh_md_key_video_pic_width) | 描述视频帧真实宽度的键,值类型为int32_t。 | | const char \* [OH_MD_KEY_VIDEO_PIC_HEIGHT](_codec_base.md#oh_md_key_video_pic_height) | 描述视频帧真实高度的键,值类型为int32_t。 | | const char \* [OH_MD_KEY_VIDEO_ENABLE_LOW_LATENCY](_codec_base.md#oh_md_key_video_enable_low_latency) | 使能低时延视频编解码的键,值类型为int32_t,1表示使能,0表示其它情况。 | +| const char \* [OH_MD_KEY_ENABLE_SYNC_MODE](_codec_base.md#oh_md_key_enable_sync_mode) | 使能视频编解码同步模式的键,值类型为int32_t,1表示使能,0表示其它情况。该键是可选,在Configure阶段使用。 | | const char \* [OH_MD_KEY_VIDEO_ENCODER_QP_MAX](_codec_base.md#oh_md_key_video_encoder_qp_max) | 描述视频编码器允许的最大量化参数的键,值类型为int32_t。 | | const char \* [OH_MD_KEY_VIDEO_ENCODER_QP_MIN](_codec_base.md#oh_md_key_video_encoder_qp_min) | 描述视频编码器允许的最小量化参数的键,值类型为int32_t。 | | const char \* [OH_MD_KEY_VIDEO_ENCODER_QP_AVERAGE](_codec_base.md#oh_md_key_video_encoder_qp_average) | 描述视频帧平均量化参数的键,值类型为int32_t。 | diff --git a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcodec__videodecoder_8h.md b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcodec__videodecoder_8h.md index 04c498b3082934e463a268fe87c9c8f5788c33a0..9b90006f50d7a747d97202e59052f526f8093d2c 100644 --- a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcodec__videodecoder_8h.md +++ b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcodec__videodecoder_8h.md @@ -11,6 +11,7 @@ **相关模块:**[VideoDecoder](_video_decoder.md) +**相关示例:**[AVCodec](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Media/AVCodec) ## 汇总 @@ -41,4 +42,8 @@ | [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoDecoder_RenderOutputBufferAtTime](_video_decoder.md#oh_videodecoder_renderoutputbufferattime) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index, int64_t renderTimestampNs) | 将处理后的带渲染时间戳的输出缓冲返回给解码器,并通知解码器完成在输出surface上渲染,输出缓冲包含解码数据。 | | [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoDecoder_FreeOutputBuffer](_video_decoder.md#oh_videodecoder_freeoutputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index) | 将处理后的输出缓冲区返回到解码器。 | | [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoDecoder_IsValid](_video_decoder.md#oh_videodecoder_isvalid) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, bool \*isValid) | 检查当前解码实例是否有效。 | -| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoDecoder_SetDecryptionConfig](_video_decoder.md#oh_videodecoder_setdecryptionconfig) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, MediaKeySession \*mediaKeySession, bool secureVideoPath) | 设置解密配置。 | +| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoDecoder_SetDecryptionConfig](_video_decoder.md#oh_videodecoder_setdecryptionconfig) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, MediaKeySession \*mediaKeySession, bool secureVideoPath) | 设置解密配置。 | +| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoDecoder_QueryInputBuffer](_video_decoder.md#oh_videodecoder_queryinputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t *index, int64_t timeoutUs) | 查询下一个可用输入缓冲区的索引。 | +| [OH_AVBuffer](_core.md#oh_avbuffer) [OH_VideoDecoder_GetInputBuffer](_video_decoder.md#oh_videodecoder_getinputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index) | 获取可用输入缓冲区的实例。 | +| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoDecoder_QueryOutputBuffer](_video_decoder.md#oh_videodecoder_queryoutputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t *index, int64_t timeoutUs) | 查询下一个可用输出缓冲区的索引。 | +| [OH_AVBuffer](_core.md#oh_avbuffer) [OH_VideoDecoder_GetOutputBuffer](_video_decoder.md#oh_videodecoder_getoutputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index) | 获取可用输出缓冲区的实例。 | diff --git a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcodec__videoencoder_8h.md b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcodec__videoencoder_8h.md index dc716d029a6428d028a543b3fcddbd95646843a9..997910caa408def0fd750de0c19a4e65a4c933d2 100644 --- a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcodec__videoencoder_8h.md +++ b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avcodec__videoencoder_8h.md @@ -11,6 +11,8 @@ **相关模块:**[VideoEncoder](_video_encoder.md) +**相关示例:**[AVCodec](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Media/AVCodec) + ## 汇总 @@ -56,4 +58,8 @@ | [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_PushInputParameter](_video_encoder.md#oh_videoencoder_pushinputparameter) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index) | 将填入数据的输入参数缓冲区提交给视频编码器。 | | [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_FreeOutputBuffer](_video_encoder.md#oh_videoencoder_freeoutputbuffer) (OH_AVCodec \*codec, uint32_t index) | 将处理后的输出缓冲区返回给编码器。 | | [OH_AVFormat](_core.md#oh_avformat) \* [OH_VideoEncoder_GetInputDescription](_video_encoder.md#oh_videoencoder_getinputdescription) (OH_AVCodec \*codec) | 获取视频编码器接收的描述信息。 | -| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_IsValid](_video_encoder.md#oh_videoencoder_isvalid) (OH_AVCodec \*codec, bool \*isValid) | 检查当前编码实例是否有效。 | +| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_IsValid](_video_encoder.md#oh_videoencoder_isvalid) (OH_AVCodec \*codec, bool \*isValid) | 检查当前编码实例是否有效。 | +| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_QueryInputBuffer](_video_encoder.md#oh_videoencoder_queryinputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t *index, int64_t timeoutUs) | 查询下一个可用输入缓冲区的索引。 | +| [OH_AVBuffer](_core.md#oh_avbuffer) [OH_VideoEncoder_GetInputBuffer](_video_encoder.md#oh_videoencoder_getinputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index) | 获取可用输入缓冲区的实例。 | +| [OH_AVErrCode](_core.md#oh_averrcode) [OH_VideoEncoder_QueryOutputBuffer](_video_encoder.md#oh_videoencoder_queryoutputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t *index, int64_t timeoutUs) | 查询下一个可用输出缓冲区的索引。 | +| [OH_AVBuffer](_core.md#oh_avbuffer) [OH_VideoEncoder_GetOutputBuffer](_video_encoder.md#oh_videoencoder_getoutputbuffer) ([OH_AVCodec](_codec_base.md#oh_avcodec) \*codec, uint32_t index) | 获取可用输出缓冲区的实例。 | diff --git a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avdemuxer_8h.md b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avdemuxer_8h.md index 56ffbf9ed0118e687d332b5a3ec49a0f63d57efa..90ab8d086fab1a57fc8e1285930d3a7a178f2cc9 100644 --- a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avdemuxer_8h.md +++ b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avdemuxer_8h.md @@ -11,6 +11,8 @@ **相关模块:**[AVDemuxer](_a_v_demuxer.md) +**相关示例:**[AVCodec](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Media/AVCodec) + ## 汇总 diff --git a/zh-cn/application-dev/reference/apis-avcodec-kit/native__averrors_8h.md b/zh-cn/application-dev/reference/apis-avcodec-kit/native__averrors_8h.md index 09bf18d1705199f3567f251ff8b43fc536872500..7cfb60962e6659c191e31856e1a47443be75b4a6 100644 --- a/zh-cn/application-dev/reference/apis-avcodec-kit/native__averrors_8h.md +++ b/zh-cn/application-dev/reference/apis-avcodec-kit/native__averrors_8h.md @@ -28,4 +28,4 @@ | 名称 | 描述 | | -------- | -------- | -| [OH_AVErrCode](_core.md#oh_averrcode-1) {
AV_ERR_OK = 0,
AV_ERR_NO_MEMORY = 1,
AV_ERR_OPERATE_NOT_PERMIT = 2,
AV_ERR_INVALID_VAL = 3,
AV_ERR_IO = 4,
AV_ERR_TIMEOUT = 5,
AV_ERR_UNKNOWN = 6,
AV_ERR_SERVICE_DIED = 7,
AV_ERR_INVALID_STATE = 8,
AV_ERR_UNSUPPORT = 9,
AV_ERR_UNSUPPORTED_FORMAT = 11,
AV_ERR_EXTEND_START = 100,
AV_ERR_DRM_BASE = 200,
AV_ERR_DRM_DECRYPT_FAILED = 201,
AV_ERR_VIDEO_BASE = 300,
AV_ERR_VIDEO_UNSUPPORTED_COLOR_SPACE_CONVERSION = 301
} | 媒体系统错误码。 | \ No newline at end of file +| [OH_AVErrCode](_core.md#oh_averrcode-1) {
AV_ERR_OK = 0,
AV_ERR_NO_MEMORY = 1,
AV_ERR_OPERATE_NOT_PERMIT = 2,
AV_ERR_INVALID_VAL = 3,
AV_ERR_IO = 4,
AV_ERR_TIMEOUT = 5,
AV_ERR_UNKNOWN = 6,
AV_ERR_SERVICE_DIED = 7,
AV_ERR_INVALID_STATE = 8,
AV_ERR_UNSUPPORT = 9,
AV_ERR_UNSUPPORTED_FORMAT = 11,
AV_ERR_EXTEND_START = 100,
AV_ERR_DRM_BASE = 200,
AV_ERR_DRM_DECRYPT_FAILED = 201,
AV_ERR_VIDEO_BASE = 300,
AV_ERR_VIDEO_UNSUPPORTED_COLOR_SPACE_CONVERSION = 301,
AV_ERR_STREAM_CHANGED = 5410005,
AV_ERR_TRY_AGAIN_LATER = 5410006
} | 媒体系统错误码。 | \ No newline at end of file diff --git a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avformat_8h.md b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avformat_8h.md index 6f922442a2811b6467f46cfa837114c0eb218dac..430bd89bd42614a521e1c30acac62cb22ea33868 100644 --- a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avformat_8h.md +++ b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avformat_8h.md @@ -13,6 +13,8 @@ **相关模块:**[Core](_core.md) +**相关示例:**[AVCodec](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Media/AVCodec) + ## 汇总 diff --git a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avsource_8h.md b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avsource_8h.md index 60c3907779bc56a1f4a4e07286e582d9b5f386c9..61c0bfa2eea68c91458e69dc7831481a0dcc22e1 100644 --- a/zh-cn/application-dev/reference/apis-avcodec-kit/native__avsource_8h.md +++ b/zh-cn/application-dev/reference/apis-avcodec-kit/native__avsource_8h.md @@ -11,6 +11,8 @@ **相关模块:**[AVSource](_a_v_source.md) +**相关示例:**[AVCodec](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Media/AVCodec) + ## 汇总 diff --git a/zh-cn/application-dev/website.md b/zh-cn/application-dev/website.md index eaf0037df4ade0b4d93da90988dd2f1bd92b5bc2..d3b687deb6c8171898bc48c779830382ef257625 100644 --- a/zh-cn/application-dev/website.md +++ b/zh-cn/application-dev/website.md @@ -1519,6 +1519,7 @@ - [典型场景的视频编码配置](media/avcodec/video-encoding-configuration-typical-scenarios.md) - [ROI视频编码](media/avcodec/video-encoding-ROI.md) - [视频解码](media/avcodec/video-decoding.md) + - [视频解码同步模式](synchronous-video-decoding.md) - [创建视频解码器和NativeWindow初始化并行](media/avcodec/parallel-decoding-nativeWindow.md) - [视频可变帧率](media/avcodec/video-variable-refreshrate.md) - 媒体数据封装与解析