0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用Qt+Live555搭建RTSP服務(wù)器

DS小龍哥-嵌入式技術(shù) ? 來源: DS小龍哥-嵌入式技術(shù) ? 作者: DS小龍哥-嵌入式技 ? 2023-05-26 16:36 ? 次閱讀

一、項(xiàng)目背景

隨著物聯(lián)網(wǎng)技術(shù)不斷發(fā)展,視頻監(jiān)控系統(tǒng)在各個(gè)領(lǐng)域的應(yīng)用越來越廣泛。其中,RTSP(Real Time Streaming Protocol)是一種常用的流媒體傳輸協(xié)議,可以實(shí)現(xiàn)對(duì)實(shí)時(shí)音視頻數(shù)據(jù)的傳輸和播放。為了實(shí)現(xiàn)視頻監(jiān)控系統(tǒng)的網(wǎng)絡(luò)化和智能化,需要開發(fā)一個(gè)基于RTSP協(xié)議的視頻流服務(wù)器,能夠接收前端設(shè)備的視頻流,并提供RTSP協(xié)議的服務(wù),方便客戶端進(jìn)行實(shí)時(shí)的視頻瀏覽、回放等操作。

在開發(fā)過程中,為了提高開發(fā)效率、減少開發(fā)難度和成本,同時(shí)具備良好的可擴(kuò)展性和可維護(hù)性,我選擇使用Qt和Live555庫來搭建RTSP服務(wù)器。Qt是一個(gè)跨平臺(tái)的C++應(yīng)用程序開發(fā)框架,具有完善的GUI界面設(shè)計(jì)工具和豐富的功能模塊,可以大大簡化開發(fā)過程;而Live555是一個(gè)跨平臺(tái)的流媒體開發(fā)庫,支持多種流媒體協(xié)議,包括RTSP、SIP、RTP等,可以幫助我們快速實(shí)現(xiàn)視頻流的傳輸和處理。

該項(xiàng)目將主要實(shí)現(xiàn)以下功能:

  1. 實(shí)現(xiàn)Qt+Live555環(huán)境下的RTSP服務(wù)器搭建,支持多路視頻流的傳輸和播放。
  2. 基于Qt的GUI界面設(shè)計(jì),方便用戶進(jìn)行配置和管理。
  3. 實(shí)現(xiàn)視頻編碼格式的自適應(yīng)性,支持H.264、H.265等常用視頻編碼格式。
  4. 實(shí)現(xiàn)視頻流的加密和解密,并支持RTSP over HTTPS安全通信協(xié)議。
  5. 實(shí)現(xiàn)基本的用戶權(quán)限管理和日志記錄功能。

二、RTSP介紹

RTSP服務(wù)器是一種提供流媒體服務(wù)的服務(wù)器,它采用RTSP協(xié)議與客戶端進(jìn)行通信,支持音視頻數(shù)據(jù)的傳輸和控制。RTSP(Real-Time Streaming Protocol)實(shí)時(shí)流傳輸協(xié)議是一個(gè)應(yīng)用層協(xié)議,通過TCP或UDP傳輸數(shù)據(jù),用于實(shí)現(xiàn)多媒體數(shù)據(jù)的實(shí)時(shí)傳輸。

RTSP服務(wù)器主要用于流媒體直播、點(diǎn)播、錄像等應(yīng)用場(chǎng)景,可以讓用戶通過網(wǎng)絡(luò)實(shí)時(shí)觀看視頻、聽取音頻等。RTSP服務(wù)器一般具有以下功能:

  1. 實(shí)現(xiàn)流媒體數(shù)據(jù)的傳輸和控制,包括建立連接、傳輸媒體數(shù)據(jù)、暫停播放、快進(jìn)快退等;
  2. 支持多種編解碼格式和媒體容器格式,如H.264、MPEG-4、AAC、MP3等;
  3. 支持多種網(wǎng)絡(luò)傳輸協(xié)議,如UDP、TCP、HTTP、HTTPS等;
  4. 支持多種安全性認(rèn)證方式,如用戶名密碼認(rèn)證、數(shù)字證書認(rèn)證等;
  5. 支持?jǐn)U展功能,如實(shí)時(shí)轉(zhuǎn)碼、負(fù)載均衡、集群部署等。

常見的RTSP服務(wù)器軟件包括Live555、Wowza Media Server、Darwin Streaming Server等。使用RTSP服務(wù)器可以輕松實(shí)現(xiàn)基于網(wǎng)絡(luò)的流媒體服務(wù),滿足直播、視頻會(huì)議、遠(yuǎn)程監(jiān)控等應(yīng)用場(chǎng)景需求。

image-20230526163154552

三、Live555庫介紹

