#include "Channel.h" #include "CheckStorageThread.h" #include "Constant.h" #include "Json.h" #include "Link.h" #include "Log.h" #include "TcpServer.h" #include "Widget.h" #include #include #include TcpServer* server; LinkObject* vo; LinkObject* vo1; // 通道列表 QList channelList; // 录制模式 Constant::RecordMode recordMode; // 回放模式 Constant::PlaybackMode playbackMode; /** * @brief 加载配置文件 */ bool loadConfiguration(QString path) { QFileInfo fileInfo(path); if (!fileInfo.exists()) { Log::critical("config.json does not exist, exit"); return false; } QVariantMap config = Json::loadFile(path).toMap(); recordMode = Constant::RecordMode(config["recordMode"].toInt()); playbackMode = Constant::PlaybackMode(config["playbackMode"].toInt()); QVariantList list = config["interface"].toList(); for (int i = 0; i < list.count(); i++) { Channel* chn = new Channel(); QVariantMap cfg = list.at(i).toMap(); chn->channelName = cfg["name"].toString(); QVariantMap encV = cfg["encV"].toMap(); chn->videoEncoderParams = encV; QVariantMap encA = cfg["encA"].toMap(); chn->audioEncoderParams = encA; chn->pushCode = cfg["pushCode"].toString(); chn->init(); channelList.push_back(chn); } return true; } /** * @brief 开始录制 */ void startRecord() { // 一路录制,只录制HDMI-A通道 if (recordMode == Constant::OneChannelRecord) { for (Channel* chn : channelList) { if (chn->channelName == Constant::MainChannel) { chn->startRecord(); } } } // 两路录制 else if (recordMode == Constant::TwoChannelRecord) { for (Channel* chn : channelList) { chn->startRecord(); } } } int main(int argc, char* argv[]) { // 初始化日志 Log::init(); // 初始化Link编码系统 if (!Link::init()) { Log::error("Link init failed, exit"); return 0; } // 在初始化QApplication之前初始化视频输出和linuxfb // 否则不能显示qt的ui // HDMI-OUT0视频输出,只将ui输出在0口 vo = Link::create("OutputVo"); QVariantMap dataVo; dataVo["vid"] = 0; dataVo["type"] = "hdmi"; vo->start(dataVo); // HDMI-OUT1视频输出 vo1 = Link::create("OutputVo"); QVariantMap dataVo1; dataVo1["vid"] = 1; dataVo1["ui"] = false; dataVo1["type"] = "vga|bt1120"; vo1->start(dataVo1); /** * 后续可能需要进行修改************************** */ // HDMI-OUT1口特殊设置 static int lastNorm = 0; int norm = 0; QString str = "1080P60"; if (str == "1080P60") norm = 9; else if (str == "1080P50") norm = 10; else if (str == "1080P30") norm = 12; else if (str == "720P60") norm = 5; else if (str == "720P50") norm = 6; else if (str == "3840x2160_30") norm = 14; if (norm != lastNorm) { lastNorm = norm; QString cmd = "rmmod hi_lt8618sx_lp.ko"; system(cmd.toLatin1().data()); cmd = "insmod /ko/extdrv/hi_lt8618sx_lp.ko norm=" + QString::number(norm); system(cmd.toLatin1().data()); } QApplication a(argc, argv); // 初始化配置文件, 需要在QApplication之后 if (!loadConfiguration(Constant::ConfigurationPath)) { Log::error("load configuration failed, exit..."); return 0; } // qt界面 Widget w; w.show(); // 开始录制 startRecord(); // 开启Tcp服务 server = new TcpServer(); server->listen(QHostAddress::Any, 8080); Log::info("start tcp server, listen port 8080..."); // 硬盘检测线程,检测硬盘容量 CheckStorageThread* thread = new CheckStorageThread(); // thread->start(); return a.exec(); }