Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
b8b10c73
D
Docs
项目概览
OpenHarmony
/
Docs
1 年多 前同步成功
通知
159
Star
292
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
b8b10c73
编写于
7月 17, 2023
作者:
O
openharmony_ci
提交者:
Gitee
7月 17, 2023
浏览文件
操作
浏览文件
下载
差异文件
!20954 补充视频编解码接口调用流程
Merge pull request !20954 from 杨小雨/master
上级
353e43d5
9643b184
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
24 addition
and
18 deletion
+24
-18
zh-cn/application-dev/media/figures/video-decode.png
zh-cn/application-dev/media/figures/video-decode.png
+0
-0
zh-cn/application-dev/media/figures/video-encode.png
zh-cn/application-dev/media/figures/video-encode.png
+0
-0
zh-cn/application-dev/media/video-decoding.md
zh-cn/application-dev/media/video-decoding.md
+17
-13
zh-cn/application-dev/media/video-encoding.md
zh-cn/application-dev/media/video-encoding.md
+7
-5
未找到文件。
zh-cn/application-dev/media/figures/video-decode.png
0 → 100644
浏览文件 @
b8b10c73
212.3 KB
zh-cn/application-dev/media/figures/video-encode.png
0 → 100644
浏览文件 @
b8b10c73
220.5 KB
zh-cn/application-dev/media/video-decoding.md
浏览文件 @
b8b10c73
...
@@ -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
,
&
On
OutputFormatChanged
,
&
OnInputBufferAvailable
,
&
OnOutputBufferAvailable
};
OH_AVCodecAsyncCallback
cb
=
{
&
OnError
,
&
On
StreamChanged
,
&
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
;
// 调用 F
f
mpeg 接口 av_packet_alloc 进行初始化并返回一个容器 pkt
// 调用 F
F
mpeg 接口 av_packet_alloc 进行初始化并返回一个容器 pkt
AVPacket
pkt
=
av_packet_alloc
();
AVPacket
pkt
=
av_packet_alloc
();
// 配置 info 的输入尺寸、偏移量、时间戳等字段信息
// 配置 info 的输入尺寸、偏移量、时间戳等字段信息
info
.
size
=
pkt
->
size
;
info
.
size
=
pkt
->
size
;
...
...
zh-cn/application-dev/media/video-encoding.md
浏览文件 @
b8b10c73
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录