Live555庫是一個(gè)開源的多媒體流媒體服務(wù)框架,它提供了一系列的C++類和庫函數(shù),用于開發(fā)基于標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議的流媒體應(yīng)用程序。該庫主要用于實(shí)現(xiàn)RTP/RTCP、RTSP、SIP以及SDP等標(biāo)準(zhǔn)協(xié)議,可以方便地實(shí)現(xiàn)視頻/音頻的網(wǎng)絡(luò)傳輸、播放、錄制和轉(zhuǎn)碼等功能。

Live555庫具有以下特點(diǎn):

  1. 適用于各種平臺(tái)和操作系統(tǒng),包括Windows、Linux、Mac OS X等;
  2. 支持常見的視頻和音頻格式,如H.264、MPEG-4、MP3、AAC等;
  3. 支持UDP、TCP、HTTP、HTTPS等多種網(wǎng)絡(luò)傳輸協(xié)議;
  4. 支持IPv4和IPv6雙棧網(wǎng)絡(luò)環(huán)境;
  5. 可以通過插件機(jī)制擴(kuò)展功能。

使用Live555庫進(jìn)行開發(fā),可以快速搭建基于網(wǎng)絡(luò)的流媒體應(yīng)用程序。例如,可以使用該庫實(shí)現(xiàn)RTSP服務(wù)器或客戶端,實(shí)現(xiàn)視頻直播、遠(yuǎn)程監(jiān)控、視頻會(huì)議等應(yīng)用場(chǎng)景。同時(shí),Live555庫也可以作為其他流媒體服務(wù)器軟件的基礎(chǔ)組件,例如: Wowza Media Server、Darwin Streaming Server等。

四、實(shí)現(xiàn)流程

在Qt中搭建RTSP服務(wù)器,可以使用開源的Live555庫。Live555是一個(gè)跨平臺(tái)、C++語言編寫的多媒體開發(fā)庫,支持RTSP和SIP等常見協(xié)議,并且有完整的服務(wù)器和客戶端實(shí)現(xiàn)。

下面是在Qt中基于Live555庫實(shí)現(xiàn)簡單的RTSP服務(wù)器的步驟:

