未验证 提交 b8b10c73 编写于 作者: O openharmony_ci 提交者: Gitee

!20954 补充视频编解码接口调用流程

Merge pull request !20954 from 杨小雨/master
...@@ -14,22 +14,23 @@ ...@@ -14,22 +14,23 @@
## 开发步骤 ## 开发步骤
详细的API说明请参考[API文档](../reference/native-apis/_video_decoder.md) 详细的API说明请参考[API文档](../reference/native-apis/_video_decoder.md)
如下为视频解码调用关系图:
![Invoking relationship of video decode stream](figures/video-decode.png)
1. 创建编解码器实例对象。 1. 创建编解码器实例对象。
应用可以通过名称或媒体类型创建解码器。 应用可以通过名称或媒体类型创建解码器。
``` c++ ``` c++
// 通过 codecname 创建解码器 // 通过 codecname 创建解码器, 应用有特殊需求,比如选择支持某种分辨率规格的解码器,可先查询capability,再根据codec name创建解码器。
OH_AVCapability *capability = OH_AVCodec_GetCapability(OH_AVCODEC_MIMETYPE_VIDEO_AVC, false); OH_AVCapability *capability = OH_AVCodec_GetCapability(OH_AVCODEC_MIMETYPE_VIDEO_AVC, false);
const char *name = OH_AVCapability_GetName(capability); const char *name = OH_AVCapability_GetName(capability);
OH_AVCodec *videoDec = OH_VideoDecoder_CreateByName(name); // name:"OH.Media.Codec.Decoder.Video.AVC" OH_AVCodec *videoDec = OH_VideoDecoder_CreateByName(name);
``` ```
```c++ ```c++
// 通过 mimetype 创建解码器 // 通过 mimetype 创建解码器
// 软/硬解: 创建 H264 解码器 // 软/硬解: 创建 H264 解码器,存在多个可选解码器时,系统会创建最合适的解码器
OH_AVCodec *videoDec = OH_VideoDecoder_CreateByMime(OH_AVCODEC_MIMETYPE_VIDEO_AVC); OH_AVCodec *videoDec = OH_VideoDecoder_CreateByMime(OH_AVCODEC_MIMETYPE_VIDEO_AVC);
// 通过 mimetype 创建解码器
// 硬解: 创建 H265 解码器 // 硬解: 创建 H265 解码器
OH_AVCodec *videoDec = OH_VideoDecoder_CreateByMime(OH_AVCODEC_MIMETYPE_VIDEO_HEVC); OH_AVCodec *videoDec = OH_VideoDecoder_CreateByMime(OH_AVCODEC_MIMETYPE_VIDEO_HEVC);
``` ```
...@@ -62,22 +63,24 @@ ...@@ -62,22 +63,24 @@
开发者可以通过处理该回调报告的信息,确保解码器正常运转。 开发者可以通过处理该回调报告的信息,确保解码器正常运转。
``` c++ ``` c++
// 解码异常回调 // 解码异常回调OH_AVCodecOnError实现
static void OnError(OH_AVCodec *codec, int32_t errorCode, void *userData) static void OnError(OH_AVCodec *codec, int32_t errorCode, void *userData)
{ {
(void)codec; (void)codec;
(void)errorCode; (void)errorCode;
(void)userData; (void)userData;
} }
// 解码码流变化回调
static void OnOutputFormatChanged(OH_AVCodec *codec, OH_AVFormat *format, void *userData) // 解码数据流变化回调OH_AVCodecOnStreamChanged实现
static void OnStreamChanged(OH_AVCodec *codec, OH_AVFormat *format, void *userData)
{ {
(void)codec; (void)codec;
(void)format; (void)format;
(void)userData; (void)userData;
} }
// 解码输入回调获取输入帧信息
static void OnInputBufferAvailable(OH_AVCodec *codec, uint32_t index, OH_AVMemory *data, void *userData) // 解码输入回调OH_AVCodecOnNeedInputData实现
static void OnNeedInputData(OH_AVCodec *codec, uint32_t index, OH_AVMemory *data, void *userData)
{ {
(void)codec; (void)codec;
VDecSignal *signal_ = static_cast<VDecSignal *>(userData); VDecSignal *signal_ = static_cast<VDecSignal *>(userData);
...@@ -88,8 +91,9 @@ ...@@ -88,8 +91,9 @@
signal_->inBufferQueue_.push(data); signal_->inBufferQueue_.push(data);
signal_->inCond_.notify_all(); signal_->inCond_.notify_all();
} }
// 解码输出回调获取输出帧信息
static void OnOutputBufferAvailable(OH_AVCodec *codec, uint32_t index, OH_AVMemory *data, OH_AVCodecBufferAttr *attr, // 解码输出回调OH_AVCodecOnNewOutputData实现
static void OnNeedOutputData(OH_AVCodec *codec, uint32_t index, OH_AVMemory *data, OH_AVCodecBufferAttr *attr,
void *userData) void *userData)
{ {
(void)codec; (void)codec;
...@@ -102,7 +106,7 @@ ...@@ -102,7 +106,7 @@
signal_->attrQueue_.push(*attr); signal_->attrQueue_.push(*attr);
signal_->outCond_.notify_all(); signal_->outCond_.notify_all();
} }
OH_AVCodecAsyncCallback cb = {&OnError, &OnOutputFormatChanged, &OnInputBufferAvailable, &OnOutputBufferAvailable}; OH_AVCodecAsyncCallback cb = {&OnError, &OnStreamChanged, &OnNeedInputData, &OnNeedOutputData};
// 配置异步回调 // 配置异步回调
int32_t ret = OH_VideoDecoder_SetCallback(videoDec, cb, signal_); int32_t ret = OH_VideoDecoder_SetCallback(videoDec, cb, signal_);
``` ```
...@@ -177,7 +181,7 @@ ...@@ -177,7 +181,7 @@
``` c++ ``` c++
// 配置 buffer info 信息 // 配置 buffer info 信息
OH_AVCodecBufferAttr info; OH_AVCodecBufferAttr info;
// 调用 Ffmpeg 接口 av_packet_alloc 进行初始化并返回一个容器 pkt // 调用 FFmpeg 接口 av_packet_alloc 进行初始化并返回一个容器 pkt
AVPacket pkt = av_packet_alloc(); AVPacket pkt = av_packet_alloc();
// 配置 info 的输入尺寸、偏移量、时间戳等字段信息 // 配置 info 的输入尺寸、偏移量、时间戳等字段信息
info.size = pkt->size; info.size = pkt->size;
......
...@@ -28,6 +28,8 @@ Buffer输入是指一块内存区域,一般为字节数组或指向内存的 ...@@ -28,6 +28,8 @@ Buffer输入是指一块内存区域,一般为字节数组或指向内存的
## 开发步骤 ## 开发步骤
详细的API说明请参考[API文档](../reference/native-apis/_video_encoder.md) 详细的API说明请参考[API文档](../reference/native-apis/_video_encoder.md)
如下为视频编码调用关系图:
![Invoking relationship of video encode stream](figures/video-encode.png)
### Buffer模式 ### Buffer模式
...@@ -66,7 +68,7 @@ Buffer输入是指一块内存区域,一般为字节数组或指向内存的 ...@@ -66,7 +68,7 @@ Buffer输入是指一块内存区域,一般为字节数组或指向内存的
开发者可以通过处理该回调报告的信息,确保编码器正常运转。 开发者可以通过处理该回调报告的信息,确保编码器正常运转。
``` c++ ``` c++
// 设置 OnError 回调函数 // 编码异常回调OH_AVCodecOnError实现
static void OnError(OH_AVCodec *codec, int32_t errorCode, void *userData) static void OnError(OH_AVCodec *codec, int32_t errorCode, void *userData)
{ {
(void)codec; (void)codec;
...@@ -74,7 +76,7 @@ Buffer输入是指一块内存区域,一般为字节数组或指向内存的 ...@@ -74,7 +76,7 @@ Buffer输入是指一块内存区域,一般为字节数组或指向内存的
(void)userData; (void)userData;
} }
// 设置 OnStreamChanged 回调函数 // 编码数据流变化回调OH_AVCodecOnStreamChanged实现
static void OnStreamChanged(OH_AVCodec *codec, OH_AVFormat *format, void *userData) static void OnStreamChanged(OH_AVCodec *codec, OH_AVFormat *format, void *userData)
{ {
(void)codec; (void)codec;
...@@ -82,7 +84,7 @@ Buffer输入是指一块内存区域,一般为字节数组或指向内存的 ...@@ -82,7 +84,7 @@ Buffer输入是指一块内存区域,一般为字节数组或指向内存的
(void)userData; (void)userData;
} }
// 设置 OnNeedInputData 回调函数,编码输入帧送入数据队列 // 编码输入回调OH_AVCodecOnNeedInputData实现
static void OnNeedInputData(OH_AVCodec *codec, uint32_t index, OH_AVMemory *mem, void *userData) static void OnNeedInputData(OH_AVCodec *codec, uint32_t index, OH_AVMemory *mem, void *userData)
{ {
(void)userData; (void)userData;
...@@ -92,8 +94,8 @@ Buffer输入是指一块内存区域,一般为字节数组或指向内存的 ...@@ -92,8 +94,8 @@ Buffer输入是指一块内存区域,一般为字节数组或指向内存的
// 7. 写入编码码流 // 7. 写入编码码流
// 8. 通知编码器码流结束 // 8. 通知编码器码流结束
} }
// 设置 OnNeedOutputData 回调函数,编码完成帧送入输出队列 // 编码输出回调OH_AVCodecOnNewOutputData实现
static void OnNeedOutputData(OH_AVCodec *codec, uint32_t index, OH_AVMemory *mem, static void OnNeedOutputData(OH_AVCodec *codec, uint32_t index, OH_AVMemory *mem,
OH_AVCodecBufferAttr *attr, void *userData) OH_AVCodecBufferAttr *attr, void *userData)
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册