利用QT和Libvlc寫RTSP播放器

這幾天學習了下QT,QT核心的東西就是其信號與槽,其他的就是界面的設計,一個程序所有的邏輯部分都是利用信號和槽串起來的。一個widget發送信號,另外一個widget根據這個信號綁定的槽執行相應的函數,這樣就實現了界面和程序邏輯的 交互操作。爲了練習QT,結合前段時間對VLC播放器的分析,知道VLC播放器的界面也是QT寫的,而且Videolan還提供了libvlc核心庫給其他程序員做二次開發,再次佩服這樣的開源組織,廢話少說,下面是我用libvlc和QT寫的RTSP播放器的效果,當然還支持本地視頻的播放,你也可以輸入RTSP地址來播放對應的流媒體,說明一下該播放器是跨平臺的哦,支持Windows和Linux平臺,我的開發平臺是windows7.0和Ubuntu10.04
windows平臺效果圖:

Linux平臺效果圖:

下面我將從分別從兩個平臺(windows和Linux)來談下利用QT和libvlc寫該播放器的大概步驟,很多童鞋知道QT是跨平臺的而libvlc是c寫的,應該也是跨平臺的,爲什麼還要從兩個平臺來講。呵呵,因爲libvlc雖然是c寫的,但是他是基於模塊結構的,這也是VLC的一大亮點,根據視頻文件的編碼格式不同動態的加載所需要的模塊。而這些動態的模塊都是一些動態庫,在linux下是.so的東西,在windows下是.dll的東西,當然這些動態庫不可能是跨平臺的,所以需要區別對待這兩個平臺。

1. 首先去videolan的官方網站下載windows版本的vlc安裝包安裝,這個安裝是傻瓜式的,很簡單。這裏之所以需要安裝vlc主要是因爲我們需要vlc所有的一些庫文件,當然你也可以下載源代碼編譯windows平臺所需要的庫,不過這樣比較麻煩,安裝完了vlc就可以獲得其所有需要的動態庫,多簡單啊。安裝完後的安裝目錄是類似下面這樣的目錄結構:


2. 新建一個工程,可以用QTCreater也可以用其他的IDE,比如codeblocks和visualstudio等等,甚至可以直接用QT自帶的命令行工具來創建一個工程。我用的是codeblocks, 不能不說這個IDE的功能非常強大,我覺得毫不遜色於微軟的visualstudio,不過codeblock要支持QT工程還需要一些配置,主要是配置QTsdk的路徑和MinGw的路徑這個工程主要是實現一些界面,再次向大家推薦下codeblocks,功能強大,而且開源,體積很小,不像eclipse和visualstudio動不動幾百M甚至幾G,似乎有點跑題了。

3. 將第一步vlc安裝目錄下的libvlc.dll和libvlccore.dll拷貝到第二步所創建工程的目錄,在工程所在目錄創建一個lib目錄,將sdk目錄中的libvlc.lib和livblcore.lib兩個靜態庫拷貝到剛創建的lib目錄中,還要將sdk目錄中的include目錄中的vlc目錄整體拷貝到工程所在目錄,將vlc目錄中的vlc.h文件拷貝到上一級目錄,也就是工程所在的頂層目錄,然後再將vlc安裝目錄下的plugin目錄整體拷貝到工程所在目錄,這個裏面都是一些動態庫dll文件,這樣就完成了所有libvlc所需要的庫拷貝,下面是拷貝之後的目錄結構




4.下面一步比較關鍵,要把設置鏈接庫的路徑,在QT的工程文件.pro中設置,在windows下和Linux平臺下不一樣,windows下類似這樣設置,可以根據個人情況加以修改

點擊(此處)摺疊或打開

  1. INCLUDEPATH += D:\Programing\Practice\Qt\Player\player\vlc
  2. LIBS += D:\Programing\Practice\Qt\Player\player\lib\libvlc.lib
  3. LIBS += D:\Programing\Practice\Qt\Player\player\lib\libvlccore.lib

5.下面就是用QT編寫界面調用libvlc的問題了,可以根據自己的需要編寫界面,我這裏貼出部分關鍵的調用libvlc的代碼,界面部分很簡單:
下面這個函數時打開本地視頻文件的代碼,主要是libvlc_media_new_path()函數