【1】下載并安裝Live555庫。從官網(wǎng)(http://www.live555.com/liveMedia/#download)下載最新版本的庫。

并按照文檔說明進(jìn)行安裝。將Live555庫的路徑添加到Qt Creator的項(xiàng)目配置文件中。

【2】創(chuàng)建一個(gè)Qt控制臺(tái)應(yīng)用程序。在Qt Creator中創(chuàng)建一個(gè)空的控制臺(tái)應(yīng)用程序,并在項(xiàng)目的.pro文件中添加Live555庫的鏈接選項(xiàng),例如:

LIBS += -LLive555庫的路徑 -lliveMedia -lgroupsock -lUsageEnvironment -lBasicUsageEnvironment

【3】編寫RTSP服務(wù)器代碼。創(chuàng)建一個(gè)類繼承自live555庫中的RTSPServer類,并實(shí)現(xiàn)相應(yīng)的虛函數(shù),createNewSession()和deleteStream()。

【4】啟動(dòng)RTSP服務(wù)器。在main()函數(shù)中創(chuàng)建RTSP服務(wù)器對(duì)象,并調(diào)用start()函數(shù)啟動(dòng)服務(wù)器,如下所示:

int main(int argc, char *argv[])
 {
     QApplication a(argc, argv);
     
     RTSPServer* server = new MyRTSPServer();
     server->start();
     
     return a.exec();
 }

【5】測(cè)試。使用RTSP客戶端工具(如VLC播放器)連接本地的RTSP服務(wù)器,并播放視頻流。

五、實(shí)現(xiàn)代碼

下面是使用Qt+Live555搭建RTSP服務(wù)器的核心代碼示例:

#include 
 #include 
 ?
 class VideoStreamSource : public FramedSource {
 public:
   static VideoStreamSource* createNew(UsageEnvironment& env) {
     return new VideoStreamSource(env);
   }
   virtual void doGetNextFrame() {
     // 將視頻數(shù)據(jù)幀復(fù)制到fTo處并設(shè)置fFrameSize和fNumTruncatedBytes,然后調(diào)用afterGetting()函數(shù)通知視頻幀可用。
     if (condition1 && condition2) {
         memcpy(fTo, fVideoFrame, fVideoFrameSize);
         afterGetting(this);
     } else {
         handleClosure(this);
     }
   }
 protected:
   VideoStreamSource(UsageEnvironment& env) : FramedSource(env) {
     // 初始化一些變量
   }
   virtual ~VideoStreamSource() {}
 private:
   // 一些成員變量
   char* fVideoFrame;
   unsigned fVideoFrameSize;
 };
 ?
 class MyRTSPServer : public RTSPServer {
 public:
   static MyRTSPServer* createNew(UsageEnvironment& env, Port ourPort) {
     return new MyRTSPServer(env, ourPort);
   }
 protected:
   MyRTSPServer(UsageEnvironment& env, Port ourPort)
     : RTSPServer(env, ourPort, NULL) {}
   virtual ~MyRTSPServer() {}
   virtual ServerMediaSession* lookupSession(char const* streamName, Boolean isFirstLookup) {
     ServerMediaSession* session = RTSPServer::lookupSession(streamName, isFirstLookup);
     if (session == NULL) {
       // 創(chuàng)建一個(gè)新的會(huì)話以支持RTSP客戶端請(qǐng)求的視頻流
       session = ServerMediaSession::createNew(envir(), streamName);
       // 將視頻幀添加到會(huì)話中
       VideoStreamSource* videoSource = VideoStreamSource::createNew(envir());
       session->addSubsession(MPEG4VideoStreamDiscreteFramer::createNew(envir(), videoSource, false));
       addServerMediaSession(session);
     }
     return session;
   }
 };
 ?
 int main(int argc, char *argv[]) {
   // 創(chuàng)建一個(gè)QT應(yīng)用程序?qū)嵗?/span>
   QCoreApplication app(argc, argv);
 ?
   // 創(chuàng)建一個(gè)RTSP服務(wù)器實(shí)例,并監(jiān)聽9090端口
   MyRTSPServer* rtspServer = MyRTSPServer::createNew(*(app.instance()), 9090);
   if (rtspServer == NULL) {
     qDebug() << "Failed to create RTSP server: " << env.getResultMsg() << endl;
     exit(1);
   }
 ?
   // 啟動(dòng)Qt事件循環(huán)
   return app.exec();
 }

上面的代碼實(shí)現(xiàn)了以下幾個(gè)功能:

  • 創(chuàng)建了一個(gè)VideoStreamSource類,用于獲取視頻數(shù)據(jù)幀并封裝成FramedSource對(duì)象。
  • 創(chuàng)建了一個(gè)MyRTSPServer類繼承自RTSPServer,重寫了lookupSession()函數(shù),用于創(chuàng)建和添加新的視頻流會(huì)話到RTSP服務(wù)器中。
  • main()函數(shù)中創(chuàng)建了一個(gè)Qt應(yīng)用程序?qū)嵗?,以及一個(gè)RTSP服務(wù)器實(shí)例,并啟動(dòng)Qt事件循環(huán)。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 物聯(lián)網(wǎng)
    +關(guān)注

    關(guān)注

    2894

    文章

    43301

    瀏覽量

    366379
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8700

    瀏覽量

    84534
  • RTSP
    +關(guān)注

    關(guān)注

    0

    文章

    12

    瀏覽量

    12092
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux開發(fā)_CentOS7.4服務(wù)器搭建NFS、NGINX服務(wù)器,安裝ffmpeg、Qt環(huán)境

    在CentOS7.4服務(wù)器版本的環(huán)境下搭建NFS服務(wù)器、安裝ffmpeg、安裝nginx服務(wù)器、部署Qt編譯環(huán)境。
    的頭像 發(fā)表于 07-14 13:45 ?1414次閱讀
    Linux開發(fā)_CentOS7.4<b class='flag-5'>服務(wù)器</b><b class='flag-5'>搭建</b>NFS、NGINX<b class='flag-5'>服務(wù)器</b>,安裝ffmpeg、<b class='flag-5'>Qt</b>環(huán)境

    【NanoPi2試用體驗(yàn)】-【自己動(dòng)手做網(wǎng)絡(luò)攝像機(jī)】-02.開源RTSPlive555在NanoPi上測(cè)試

    ../slamtv60.264 mediaServer/3.2 啟動(dòng)live555MediaServer服務(wù)器walker@nanopi2:~/opensource/live$ cd mediaServer
    發(fā)表于 01-19 22:46

    請(qǐng)教如何安裝達(dá)芬奇開發(fā)包的LIVE555

    手里有一個(gè)DM8168開發(fā)板,其中一個(gè)例程是編碼,然后RTSP輸出,用到了LIVE555的庫。 我安裝完rdk的開發(fā)包后,并不能找到這個(gè)第三方庫,請(qǐng)問這個(gè)庫是需要自己編譯,還是TI有編譯好的,如果是編譯好的,在哪里下載,如何安裝 呢,多謝!
    發(fā)表于 05-28 03:52

    用基于live555+ffmepg的軟件不能顯示的原因是什么?

    如上題,DM8168用RTSP服務(wù)器發(fā)送的碼流用VLC播放能播放,但是用基于live555+ffmepg的軟件不能顯示,但是如果我用VLC做RTS
    發(fā)表于 08-18 08:50

    如何去實(shí)現(xiàn)基于MPP解碼+live555RTSP服務(wù)端呢

    因項(xiàng)目本身要求,在RK3399pro上實(shí)現(xiàn)RTSP的程序流,Live555程序功能已經(jīng)實(shí)現(xiàn)了本地的服務(wù)端視頻,本文主要是基于瑞芯微的MPP解碼+live555實(shí)現(xiàn)
    發(fā)表于 02-14 06:25

    基于RTSP協(xié)議的實(shí)時(shí)視頻服務(wù)器實(shí)現(xiàn)

    首先介紹了流式傳輸?shù)母拍睢?b class='flag-5'>RTSP 協(xié)議工作體系以及MPEG-4 編碼格式。然后以Linux 系統(tǒng)為平臺(tái),利用開源代碼LIVE 庫和開源項(xiàng)目FFMpeg,設(shè)計(jì)開發(fā)了RTSP 流媒體服務(wù)器
    發(fā)表于 09-02 08:35 ?123次下載

    教你linux搭建web服務(wù)器

    教你linux搭建web服務(wù)器和大家分享了一份配置文檔,希望對(duì)您用linux搭建web服務(wù)器有所啟發(fā)。
    發(fā)表于 12-28 14:18 ?8783次閱讀

    如何搭建本地smtp服務(wù)器

    本文開始闡述的闡述了搭建本地smtp服務(wù)器的教程,另外還介紹了基于CentOS搭建SMTP服務(wù)器的詳細(xì)教程。
    發(fā)表于 04-08 14:46 ?1.9w次閱讀
    如何<b class='flag-5'>搭建</b>本地smtp<b class='flag-5'>服務(wù)器</b>

    如何搭建Linux服務(wù)器的詳細(xì)資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何搭建Linux服務(wù)器的詳細(xì)資料說明主要內(nèi)容包括了:1、搭建telnet服務(wù)器,2、搭建DHCP
    發(fā)表于 04-18 08:00 ?10次下載
    如何<b class='flag-5'>搭建</b>Linux<b class='flag-5'>服務(wù)器</b>的詳細(xì)資料說明

    linux如何搭建web服務(wù)器

    linux搭建web服務(wù)器流程如下
    發(fā)表于 06-08 09:09 ?9057次閱讀
    linux如何<b class='flag-5'>搭建</b>web<b class='flag-5'>服務(wù)器</b>

    服務(wù)器怎么搭建_服務(wù)器怎么安裝系統(tǒng)

     自己搭建服務(wù)器,需要什么樣的條件呢,它是一個(gè)怎么樣的過程。下面就為大家介紹一下如何搭建自己的服務(wù)器。
    的頭像 發(fā)表于 07-24 09:46 ?1.9w次閱讀
    <b class='flag-5'>服務(wù)器</b>怎么<b class='flag-5'>搭建</b>_<b class='flag-5'>服務(wù)器</b>怎么安裝系統(tǒng)

    FTP服務(wù)器搭建詳細(xì)步驟

    FTP服務(wù)器是一種用于文件傳輸?shù)?b class='flag-5'>服務(wù)器,它可以讓用戶通過FTP客戶端上傳和下載文件。FTP服務(wù)器是一種非常實(shí)用的文件傳輸工具,可以方便地實(shí)現(xiàn)文件傳輸、備份、發(fā)布、下載和共享等功能。那么FTP
    的頭像 發(fā)表于 04-12 14:39 ?3.2w次閱讀

    存儲(chǔ)服務(wù)器怎么搭建?

      搭建存儲(chǔ)服務(wù)器需要根據(jù)我們的需求和環(huán)境選擇合適的硬件和軟件,并進(jìn)行相應(yīng)的配置。那么存儲(chǔ)服務(wù)器怎么搭建?
    的頭像 發(fā)表于 10-31 16:51 ?2579次閱讀

    搭建ftp服務(wù)器的步驟

    搭建ftp服務(wù)器的步驟? 搭建FTP服務(wù)器是一項(xiàng)需要一定技術(shù)知識(shí)的任務(wù),但是只要按照以下步驟進(jìn)行操作,您就能成功搭建自己的FTP
    的頭像 發(fā)表于 12-07 16:32 ?1035次閱讀

     海外云服務(wù)器搭建pi節(jié)點(diǎn)詳細(xì)步驟

     海外云服務(wù)器搭建pi節(jié)點(diǎn)簡單嗎?海外云服務(wù)器搭建pi節(jié)點(diǎn)步驟有哪些?小編為您整理發(fā)布海外云服務(wù)器搭建
    的頭像 發(fā)表于 02-21 10:16 ?870次閱讀