本手册镜像地址:https://gitee.com/LinkPi/LinkLib/wikis/pages
灵派海思SDK的API参考手册
- 1. 概述
- 基本接口详解
- 快速开始
- 模块文档说明
- 关于board.json
- 输入输出
- LinkInputAi
- LinkOutputAo
- LinkInputVi
- LinkOuputVo
- LinkInputNet
- LinkInputRtsp
- LinkInputFile
- LinkInputImage
- LinkInputV4l2
- LinkDevice
- LinkGPIO
- LinkInputAlsa
- LinkInputIsp
- 编解码
- 流处理
- 音视频处理
- LinkAdjustV
- LinkAEC
- LinkAecDelay
- LinkAVS
- LinkBeautify
- LinkBlend
- LinkColorKey
- LinkCrop
- LinkDeinterlace
- LinkGain
- LinkMixA
- LinkMixV
- LinkOverlay
- LinkResample
- LinkSAVS
- LinkVad
- LinkVolume
- 智能视觉
1. 概述
LinkSDK 是一个基于海思平台的快速开发工具,致力于降低嵌入式音视频产品的开发门槛,缩短产品研发周期,增强产品扩展性与灵活性,提升产品稳定性。LinkSDK的设计灵感来自于Gstreamer,只要按照业务流程将模块与模块依次连接起来,并配置各个模块的少量参数即可。即使是没有嵌入式开发经验的软件人员,甚至是web前端开发者,都可以使用LinkSDK开发出成熟的音视频产品。LinkSDK包含以下几个部分:
LinkLib 是LinkSDK的核心运行库,基于Qt开发,针对多款海思方案进行了适配,包含了大量常用外围芯片的驱动程序。除了基本的音视频输入输出编码解码等模块外,还包括流媒体传输、多格式录制、多画面导播、图像调优、特效叠加、美颜、音频降噪等。C++程序员可以直接基于此开发产品,LinkLib支持继承扩展,提供了最大的开发灵活性的同时,极大的减少了开发的代码量。以最基本的视频采集编码这个功能为例,使用海思原厂SDK需要3000行以上的代码量,而使用LinkLib的代码如下:
Link::init();
LinkObject *vi=Link::create("InputVi");
QVariantMap dataVi;
dataVi["interface"]="HDMI-A";
vi->start(dataVi);
LinkObject *encv=Link::create("EncodeV");
encv->start();
vi->linkV(encv);
开发者在开发过程中并不需要掌握驱动原理以及板卡的资源配置,上例中我们只需要告知视频从第几个接口输入,并与编码模块连接即可。当然,还可以通过对模块进行参数配置来满足实际中不同的需求,可以通过【快速开始】了解,并详细阅读各模块文档。
LinkLib内部包含线程池管理功能,能够按照功能与协作关系自动分配模块的运行线程。
基本接口详解
本节内容
LinkObject
LinkLib的全部模块均以LinkObject为基类,公共接口如下:
bool setData(QVariantMap data);
const QVariantMap getData();
bool start();
bool start(QVariantMap data);
bool stop(bool block=false);
void destroy();
QString name();
LinkObject* linkA(LinkObject* dst);
LinkObject* linkV(LinkObject* dst);
LinkObject* unLinkA(LinkObject* dst);
LinkObject* unLinkV(LinkObject* dst);
QVariant invoke(QString func, QVariant value=QVariant());
各接口功能如下:
bool setData(QVariantMap data)
- 接口功能:设定模块的参数。
- data:模块参数,具体详见各模块的说明。
- 返回值:成功-
true
;失败-false
。 - 注意事项:该接口通常在模块
start
之前调用。大部分模块支持热更新,因此也可以在start
之后随时通过该接口更新模块参数。接口内部会自动比对输入值与当前值,重复无变化的输入参数不会引起模块的更新操作。模块的大部分参数拥有默认值,可以不设定。
const QVariantMap getData()
- 接口功能:获取模块的参数。
- 返回值:模块参数。
- 注意事项:除了用户设定的参数,部分模块的运行状态可以通过该接口查询。该接口同步运行,需要在
start
之后调用。
bool start()
- 接口功能:运行模块。
- 返回值:成功-
true
;失败-false
。 - 注意事项:该接口为异步接口,返回
true
并不代表模块内部工作正常,模块内部的状态可以通过invoke
或getData
查询。
bool start(QVariantMap data)
- 接口功能:运行模块并设定模块参数。
- 返回值:成功-
true
;失败-false
。 - 注意事项:内部的顺序为先
setData
,后start
。
bool stop(bool block=false)
- 接口功能:停止模块。
- block:是否阻塞运行。
- 返回值:成功-
true
;失败-false
。 - 注意事项:非阻塞运行时,该模块为异步运行。
void destroy()
- 接口功能:销毁模块。
- 注意事项:调用该接口后,模块会在线程消息循环结束后自动释放全部资源,不应该也没有必要使用
delete
来释放LinkObject
对象。
QString name()
- 接口功能:获取实例名。
- 返回值:实例名,该名称在调用
Link::create
方法时由系统分配或由用户指定。
LinkObject* linkA(LinkObject* dst)
- 接口功能:连接音频数据流。
- dst:连接目标,数据由
this
流向dst。 - 返回值:dst,用于串联。
- 注意事项:
linkA
、linkV
接口与start
接口并无先后要求,习惯上start
在先,但是例如Mux模块,当用于录制文件时,start
通常在link
之后被调用。
LinkObject* linkV(LinkObject* dst)
- 接口功能:连接视频数据流。
- dst:连接目标,数据由
this
流向dst。 - 返回值:dst,用于串联。
- 注意事项:同
LinkA
。
LinkObject* linkE(LinkObject* dst)
- 接口功能:连接事件信息流,常见于SVP相关模块。
- dst:连接目标,数据由
this
流向dst。 - 返回值:dst,用于串联。
- 注意事项:同
LinkA
。
LinkObject* unLinkA(LinkObject* dst)
- 接口功能:断开音频数据流。
- dst:连接目标,数据由
this
流向dst。 - 返回值:dst,用于串联。
LinkObject* unLinkV(LinkObject* dst)
- 接口功能:断开视频数据流。
- dst:连接目标,数据由
this
流向dst。 - 返回值:dst,用于串联。
LinkObject* unLinkV(LinkObject* dst)
- 接口功能:断开事件信息流。
- dst:连接目标,数据由
this
流向dst。 - 返回值:dst,用于串联。
QVariant invoke(QString func, QVariant value=QVariant())
- 接口功能:调用模块内部方法。
- func:方法名,详见各模块说明。
- value: 入参,可以不填。
- 返回值:模块方法返回值。
- 注意事项:该接口同步运行,需要在
start
之后调用。
Link
Link类是一个静态方法类,包含了LinkLib需要的一些重要函数和辅助函数。
static bool init(bool sys=true);
static LinkObject* create(QString className, QString name="");
static LinkObject* find(QString name);
static bool setConfig(QString path);
static QVariantMap getConfig();
static QVariant o2v(LinkObject *obj);
static LinkObject* v2o(QVariant var);
各函数功能如下:
bool init(bool sys=true)
- 接口功能:LinkLib初始化。
- sys:是否初始化海思mpp系统。
- 返回值:成功-
true
;失败-false
。 - 注意事项:改函数必须在程序的最开始被调用,如果有两个进程同时使用LinkLib,后启动的那个需要将sys设为
false
,否则mpp系统会重置,导致先启动的进程异常。
LinkObject* create(QString className, QString name="")
- 接口功能:创建LinkLib模块。
- className:模块名称。
- name:实例名称。
- 返回值:模块实例指针,当模块不存在时返回
NULL
。 - 注意事项:当name为空时,系统会自动以"模块名_序号"的形式命名实例。为保证实例名不冲突,为两个实例指定相同的name时,后创建的实例将以"name_序号"的形式命名。所有的模块名均以Link开头,因此当调用该方法时,可以省略Link前缀,例如LinkEncodeV模块,创建时仅需
Link::create("EncodeV")
即可。
LinkObject* find(QString name)
- 接口功能:寻找指定名称的实例。
- name:实例名称。
- 返回值:返回实例指针或
NULL
。
bool setConfig(QString path)
- 接口功能:设置板卡配置。
- path:配置文件路径。
- 返回值:成功-
true
;失败-false
。 - 注意事项:通常不需要调用该函数,在调用
init
函数时,系统会读取默认板卡配置文件,保存在相应的文件系统中。
QVariantMap getConfig()
- 接口功能:获取板卡配置。
- 返回值:板卡配置。
Json
Json类是一个静态方法类,将qt5提供的json函数进行封装,更易于配合LinkLib使用,包含的函数如下:
static QString encode(QVariant data);
static QVariant decode(const QString &jsonStr);
static QVariant loadFile(QString path);
static bool saveFile(QVariant data, QString path);
各函数功能如下:
QString encode(QVariant data)
- 接口功能:将
Qvariant
编码成json格式的字符串。 - data:json数据。
- 返回值:json字符串。
QVariant decode(const QString &jsonStr)
- 接口功能:将json字符串解码成
Qvariant
对象。 - jsonStr:json字符串。
- 返回值:json数据。
QVariant loadFile(QString path)
- 接口功能:读取json文件并解码为
Qvariant
对象。 - path:json文件路径。
- 返回值:json数据。
bool saveFile(QVariant data, QString path)
- 接口功能:将json数据保存在指定的文件中。
- data:json数据。
- path:json文件路径。
- 返回值:成功-
true
;失败-false
。
快速开始
创建工程
首先建议您使用LinkPi官方提供的虚拟机环境进行开发,参考虚拟机使用说明。
新建一个Qt工程,选择相应版本的Kit,以3531A为例,交叉工具链为v300,因此选择Qt Kit H3。
在.pro文件中增加以下代码
chip = HI3531A
include(/home/zc/LinkLib/Link.pri)
其中chip
为您的开发平台核心板上的型号
编写代码
在【概述】的示例代码中,我们实现了基本的视频编码,在这里我们将功能升级为音视频同时采集并编码,最终推流,达到一个直播的效果,代码如下:
#include <QCoreApplication>
#include "Link.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Link::init();
LinkObject *vi=Link::create("InputVi");
QVariantMap dataVi;
dataVi["interface"]="HDMI-A";
vi->start(dataVi);
LinkObject *ai=Link::create("InputAi");
QVariantMap dataAi;
dataAi["interface"]="HDMI-A";
ai->start(dataAi);
LinkObject *encv=Link::create("EncodeV");
QVariantMap dataEncV;
dataEncV["codec"]="h264";
dataEncV["bitrate"]=2000;
dataEncV["width"]=1280;
dataEncV["height"]=720;
encv->start(dataEncV);
LinkObject *enca=Link::create("EncodeA");
QVariantMap dataEncA;
dataEncA["codec"]="aac";
dataEncA["bitrate"]=128000;
dataEncA["samplerate"]=48000;;
enca->start(dataEncA);
LinkObject *mux=Link::create("Mux");
QVariantMap dataMux;
dataMux["path"]="rtmp://127.0.0.1/live/test";
mux->start(dataMux);
vi->linkV(encv)->linkV(mux);
ai->linkA(enca)->linkA(mux);
return a.exec();
}
该示例主要分以下几个步骤:
- 初始化
Link::init();
- 创建实例,如
LinkObject *vi=Link::create("InputVi");
- 设定参数并运行实例,如
QVariantMap dataVi;
dataVi["interface"]="HDMI-A";
vi->start(dataVi);
当然也可以拆分成两步来写,例
QVariantMap dataVi;
dataVi["interface"]="HDMI-A";
vi->setData(dataVi);
vi->start();
- 连接数据流,如
vi->linkV(encv)->linkV(mux);
进阶
LinkLib 除了内部包含的模块外,您还可以通过继承派生的方式创建属于你自己的模块,参考Demo:DIY。
LinkSDK 解决是底层业务问题,上层业务逻辑依然是一个产品最重要的部分,因此,除了详细阅读本文档以外,为了发挥LinkLib的最大能力需要您更深入的学习Qt开发,借助Qt强大的开发能力,一定可以轻松快速的搭建出成熟的产品。
模块文档说明
- 数据接口表说明
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✖️ | - | - |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | VPSS | ✔️ |
上表中"Audio In"表示该模块可以接收其他模块的音频数据,即可以作为
A->LinkA(B)
中的B
。
以此类推,"Video Out"表示该模块可以输出视频数据给其他模块,即可以作为A->LinkV(B)
中的A
。
多重连接表示该模块是否支持同时接收多个其他模块的数据,或者同时输出多份数据给多个其他模块。
例如上表引用自LinkInputVi模块,其中"Video Out"接口可多重连接,则该模块可以支持如下操作。
LinkObject *vi=Link::create("InputVi");
LinkObject *enc1=Link::create("EncodeV");
LinkObject *enc2=Link::create("EncodeV");
vi->linkV(enc1);
vi->linkV(enc2);
- 模块公共参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
memSize | Int | 0 | 缓冲区大小,单位byte | ✖️ |
bufLenA | Int | 20 | 音频缓冲队列长度 | ✔️ |
bufLenV | Int | 20 | 视频缓冲队列长度 | ✔️ |
- 模块方法
模块方法通过LinkObject::invoke
方法调用
- 模块事件
模块事件通过连接信号LinkObject::newEvent(QString type, QVariant msg)
实现,其中type
为事件类型,msg
为携带消息。
关于board.json
当您浏览到后面InputXX模块时,会发现模块参数interface,通过指定一个简单的接口名称,即可完成复杂的接口设置。
而这些设置就定义在/link/config/board.json中,例如:
{
"interfaceV":{
"HDMI-A":{"chip":"Link","name":"hdmi2","protocols":["HDMI"],"did": 2,"cid": 8,"mode": "bt1120s","dstFramerate":60},
"HDMI-B":{"chip":"Link","name":"hdmi1","protocols":["HDMI"],"did": 4,"cid": 16,"mode": "bt1120s","dstFramerate":60}
},
"interfaceA":{
"HDMI-A":{"chip":"Link","name":"hdmi2","samplerate":48000,"did": 0,"cid": 0,"chnCnt": 2, "channels": 2},
"HDMI-B":{"chip":"Link","name":"hdmi1","samplerate":48000,"did": 1,"cid": 0,"chnCnt": 2, "channels": 2},
"HDMI-OUT":{"samplerate":48000,"did": 2,"cid": 0,"channels":2, "chnCnt": 2,"mode":"i2sm"},
"Mini-In":{"chip":"tlv32","samplerate":48000,"channels":2,"did": 2,"cid": 0,"mode":"i2sm","clkSel":true, "chnCnt": 2},
"Mini-Out":{"samplerate":48000,"channels":2,"did": 0,"cid": 0,"mode":"i2sm","clkSel":true, "chnCnt": 2}
},
"videoBuffer":{
"sys":[
{"size":12441600,"cnt":16},
{"size":3110400,"cnt":40},
{"size":1382400,"cnt":20},
{"size":345600,"cnt":30}
],
"dec":[
{"size":16711680,"cnt":4},
{"size":4177920,"cnt":20}
]
},
"register":{
"0x120400A0":"0xbbbbb",
"0x1204009C":"0xbbbbb"
}
}
其中InterfaceV中定义了视频接口,interfaceA中定义了音频接口。
videoBuffer用于管理海思的mpp的vb内存分配,根据不同的应用需求来配置不同的内存块大小、数量。
register用于设置海思的寄存器,当然您也可以在启动脚本中进行寄存器设置。
输入输出
LinkInputAi
LinkInputAi模块包含了音频采集、重采样、噪声抑制、回声消除等功能。
海思平台的音频采集使用mpp系统的AI接口,该模块因此得名。
通常作为音频数据流的源端。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✖️ | - | - |
Audio Out | ✔️ | Raw | ✔️ |
Video Out | ✖️ | - | - |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
interface | String | - | 接口名称 | ✖️ |
samplerate | Int | 48000 | 采样率 | ✔️ |
resamplerate | Int | -1 | 重采样频率 | ✔️ |
mode | String | “i2ss” | 采集模式 | ✔️ |
channels | Int | 1 | 采集声道数 | ✔️ |
chnCnt | Int | 2 | 接口声道数 | ✔️ |
clkSel | Bool | true | 时钟分离 | ✔️ |
buf | Int | 5 | 系统缓冲深度 | ✔️ |
delay | Int | 0 | 音频延迟,单位ms | ✔️ |
delay2 | Int | 0 | 应用层同步缓冲数 | ✔️ |
time | Int | 0 | 单次采样时间,单位ms | ✔️ |
anr | Int | 0 | 噪声抑制强度,0/1/2 | ✔️ |
did | Int | 0 | AI设备号 | ✔️ |
cid | Int | 0 | AI通道号 | ✔️ |
cid2 | Int | 0 | AI通道号2 | ✔️ |
aecdid | Int | 0 | 回声消除设备号 | ✔️ |
aeccid | Int | 0 | 回声消除通道号 | ✔️ |
各实例的interface不可重复,同一个音频端口的InputAi实例只能创建一次,该模块支持多重连接输出,因此,如果多处需要该音频数据,多次调用该实例的
linkA
方法即可。
当定义了interface参数时,samplerate、chnCnt、did、cid等参数无需设置,通常仅需要根据应用需求调整resamplerate和channels即可。详情访问【关于board.json】
海思的anr、agc、aec都仅支持16k单声道,LinkInputAi内部会按照两路16k单声道处理,并混合为立体声,即当开启anr/agc/aec的时候,模块的输出恒定为16K立体声,可根据需要在下游连接LinkResample模块。
- 模块方法
暂无
LinkOutputAo
音频输出模块。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | Raw | ✖️ |
Video In | ✖️ | - | - |
Audio Out | ✔️ | - | - |
Video Out | ✖️ | - | - |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
interface | String | - | 接口名称 | ✖️ |
samplerate | Int | 48000 | 采样率 | ✔️ |
resamplerate | Int | -1 | 重采样频率 | ✔️ |
mode | String | “i2ss” | 采集模式 | ✔️ |
channels | Int | 1 | 采集声道数 | ✔️ |
chnCnt | Int | 2 | 接口声道数 | ✔️ |
clkSel | Bool | true | 时钟分离 | ✔️ |
buf | Int | 5 | 系统缓冲深度 | ✔️ |
time | Int | 0 | 单次采样时间,单位ms | ✔️ |
did | Int | 0 | AI设备号 | ✔️ |
cid | Int | 0 | AI通道号 | ✔️ |
- 模块方法
暂无
LinkInputVi
LinkInputVi模块包含了图像采集、帧率控制、驱动通信等功能。
海思平台的图像采集使用mpp系统的VI接口,该模块因此得名。
通常作为视频数据流的源端。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✖️ | - | - |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | VPSS | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
interface | String | - | 接口名称 | ✖️ |
pic | String | “/link/config/nosignal.yuv” | NoSignal插图地址 | ✖️ |
avalible | Bool | false | 输入源有效 | ✔️ |
width | Int | 1920 | 图像宽度 | ✔️ |
height | Int | 1080 | 图像高度 | ✔️ |
rotate | Int | 0 | 旋转角度,支持0,90,180,270 | ✔️ |
double | Bool | false | 双沿采样 | ✔️ |
mode | String | “bt1120s” | 采集模式 | ✔️ |
interlace | Bool | false | 隔行图像 | ✔️ |
srcFramerate | Int | 30 | 输入源帧率 | ✔️ |
dstFramerate | Int | 30 | 输出帧率 | ✔️ |
did | Int | 0 | VI设备号 | ✖️ |
cid | Int | 0 | VI通道号 | ✖️ |
各实例的interface不可重复,同一个视频端口的InputVi实例只能创建一次,该模块支持多重连接输出,因此,如果多处需要该图像数据,多次调用该实例的
linkV
方法即可。
当定义了interface参数时,width、height等参数则无需设定,模块内部完成驱动通信,自动设定这些参数。mode、vid、cid等参数则从board.json中提取,详情访问【关于board.json】
pic指定的NoSignal图像必须为YUV420sp格式的原始图像,1920x1080。
- 模块方法
QVariant getReport()
- 方法功能:返回驱动状态。
- 返回值:Map类型,包含avalible:bool、width:int、height:int、framerate:int、interlace:bool。
- 注意事项:仅当interface参数被定义时有效。
LinkOuputVo
LinkInputVo负责输出图像以及初始化LinuxFb系统
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✔️ | VPSS | ✖️ |
Audio Out | ✖️ | - | - |
Video Out | ✖️ | - | - |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
type | String | “hdmi” | 接口类型,可选值hdmi,vga,cvbs,多选用竖线"|"隔开 | ✔️ |
mode | Int | -1 | 图像同步模式,[0,32],对应枚举类型VO_INTF_SYNC_E,不建议使用 | ✔️ |
output | String | “1080P60” | 图像同步模式,对应枚举类型VO_INTF_SYNC_E中VO_OUTPUT_后面的内容,区分大小写 | ✔️ |
ui | Bool | false | 是否启用LinuxFb | ✔️ |
flip | Bool | false | 是否翻转图像 | ✖️ |
参数output对应海思文档中的VO_INTF_SYNC_E,每个芯片的枚举内容略有不同,3531D如下:
typedef enum hiVO_INTF_SYNC_E
{
VO_OUTPUT_PAL = 0,
VO_OUTPUT_NTSC,
VO_OUTPUT_960H_PAL, /* ITU-R BT.1302 960 x 576 at 50 Hz (interlaced)*/
VO_OUTPUT_960H_NTSC, /* ITU-R BT.1302 960 x 480 at 60 Hz (interlaced)*/
VO_OUTPUT_1080P24,
VO_OUTPUT_1080P25,
VO_OUTPUT_1080P30,
VO_OUTPUT_720P50,
VO_OUTPUT_720P60,
VO_OUTPUT_1080I50,
VO_OUTPUT_1080I60,
VO_OUTPUT_1080P50,
VO_OUTPUT_1080P60,
VO_OUTPUT_576P50,
VO_OUTPUT_480P60,
VO_OUTPUT_640x480_60, /* VESA 640 x 480 at 60 Hz (non-interlaced) CVT */
VO_OUTPUT_800x600_60, /* VESA 800 x 600 at 60 Hz (non-interlaced) */
VO_OUTPUT_1024x768_60, /* VESA 1024 x 768 at 60 Hz (non-interlaced) */
VO_OUTPUT_1280x1024_60, /* VESA 1280 x 1024 at 60 Hz (non-interlaced) */
VO_OUTPUT_1366x768_60, /* VESA 1366 x 768 at 60 Hz (non-interlaced) */
VO_OUTPUT_1440x900_60, /* VESA 1440 x 900 at 60 Hz (non-interlaced) CVT Compliant */
VO_OUTPUT_1280x800_60, /* 1280*800@60Hz VGA@60Hz*/
VO_OUTPUT_1680x1050_60, /* VESA 1680 x 1050 at 60 Hz (non-interlaced) */
VO_OUTPUT_1920x2160_30, /* 1920x2160_30 */
VO_OUTPUT_1600x1200_60, /* VESA 1600 x 1200 at 60 Hz (non-interlaced) */
VO_OUTPUT_1920x1200_60, /* VESA 1920 x 1600 at 60 Hz (non-interlaced) CVT (Reduced Blanking)*/
VO_OUTPUT_2560x1440_30, /* 2560x1440_30 */
VO_OUTPUT_2560x1440_60, /* 2560x1440_60 */
VO_OUTPUT_2560x1600_60, /* 2560x1600_60 */
VO_OUTPUT_3840x2160_25, /* 3840x2160_25 */
VO_OUTPUT_3840x2160_30, /* 3840x2160_30 */
VO_OUTPUT_3840x2160_50, /* 3840x2160_50 */
VO_OUTPUT_3840x2160_60, /* 3840x2160_60 */
VO_OUTPUT_USER,
VO_OUTPUT_BUTT
} VO_INTF_SYNC_E;
- 模块方法
QVariant getReport()
- 方法功能:返回驱动状态。
- 返回值:Map类型,包含avalible:bool、width:int、height:int、framerate:int、interlace:bool。
- 注意事项:仅当interface参数被定义时有效。
LinkInputNet
LinkInputNet模块可以接收大多数流媒体输入源的数据,并分理处音视频数据供后端模块使用。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✖️ | - | - |
Audio Out | ✔️ | PCMA/PCMU/G722/AAC/MP2 | ✔️ |
Video Out | ✔️ | H264/H265 | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
path | String | - | 网络流地址 | ✔️ |
protocol | String | “tcp” | 当path为rtsp流时,用于指定使用udp或tcp接收rtp数据 | ✖️ |
timeout | int | 5 | 超时时间,单位秒 | ✔️ |
timestampMode | String | “auto” | 时间戳修正模式:auto-自动校准;local-本地时间;source-源端时间; | ✔️ |
state | String | - | 只读,获取模块状态 | ✔️ |
buffer | Bool | true | 是否启用缓冲来抵消网络抖动 | ✔️ |
sync | Bool | false | 是否同步时间戳,保持码流数据匀速输出 | ✔️ |
目前测试了http、rtsp、rtmp、udp协议。
- 模块方法
暂无
LinkInputRtsp
LinkInputRtsp模块用于接收,rtsp协议的数据流,相比InputNet,占用系统性能更少。
如果遇到兼容性问题,建议使用InputNet。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✖️ | - | - |
Audio Out | ✔️ | PCMA/PCMU/G722/AAC/MP2 | ✔️ |
Video Out | ✔️ | H264/H265 | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
path | String | - | 网络流地址 | ✔️ |
protocol | String | “tcp” | 用于指定使用udp或tcp接收rtp数据 | ✖️ |
timeout | int | 10 | 超时时间,单位秒 | ✔️ |
- 模块方法
暂无
LinkInputFile
LinkInputFile可以将本地文件进行流式输出,兼容主流媒体格式。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✖️ | - | - |
Audio Out | ✔️ | PCMA/PCMU/G722/AAC/MP2 | ✔️ |
Video Out | ✔️ | H264/H265 | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
path | String | - | 文件路径 | ✔️ |
sync | Bool | true | 是否按时间戳同步播放 | ✔️ |
- 模块方法
QVariant seek(QVariant time);
- 方法功能:跳转到指定时间。
- time值:Int类型,时间,单位ms。
- 返回值:Bool类型。
QVariant getDuration(QVariant path);
- 方法功能:获取文件的总时长。
- path值:String类型,文件路径。
- 返回值:Int类型,单位ms。
QVariant getPosition();
- 方法功能:获取当前播放进度。
- 返回值:Int类型,单位ms。
模块事件
EOF
- 触发条件:文件播放完毕。
- 携带消息:无。
LinkInputImage
LinkInputImage可以将图片作为一路输入使用,目前只支持不大于1080P分辨率的jpg格式
内部会以每秒1帧的速度输出,通常可配合MixV模块作为背景、片头片尾等功能场景使用。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✖️ | - | - |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | VPSS | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
path | String | - | 文件路径 | ✔️ |
width | Int | 1920 | 最大解码宽度 | ✔️ |
height | Int | 1080 | 最大解码高度 | ✔️ |
framerate | Int | 1 | 输出图像帧率 | ✔️ |
- 模块方法
无
LinkInputV4l2
webcam采集模块,使用v4l2驱动。
不同型号的摄像头mjpeg格式略有不同,海思的硬件解码模块不能完全支持。
稍后会进行兼容性测试,给出可用型号列表供大家参考。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✖️ | - | - |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | MJPEG | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
path | String | “/dev/video0” | 设备地址 | ✖️ |
format | String | “mjpeg” | 采集格式,目前支持mjpeg、yuv、h264 | ✖️ |
framerate | Int | 30 | 采集帧率 | ✖️ |
width | Int | 1920 | 图像宽度 | ✖️ |
height | Int | 1080 | 图像高度 | ✖️ |
v4l2BufLen | Int | 4 | 缓冲长度 | ✖️ |
framerate仅为设定帧率,实际上由于摄像头性能问题,往往无法达到。
- 模块方法
暂无
LinkDevice
该模块用于和单片机交互,可以获取温度、电源控制等。
- 数据接口
无
- 模块参数
无
- 模块方法
QVariant getTemperature()
- 方法功能:返回核心温度。
- 返回值:Int类型,摄氏度。
- 注意事项:该模块虽然没有数据接口,但是依然需要在start后才能调用invoke。
QVariant poweroff()
- 方法功能:关闭电源。
- 返回值:Bool类型。
QVariant setBootMode(QVariant mode)
- 方法功能:设置上电启动方式。
- mode:String类型,上电启动方式,boot:上电直接启动,standby:上电待机。
- 返回值:Bool类型。
模块事件
keyPress
- 触发条件:按键长按。
- 携带消息:按键名称,目前只有power键。
LinkGPIO
LinkGPIO用于管理GPIO的事件,读取、设定GPIO的状态。
- 数据接口
无
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
config | String | “/link/config/gpio.json” | 配置文件路径 | ✔️ |
- 模块方法
QVariant registEvent(QVariant info);
- 方法功能:注册GPIO事件。
- info值:String类型,GPIO名。
- 返回值:Bool类型。
QVariant setGPIO(QVariant info);
- 方法功能:设置GPIO端口状态。
- info值:List类型,[QSring:GPIO名, Bool:设定值(true:拉高, false:拉低)]。
- 返回值:Bool类型。
QVariant getGPIO(QVariant info);
- 方法功能:获取GPIO端口状态。
- info值:String类型,GPIO名。
- 返回值:Bool类型,true:拉高, false:拉低。
- 模块事件
up
- 触发条件:GPIO按键弹起。
- 携带消息:无。
down
- 触发条件:GPIO按键按下。
- 携带消息:无。
click
- 触发条件:GPIO按键单击。
- 携带消息:无。
LinkInputAlsa
LinkInputAlsa模块实现了支持alsa接口的音频设备采集功能。
通常作为音频数据流的源端。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✖️ | - | - |
Audio Out | ✔️ | Raw | ✔️ |
Video Out | ✖️ | - | - |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
path | String | - | 设备地址,如"hw:0,0" | ✖️ |
samplerate | Int | 48000 | 采样率 | ✔️ |
channels | Int | 1 | 采集声道数 | ✔️ |
- 模块方法
暂无
LinkInputIsp
LinkInputIsp用于获取sensor图像,测试中
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✖️ | - | - |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | VPSS | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
width | Int | 1920 | 图像宽度 | ✔️ |
height | Int | 1080 | 图像高度 | ✔️ |
- 模块方法
QVariant sharpen(QVariant enable)
- 方法功能:返回驱动状态。
- enable:Bool类型,是否开启锐化,默认开启
- 返回值:Bool类型,true,false
QVariant ircut(QVariant open)
- 方法功能:返回驱动状态。
- open:Bool类型,是否开启红外模式
- 返回值:Bool类型,true,false
编解码
LinkDecodeA
音频解码模块,支持aac、mpeg2、pcma、pcmu、g722解码。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✔️ | PCMA/PCMU/G722/AAC/MP2 | ✖️ |
Video In | ✖️ | - | - |
Audio Out | ✔️ | Raw | ✔️ |
Video Out | ✖️ | - | - |
- 模块参数
无,模块根据上游数据自动判断工作参数。
- 模块方法
暂无
LinkEncodeA
音频编码模块,支持aac、mpeg2、pcma、pcmu、g722编码。
模块内部会处理音频重采样,但是消耗性能,建议在LinkInputAi模块先做好resample。
音频编码算法工作在cpu上,LinkSDK的AAC编码经过特殊优化,cpu占用很低。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✔️ | Raw | ✖️ |
Video In | ✖️ | - | - |
Audio Out | ✔️ | PCMA/PCMU/G722/AAC/MP2 | ✔️ |
Video Out | ✖️ | - | - |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
codec | String | “aac” | 编码格式,pcma/pcmu/g722/aac/mp2 | ✖️ |
samplerate | Int | 48000 | 编码采样率 | ✔️ |
channels | Int | 2 | 编码声道 | ✔️ |
bitrate | Int | 128000 | 码率,单位bps | ✔️ |
- 模块方法
暂无
LinkEncodeV
视频编码模块,根据芯片的不同,可支持h264、h265、jpeg编码。
模块内部会处理图像缩放。
编码算法工作在芯片中的VEDU单元,不占用cpu资源,但是不同芯片所支持的最大编码能力不同,请参考海思官方产品手册。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✔️ | VPSS | ✖️ |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | H264/H265/JPEG | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
codec | String | “h264” | 编码格式,h264/h265/jpeg | ✖️ |
profile | String | “high” | 编码profile | ✔️ |
width | Int | -1 | 图像宽度 | ✔️ |
height | Int | -1 | 图像高度 | ✔️ |
bitrate | Int | 1024 | 码率,单位kbps | ✔️ |
framerate | Int | 30 | 帧率 | ✔️ |
gop | Double | 2.0 | 关键帧间隔,单位秒 | ✔️ |
gopmode | Int | 0 | 多参考帧模式:0-关闭;1-智能参考帧;2-双参考帧。 | ✔️ |
rcmode | String | “cbr” | 码率控制算法,cbr/vbr/avbr/fixqp | ✔️ |
snap | Bool | true | jpeg截图编码模式 | ✖️ |
minqp | Int | 22 | 编码质量,仅vbr有效 | ✔️ |
maxqp | Int | 36 | 编码质量,仅vbr有效 | ✔️ |
Iqp | Int | 0 | I帧编码质量,仅fixqp有效 | ✔️ |
Pqp | Int | 0 | P帧编码质量,仅fixqp有效 | ✔️ |
Bqp | Int | 0 | B帧编码质量,仅fixqp有效 | ✔️ |
roi | List | 0 | 感兴趣编码区域设置,数据结构在下文描述 | ✔️ |
当 snap为
true
时,需调用snap
方法获取单针jpeg数据,若为false,则连续编码输出。
当 roi的数据结构如下:
ps:为了便于阅读,在json中加入了注释,实际开发中不要尝试在json中加入注释,很多解析器并不支持。
"roi": [
{
"enable": false, //启动或关闭该区域
"abs": false, //使用qp绝对值设定模式
"qp": -15, //当abs=true时,取值范围[-51,51];当abs=false时,取值范围[0,51];
"framerate": -1,//背景帧率,可以设定一个低于当前帧率的数值,用于降低非roi区域的刷新率,-1表示不修改。
"x": 0.3,
"y": 0.3,
"w": 0.3,
"h": 0.3
}
]
- 模块方法
QVariant snapSync(QVariant path)
- 方法功能:截图,保存jpeg文件到path,阻塞一段时间来确保获取到截图,适用于单次调用,要求必须立刻返回结果的场景。
- path:String类型,保存路径。
- 返回值:Bool类型。
- 注意事项:仅当codec等于"jpeg"且snap等于true时有效。
QVariant snap(QVariant path)
- 方法功能:截图,保存jpeg文件到path,非阻塞操作,可能会返回false,等待一段时间再次调用既可以返回true,适用于频繁调用又不追求实时性的场景。
- path:String类型,保存路径。
- 返回值:Bool类型。
- 注意事项:仅当codec等于"jpeg"且snap等于true时有效。
QVariant reset()
- 方法功能:重置编码器。
- 返回值:Bool类型。
QVariant idr()
- 方法功能:临时请求关键帧。
- 返回值:Bool类型。
QVariant fullRange(QVariant full)
- 方法功能:设定vui信息中的
video_full_range_flag
参数。 - full:Bool类型。
- 返回值:Bool类型。
LinkDecodeV
视频解码模块,运行在VDH模块,不占用cpu。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✔️ | H264/H265/JPEG | ✖️ |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | VPSS | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
width | Int | 1920 | 解码最大分辨率 | ✖️ |
height | Int | 1080 | 解码最大分辨率 | ✖️ |
block | Bool | false | 是否开启阻塞模式,快速文件转码时有用,可用于阻塞上游InputFile模块 | ✖️ |
lowLatency | Bool | false | 开启后会减少一点解码延迟,但是会影响B帧解码 | ✖️ |
- 模块方法
暂无
流处理
LinkMux
码流封装模块,理论上可支持ffmpeg能支持的全部格式。
对于网络输出,当连接意外中断时,模块会自动重连。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✔️ | PCMA/PCMU/G722/AAC/MP2 | ✖️ |
Video In | ✔️ | H264/H265 | ✖️ |
Audio Out | ✔️ | RTSP | ✔️ |
Video Out | ✔️ | MPEGTS/RTSP | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
path | String | - | 码流输出地址 | ✔️ |
format | String | - | 封装格式 | ✔️ |
mute | Bool | false | 是否静音,即不接收音频数据 | ✔️ |
noVideo | Bool | false | 是否不包含视频,即不接收视频数据 | ✔️ |
state | String | - | 只读,获取模块状态 | ✔️ |
hevc_id | int | 12 | 用于设定rtmp输出时,h265数据使用的id号 | ✖️ |
tsSize | int | 1316 | ts分包大小,不建议修改 | ✔️ |
hls_time | int | 5 | HLS分片长度,单位秒 | ✔️ |
hls_list_size | int | 5 | HLS列表长度,单位片 | ✔️ |
hls_base_url | String | “/hls/” | HLS路径前缀 | ✔️ |
hls_filename | String | “-%06d.ts” | HLS文件名格式 | ✔️ |
hls_flags | String | “delete_segments” | 同ffmpeg | ✔️ |
segmentDuration | Int | 0 | 文件分段时长,单位ms | ✔️ |
segmentSize | Int | 0 | 文件分段大小,单位byte | ✔️ |
format 通常情况下无需设置,模块会根据 path 自动选择合适的封装格式,个别无法推测的 path,比如"http://"、"mem://"等,才需要手动设定该参数。
path 可取值"mem://xxx"并linkV到LinkTSHttp或LinkRtsp模块,会在后者创建名为"xxx"的频道,同时format需要设定为mpegts。
当path为本地文件路径时,请确保模块完成
stop
操作之后再访问文件。
若无需封装音频数据,一定要将mute设置为true,否则模块会一直等待音频数据,不做任何输出。
segmentDuration与segmentSize只需要设定其中一个即可,segmentDuration最好为编码Gop的整数倍。使用分段功能时,path可已设置为如"/root/video%d.mp4"的形式。
- 模块方法
QVariant pause()
- 方法功能:暂停。
- 返回值:Bool类型。
QVariant resume()
- 方法功能:恢复。
- 返回值:Bool类型。
QVariantMap getSpeed()
- 方法功能:获取距离上一次调用该接口这段时间内的传输速率。
- 返回值:{speed:总速率,speedA:音频流速率,speedV:视频流速率}
QVariant segment(QVariant path)
- 方法功能:开始一个新的文件分段。
- path:文件路径。
- 返回值:Bool类型。
LinkRtsp
RTSP server 模块,支持udp、rtp over tcp。
模块仅接受Mux组件在path=“mem://xxx”时的数据,其中xxx即为新建频道的名称。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✔️ | RTSP | ✔️ |
Video In | ✔️ | MPEGTS/RTSP | ✔️ |
Audio Out | ✖️ | - | - |
Video Out | ✖️ | - | - |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
port | Int | 554 | 模块工作端口 | ✖️ |
- 模块方法
暂无
LinkTSHttp
Http mpegts server 模块,仅支持ts格式。
模块仅接受Mux组件在path=“mem://xxx”时的数据,其中xxx即为新建频道的名称。
模块提供快速缓冲功能。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✔️ | MPEGTS | ✔️ |
Audio Out | ✖️ | - | - |
Video Out | ✖️ | - | - |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
port | Int | 8090 | 模块工作端口 | ✖️ |
TSBuffer | Int | 1000 | 快速缓冲包数 | ✖️ |
- 模块方法
暂无
LinkTSUdp
将mpegts格式的数据通过udp发送到指定的ip和端口,可用于ts流单播、组播、广播。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✔️ | MPEGTS | ✖️ |
Audio Out | ✖️ | - | - |
Video Out | ✖️ | - | - |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
localPort | Int | 0 | udp本地端口 | ✖️ |
ip | String | 0 | 目标IP | ✔️ |
port | Int | 1234 | 目标端口 | ✔️ |
ttl | Int | 5 | ttl | ✔️ |
flowCtrl | bool | false | 是否启用流控,可以让码流发送更均匀,防止丢包,但是消耗一些性能 | ✔️ |
bandwidth | Int | 100 | 流控最大带宽,单位Mb | ✔️ |
- 模块方法
暂无
音视频处理
LinkAdjustV
图像调节模块,使用硬件算法,不占用cpu。
该模块目前仅在HI3516X、HI3519芯片上有效
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✔️ | VPSS | ✖️ |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | VPSS | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
enable | Bool | false | 调节总开关 | ✔️ |
sbs | Int | 170 | 亮区降噪[0,255] | ✔️ |
sds | Int | 100 | 暗区降噪[0,255] | ✔️ |
sp | Int | 128 | 锐化[0,255] | ✔️ |
luma | Int | 50 | 亮度[0,100] | ✔️ |
contr | Int | 50 | 对比度[0,100] | ✔️ |
satu | Int | 50 | 饱和度[0,100] | ✔️ |
hue | Int | 50 | 色温[0,100] | ✔️ |
- 模块方法
暂无
LinkAEC
回声消除模块,利用cpu运算,3531D上占用13%的cpu性能。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✔️ | Raw | ✔️ |
Video In | ✖️ | - | - |
Audio Out | ✖️ | Raw | ✔️ |
Video Out | ✖️ | - | - |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
far | String | - | 远端音频实例名(发送给扬声器的音频数据) | ✔️ |
near | String | - | 近端音频实例名(麦克风收到的音频数据) | ✔️ |
level | Int | 1 | 消除力度[1,3] | ✔️ |
delay | Int | 100 | 远近端延迟初始值,单位ms | ✔️ |
outSamplerate | Int | 48000 | 模块输出的采样率 | ✔️ |
outChannels | Int | 2 | 模块输出的声道数 | ✔️ |
outNum | Int | 2048 | 模块输出的采样长度 | ✔️ |
实例名通过
LinkObject::name()
获得。
- 模块方法
暂无
LinkAecDelay
回声消除的延迟检测模块,用于判断输出到输入之间的链路延时,用于设定LinkAEC模块的delay参数
将该模块至于ai与ao中间,调用detect方法即可获取延时,测量多次取平均值会更加准确。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✔️ | Raw | ✔️ |
Video In | ✖️ | - | - |
Audio Out | ✔️ | Raw | ✔️ |
Video Out | ✖️ | - | - |
- 模块参数
无
模块方法
QVariant detect()
- 方法功能:发出一段蜂鸣声,并检测声音回到音频输入口的延迟,需要保障音频输出设备有效,且音量调节到足够大。
- 返回值:Int类型,延时,单位ms
LinkAVS
视频拼接模块,针对海思3559/3519等方案定制,暂时仅实现水平或垂直拼接,融合拼接会在后续更新。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✔️ | VPSS | ✔️ |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | VPSS | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
mode | String | “LR” | 拼接模式:“LR”-左右拼接;“UP”-上下拼接。 | ✔️ |
width | Int | 3840 | 输出图像宽度 | ✔️ |
height | Int | 2160 | 输出图像高度 | ✔️ |
- 模块方法
暂无
LinkBeautify
美颜模块,使用硬件算法,不占用cpu。
由于不同芯片的能力不同,效果也略有不同。
该模块目前仅在HI3531A、HI3531D芯片上有效
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✔️ | VPSS | ✖️ |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | VPSS | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
level | Int | 3 | 美颜级别[0,4] | ✔️ |
- 模块方法
暂无
LinkBlend
视频透明叠加模块
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✔️ | VPSS | ✔️ |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | VPSS | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
src | List | - | LinkObject实例名列表,用于输入源排序 | ✔️ |
alpha | double | 0 | 前景叠加透明度 | ✔️ |
srcX | double | 0 | 前景图裁剪X坐标[0,1] | ✔️ |
srcY | double | 0 | 前景图裁剪Y坐标[0,1] | ✔️ |
srcW | double | 1 | 前景图裁剪宽度[0,1] | ✔️ |
srcH | double | 1 | 前景图裁剪高度[0,1] | ✔️ |
dstX | double | 0 | 背景叠加X坐标[0,1] | ✔️ |
dstY | double | 0 | 背景叠加X坐标[0,1] | ✔️ |
- 模块方法
暂无
LinkColorKey
抠像模块,效果基本可用,不断优化中。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✔️ | VPSS | ✔️ |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | VPSS | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
keyPosX | double | 0.5 | 关键色位置X坐标[0,1] | ✔️ |
keyPosY | double | 0.1 | 关键色位置Y坐标[0,1] | ✔️ |
alpha | double | 1 | 前景透明度[0,1] | ✔️ |
- 模块方法
暂无
LinkCrop
视频裁剪模块。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✔️ | VPSS | ✖️ |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | VPSS | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
x | double | 0 | 裁剪起始X坐标[0,1] | ✔️ |
y | double | 0 | 裁剪起始Y坐标[0,1] | ✔️ |
width | double | 1 | 裁剪宽度[0,1] | ✔️ |
height | double | 1 | 裁剪高度[0,1] | ✔️ |
- 模块方法
暂无
LinkDeinterlace
全帧率去隔行模块,海思内置的去隔行功能只能做到半帧率,如1080i60输入,去隔行之后变为1080P30。
而该模块可以做到1080i60输入,1080p60输出,不损失任何动态信息,但是会消耗一定性能。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✔️ | VPSS | ✔️ |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | VPSS | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|
- 模块方法
暂无
LinkGain
音频增益调节模块,可以放大或减小音量,数字变换,可能导致爆音或失真。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✔️ | Raw | ✖️ |
Video In | ✖️ | - | - |
Audio Out | ✔️ | Raw | ✔️ |
Video Out | ✖️ | - | - |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
gain | Int | 0 | 增益,单位dB,6的整数倍有效,可正可负 | ✔️ |
- 模块方法
暂无
LinkMixA
混音模块,支持任意路混音。
模块内部不支持重采样,请确保输入的音频采样率和采样长度一致,不然可能会出现异常。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✔️ | Raw | ✔️ |
Video In | ✖️ | - | - |
Audio Out | ✔️ | Raw | ✔️ |
Video Out | ✖️ | - | - |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
main | String | - | 主音频实例名 | ✔️ |
bufLen | Int | 3 | 音频缓冲长度 | ✔️ |
实例名通过
LinkObject::name()
获得。
- 模块方法
暂无
LinkMixV
该模块提供视频混合功能。
它提供灵活的数据输入和方法,动态更新画面布局。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✔️ | VPSS | ✔️ |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | VPSS | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
width | Int | 1920 | 图像宽度 | ✖️ |
height | Int | 1080 | 图像高度 | ✖️ |
color | UInt | 0 | 背景色,RGB24 | ✖️ |
src | List | - | LinkObject实例名列表,用于输入源排序 | ✔️ |
layout | List | - | 布局定义数据,详见下方示例 | ✔️ |
src中的实例名通过
LinkObject::name()
方法获取。
src中可以包含无效的实例名,用于跳过该顺序的布局位置。
整体的数据结构如下,以json形式举例,可以用
Json::decode
方法转换。
ps:为了便于阅读,在json中加入了注释,实际开发中不要尝试在json中加入注释,很多解析器并不支持。
{
"width":1920, //图像宽度
"height":1080,//图像高度
"src": [
"InputVi_1",//输入源实例名
"InputVi_2"
],
"layout": [
{
"x": 0, //水平坐标[0,1]
"y": 0, //垂直坐标[0,1]
"w": 0.5, //图像宽度[0,1]
"h": 0.5, //图像高度[0,1]
"a": 1, //透明度,由于目前海思没有提供高效的透明叠加方法,该值只能取0/1,当取0时,在该次序上的输入源将不会被显示。
"index": 0 //叠放次序,数值大的在上层,将覆盖下层重合的部分。
},
{
"x": 0.5, //同上
"y": 0.5,
"w": 0.5,
"h": 0.5,
"a": 1,
"index": 1
}
]
}
下面举例说明
图例A中,src数量超过layout数量,因此InputVi_3没有被显示;
图例B中,第二个layout的a为0,因此InputVi_2没有被显示,而src少于layout数量,所以第三个layout没有内容可以显示。
- 模块方法
QVariant swap(QVariant list)
- 方法功能:交换两个实例在布局中的位置。
- list:List类型,包含两个需要交换位置的实例名称。
- 返回值:Bool类型。
LinkOverlay
该模块提供视频叠加特效功能,可实现OSD、滚动字幕、水印、马赛克叠加。
支持png32格式带alpha通道的水印格式。
可以任意指定字体文件。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✔️ | VPSS | ✖️ |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | VPSS | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
width | Int | 1920 | 图像宽度 | ✔️ |
height | Int | 1080 | 图像高度 | ✔️ |
lays | List | - | 叠加层数据,详见下方示例 | ✔️ |
pass | Bool | true | 是否直通 | ✖️ |
通常不需要指定分辨率,模块会根据上游数据自动设置。
不同的芯片支持的叠加层数不同,通常不超过8层。
直通模式下,link上游或overlay模块,得到的都是叠加过特效的图像。非直通模式下,link上游将得到原始图像,但是内部多了一次拷贝,占用更多性能。
lays数据结构如下,以json形式举例,可以用
Json::decode
方法转换。
ps:为了便于阅读,在json中加入了注释,实际开发中不要尝试在json中加入注释,很多解析器并不支持。
[
{
"type": "text", //叠加类型为文本
"enable": true, //显示该叠加层
"font": "/link/res/font.ttf", //字体文件路径
"content": "哈哈呵呵哈哈~~~~呵呵哈哈呵呵~~~~哈哈呵呵", //文字内容,最多支持250个字
"x": 0.1, //叠加层坐标[0,1],相对于整个图像
"y": 0.136, //同上
"scale": 2.2, //文字相对大小,不同的字体表现不同,[0.1,4]
"color": "#669900", //文字颜色,RGB
"bgColor": "", //文字颜色,RGBA,留空表示透明
"alpha": 1, //叠加层透明度
"move": -1, //负数向左滚动,正数向右滚动,数值越大速度越快
"w": 0.515 //叠加层宽度,主要用于限制滚动范围。
},
{
"type": "time", //叠加类型为时间戳
"enable": true, //显示该叠加层
"font": "/link/res/font.ttf", //字体文件路径
"content": "yyyy年MM月dd日 hh:mm:ss", //时间格式
"x": 0.1, //叠加层坐标[0,1],相对于整个图像
"y": 0.136, //同上
"scale": 2.2, //文字相对大小,不同的字体表现不同,[0.1,4]
"color": "#669900", //文字颜色,RGB
"bgColor": "", //文字颜色,RGBA,留空表示透明
"alpha": 1 //叠加层透明度
},
{
"type": "pic", //叠加类型为图像
"enable": true, //显示该叠加层
"content": "/link/res/logo.png", //图片路径
"x": 0.1, //叠加层坐标[0,1],相对于整个图像
"y": 0.1, //同上
"scale": 1, //图片等比缩放倍数,[0.1,4]
"alpha": 1 //叠加层透明度
//图片也可以增加w、h属性,会导致图片强制拉伸,可能产生比例变化
},
{
"type": "mask", //叠加类型为马赛克
"enable": true, //显示该叠加层
"content": "16", //马赛克粒度,8/16/32/64
"x": 0.4, //叠加层坐标[0,1],相对于整个图像
"y": 0.4, //同上
"w": 0.2, //同上
"h": 0.2 //同上
}
]
- 模块方法
暂无
LinkResample
音频重采样模块。
该模块通过cpu运算实现,因此尽可能使用Ai模块的硬件重采样,减少本模块的使用。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✔️ | Raw | ✖️ |
Video In | ✖️ | - | - |
Audio Out | ✖️ | Raw | ✔️ |
Video Out | ✖️ | - | - |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
samplerate | Int | 48000 | 重采样频率 | ✖️ |
channels | Int | 2 | 重采样声道数 | ✖️ |
- 模块方法
暂无
LinkSAVS
视频拼接模块,调用IVE能力进行拼接运算,
在3559A中可以做水平拼接,用于4K60图像的双路mipi拼接
在3531D中可以做田字格拼接,可用于4x3GSDI的拼接
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✔️ | VPSS | ✔️ |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | VPSS | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
mode | String | “LR” | 拼接模式:“LR”-左右拼接;“UP”-上下拼接。 | ✔️ |
width | Int | 3840 | 输出图像宽度 | ✔️ |
height | Int | 2160 | 输出图像高度 | ✔️ |
- 模块方法
暂无
LinkVad
语音检测模块,当参考音量大于设定值,输出的音量将被抑制。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✔️ | Raw | ✖️ |
Video In | ✖️ | - | - |
Audio Out | ✔️ | Raw | ✔️ |
Video Out | ✖️ | - | - |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
volume | String | - | LinkVolume模块实例名 | ✖️ |
th | Int | 40 | 检测阈值,单位db | ✔️ |
level | Int | 4 | 抑制级别,[0~4] | ✔️ |
duration | Int | 10 | 平滑区间,表示采样次数 | ✔️ |
enable | Bool | false | 模块使能 | ✔️ |
active | Bool | false | 检测激活,只读 | ✔️ |
当level等于4时,输出完全静音,等于0时,不做处理。
当volume的音量大于th时,active等于true
- 模块方法
暂无
LinkVolume
音量统计模块。
该模块仅用于计算音量,并不对音量进行改变。
音量结果通过getData()
方法获取,该模块没有数据输出。
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✔️ | Raw | ✔️ |
Video In | ✖️ | - | - |
Audio Out | ✖️ | - | - |
Video Out | ✖️ | - | - |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
avg | int | - | 采样平均音量,单位db,只读[0,96] | ✖️ |
max | Int | - | 采样最大音量,单位db,只读[0,96] | ✖️ |
gain | Int | 0 | 音量增益,仅用于改变统计结果 | ✔️ |
mute | Bool | false | 静音 | ✔️ |
gain参数仅改变统计结果,不影响实际的音频音量。可以是负数,但是结果最小值为0。
当mute为
true
时,模块不进行统计计算,avg和max均返回0。
- 模块方法
QVariantMap getVolume()
- 方法功能:获取音量统计信息。
- 返回值:{avg:左声道平均音量,max:左声道最大音量,avg2:右声道平均音量,max2:右声道最大音量}
智能视觉
LinkFaceDetect
利用NNIE性能,使用SSD网络模型,进行人脸检测定位
仅在支持NNIE的芯片上可用,目前支持3519A与3559A
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✔️ | VPSS | ✔️ |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | VPSS | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
framerate | Int | 10 | 帧率,继承自LinkFrame | ✔️ |
th | double | 0.8 | 检测判定阈值 | ✔️ |
model | string | “/link/model/ssd_inst.wk” | 模型路径 | ✔️ |
- 模块事件
face
- 触发条件:每一帧计算完成时。
- 携带消息:List,[{x:double,y:double,w:double,h:double}],坐标范围[0,1]
LinkFaceRecognition
利用NNIE性能,使用SSD网络模型,进行人脸匹配,可接收FaceDetect的事件
仅在支持NNIE的芯片上可用,目前支持3519A与3559A
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✔️ | VPSS | ✔️ |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | VPSS | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
framerate | Int | 10 | 帧率,继承自LinkFrame | ✔️ |
th | double | 0.97 | 检测判定阈值 | ✔️ |
model | string | “/link/model/lcnn_inst.wk” | 模型路径 | ✔️ |
database | string | “/link/facedb” | 人脸库目录 | ✔️ |
- 模块方法
QVariant addFace(QVariant name)
- 方法功能:保存当前特征值到人脸库下。
- name:String类型,保存文件名。
- 返回值:Bool类型。
模块事件
face
- 触发条件:每一帧计算完成时。
- 携带消息:List,[{x:double,y:double,w:double,h:double,name:string}],坐标范围[0,1],name对应人脸库目录下的文件名
LinkFrame
该模块是大多数机器视觉算法模块的基础,提供了头文件(LinkFrame.h),可以搭配LinkIVE作为基类进行二次开发。
具体可参考LinkSVP
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✔️ | VPSS | ✖️ |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | VPSS | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
width | Int | 1920 | 图像宽度 | ✔️ |
height | Int | 1080 | 图像高度 | ✔️ |
framerate | Int | -1 | 帧率,-1表示不控制帧率 | ✔️ |
delay | Int | 0 | 延迟帧数 | ✔️ |
- 模块方法
暂无
LinkIVE
该模块封装了部分海思IVE系统中常用方法,可以搭配LinkFrame作为基类进行二次开发。
具体可参考LinkSVP
- 模块方法
void wait();
static VIDEO_FRAME_INFO_S makeFrame(int width, int height);
bool copy(IVEMem &src, IVEMem &dst,QRect rect=QRect(0,0,0,0));
bool copySmall(IVEMem &src, IVEMem &dst);
bool erode(IVEMem &src, IVEMem &dst, int size);
bool dilate(IVEMem &src, IVEMem &dst, int size);
bool thresh(IVEMem &src, IVEMem &dst, int low, int high=-1,int val=255);
bool integ(IVEMem &src, IVEMem &dst);
quint32 integRect(IVEMem &mem, QRect rect);
bool sobel(IVEMem &src, IVEMem &dst, char *mask=NULL, int norm=1);
bool filter(IVEMem &src, IVEMem &dst, char *mask=NULL, int norm=0);
bool resize(IVEMem &src, IVEMem &dst);
bool Sub(IVEMem &src1, IVEMem &src2, IVEMem &dst);
bool And(IVEMem &src1, IVEMem &src2, IVEMem &dst);
bool Or(IVEMem &src1, IVEMem &src2, IVEMem &dst);
bool Add(IVEMem &src1, IVEMem &src2, IVEMem &dst, double a, double b);
QVariantList CCL(IVEMem &src, int area);
LinkPedestrianDetect
利用NNIE性能,使用SSD网络模型,进行行人检测定位
仅在支持NNIE的芯片上可用,目前支持3519A与3559A
- 数据接口
接口 | 有效 | 类型 | 多重连接 |
---|---|---|---|
Audio In | ✖️ | - | - |
Video In | ✔️ | VPSS | ✔️ |
Audio Out | ✖️ | - | - |
Video Out | ✔️ | VPSS | ✔️ |
- 模块参数
参数 | 类型 | 默认值 | 说明 | 热更新 |
---|---|---|---|---|
framerate | Int | 10 | 帧率,继承自LinkFrame | ✔️ |
th | double | 0.4 | 检测判定阈值 | ✔️ |
model | string | “/link/model/pedestrian_inst.wk” | 模型路径 | ✔️ |
模块事件
pedestrian
- 触发条件:每一帧计算完成时。
- 携带消息:List,[{x:double,y:double,w:double,h:double}],坐标范围[0,1]