本手冊鏡像地址: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]