點擊(此處)摺疊或打開

  1. void VLCMainwindow::openFile() {
  2.     /* Just the basic file-select box */
  3.     QString fileOpen = QFileDialog::getOpenFileName(this,tr("Load a file"), "~");
  4.     fileOpen.replace("/", "\\"); //因爲getOpenFileName得到的文件名是類//似於C:/Hello/test.avi,與windows下的路徑名不匹配,所以需要這一步轉換
  5.     /* Stop if something is playing */
  6.     if( vlcPlayer && libvlc_media_player_is_playing(vlcPlayer) )
  7.         stop();

  8.     /* New Media */
  9.     libvlc_media_t *vlcMedia = libvlc_media_new_path(vlcObject,qtu(fileOpen));
  10.     if( !vlcMedia )
  11.         return;
  12.     vlcPlayer = libvlc_media_player_new_from_media (vlcMedia);
  13.     libvlc_media_release(vlcMedia);

  14.     /* Integrate the video in the interface */
  15. #if defined(Q_OS_MAC)
  16.     libvlc_media_player_set_nsobject(vlcPlayer, videoWidget->winId());
  17. #elif defined(Q_OS_UNIX)
  18.     libvlc_media_player_set_xwindow(vlcPlayer, videoWidget->winId());
  19. #elif defined(Q_OS_WIN)
  20.     libvlc_media_player_set_hwnd(vlcPlayer, videoWidget->winId());
  21. #endif

  22.     //int windid = videoWidget->winId();
  23.     //libvlc_media_player_set_xwindow (vlcPlayer, windid );

  24.     /* And play */
  25.     libvlc_media_player_play (vlcPlayer);

  26.     //Set vars and text correctly
  27.     playBut->setText("Pause");
  28. }

而下面這個函數時打開RTSP流媒體的函數,關鍵是調用了libvlc中的libvlc_meida_new_location()實現播放RTSP視頻

點擊(此處)摺疊或打開
  1. void VLCMainwindow::StartPlay()
  2. {
  3.     URLDialog = new OpenURLDialog;
  4.     URLDialog->hide();
  5.     if( vlcPlayer && libvlc_media_player_is_playing(vlcPlayer) )
  6.         stop();

  7.     // New Media
  8.    // libvlc_media_t *vlcMedia = libvlc_media_new_path(vlcObject,qtu(fileOpen));
  9.     libvlc_media_t *vlcMedia = libvlc_media_new_location(vlcObject,qtu (URLDialog->urlLineEdit->text()));
  10.     if( !vlcMedia )
  11.         return;

  12.     vlcPlayer = libvlc_media_player_new_from_media (vlcMedia);
  13.     libvlc_media_release(vlcMedia);

  14.     //libvlc_media_player_set_xwindow(vlcPlayer, windid);

  15.     /* And play */
  16.     libvlc_media_player_play (vlcPlayer);

  17.     //Set vars and text correctly
  18.     playBut->setText("Pause");
  19. }
大家可以看到播放RTSP和本地文件在libvlc中是兩個不同的api
基本上Windows平臺下的基於QT調用libvlc的主要步驟就是這些,下面說說linux平臺下的步驟
.Linux平臺

1. 編譯vlc源碼並安裝

Linux平臺下也可以直接命令行apt-get  installvlc安裝vlc,然後得到linux平臺下libvlc的庫,也可以去videolan官方網站下載vlc的源碼,在本地編譯並安裝,編譯安裝部分很簡單,可以參考videolan官方網站。


2. 建立一個QT工程

這一步類似於Windows平臺下, 或者可以直接將Windows下的工程拷貝到Linux下來


3. 設置鏈接庫libvlc的路徑

編譯安裝好了之後vlc所有依賴的庫都會被copy到/usr/local/lib目錄,我們可以在qt的工程文件.pro中直接把庫的鏈接路徑設置好就ok了。具體的鏈接庫路徑設置類似下面這樣:

INCLUDEPATH += . vlc

LIBS += -L/usr/local/lib -lvlc

# Input

HEADERS += mainwindow.h \

          openurldialog.h \

          painter.h \

          player.h \


4. 將vlc源代碼目錄下的include目錄下的vlc目錄拷貝到工程所在目錄,vlc目錄下包括libvlc所有庫函數的頭文件


5.編寫自己的QT界面代碼實現對libvlc的調用,界面代碼跟windows是兼容的



總結一下:

Libvlc庫是vlc播放器的核心庫,我們只要調用這個庫並加以個性化就可以輕鬆實現自己的播放器,而QT又是跨平臺的,雙劍合璧,無敵於天下。下面我會把部分代碼上傳到網上,並不斷完善該播放器的功能並share給大家

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章