版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
简介
LowLatencyENC和LowLatencyDEC两个工程演示了如何最大化降低编码、传输、解码整个流程的延迟。
需要使用两张评估板配合测试。
示例中编码端ip为192.168.1.76,解码端为192.168.1.77
准备工作
- 参照用户手册搭建开发环境、编译3531D工程、配置网络启动参数。
- 通过修改宏定义选择一种传输协议
- 配置正确的IP地址,并重新编译
- 将两个评估板的HDMI-OUT接显示器(支持1080P即可,程序默认输出1080P60)。
- 编码端的HDMI-A接入一个带有秒表程序的信号。
- 上电,进入/root/demo目录
- 编码端运行LowLatencyENC,解码端运行LowLatencyDEC
运行结果
源代码
编码端
完整的工程参见:https://gitee.com/LinkPi/3531D/tree/master/LowLatencyENC
//main.cpp
#include <QCoreApplication>
#include "Link.h"
#define RTSP
//#define UDP
//#define RTMP
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 *vo=Link::create("OutputVo");
QVariantMap dataVo;
dataVo["type"]="hdmi";
dataVo["lowLatency"]=true;
vo->start(dataVo);
vi->linkV(vo);
LinkObject *encV=Link::create("EncodeV");
QVariantMap dataEncV;
dataEncV["codec"]="h264";
dataEncV["framerate"]=60;
dataEncV["width"]=1920;
dataEncV["height"]=1080;
dataEncV["bitrate"]=8000;
dataEncV["lowLatency"]=true;
encV->start(dataEncV);
LinkObject *mux=Link::create("Mux");
QVariantMap dataRtsp;
#ifdef RTSP
dataRtsp["path"]="mem://test";
dataRtsp["format"]="rtsp";
#elif UDP
dataRtsp["path"]="mem://test";
dataRtsp["format"]="mpegts";
#elif RTMP
dataRtsp["path"]="rtmp://127.0.0.1/live/test";
dataRtsp["format"]="flv";
#endif
dataRtsp["mute"]=true;
mux->start(dataRtsp);
#ifdef RTSP
LinkObject *rtspServer=Link::create("Rtsp");
rtspServer->start();
vi->linkV(encV)->linkV(mux)->linkV(rtspServer);
#elif UDP
LinkObject *udp=Link::create("TSUdp");
QVariantMap dataUDP;
dataUDP["ip"]="192.168.1.77";
dataUDP["port"]=1234;
udp->start(dataUDP);
vi->linkV(encV)->linkV(mux)->linkV(udp);
#elif RTMP
vi->linkV(encV)->linkV(mux);
#endif
return a.exec();
}
解码端
完整的工程参见:https://gitee.com/LinkPi/3531D/tree/master/LowLatencyDEC
//main.cpp
#include <QCoreApplication>
#include "Link.h"
#define RTSP
//#define UDP
//#define RTMP
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Link::init();
LinkObject *vo=Link::create("OutputVo");
QVariantMap dataVo;
dataVo["type"]="hdmi";
vo->start(dataVo);
LinkObject *net=Link::create("InputNet");
QVariantMap dataNet;
#ifdef RTSP
dataNet["path"]="rtsp://192.168.1.76/test";
#elif UDP
dataNet["path"]="udp://@:1234";
#elif RTMP
dataNet["path"]="rtmp://192.168.1.76/live/test";
#endif
dataNet["protocol"]="udp";
dataNet["buffer"]=false;
dataNet["sync"]=false;
net->start(dataNet);
LinkObject *dec=Link::create("DecodeV");
QVariantMap dataDec;
dataDec["lowLatency"]=true;
dec->start(dataDec);
net->linkV(dec)->linkV(vo);
return a.exec();
}