天天看點

最簡單的基于libVLC的例子:最簡單的基于libVLC的視訊播放器

本文記錄使用libVLC的開發的最簡單的視訊播放器示例。VLC Media Player是一款優秀的播放器,但是由于它的源代碼編譯的難度比較大,一直沒有深入研究過它的開發方面的技術。此前觸到了一些VLC開發方面的東西,是以總結了一下libVLC的開發示例程式。

最簡單的基于libVLC的例子:最簡單的基于libVLC的視訊播放器

如何擷取VLC的SDK

VLC開發所需的庫檔案可以有2種擷取方法:

1. 自行編譯2. 直接從安裝目錄裡面拷貝出來

第一種方法難度要大一些。尤其是在Windows下編譯VLC是個比較麻煩的事情。一般情況下可以選擇第二種方法擷取VLC開發所需的檔案。

開發VLC所需的檔案的位置:

1. 動态連結庫*.dll:安裝目錄下的libvlc.dll,libvlccore.dll以及plugins目錄下的所有檔案。PS:VLC支援非常多的plugin。是以plugins目錄的體積确實是非常大的。2. 靜态連結庫*.lib:安裝目錄/sdk/lib3. 頭檔案*.h:安裝目錄/sdk/include

建立一個VC工程後,把上述三類檔案分别拷貝至新工程目錄下,并且配置它們的路徑之後,就可以使用libVLC進行開發了。

最簡單的基于libVLC的視訊播放器

使用libVLC開發一個播放器十分的容易。最簡單的基于libVLC的視訊播放器的流程圖如下圖所示。

最簡單的基于libVLC的例子:最簡單的基于libVLC的視訊播放器

流程圖中包含了3個結構體:

libvlc_instance_t:代表一個libVLC的執行個體。libvlc_media_t:代表一個可以播放的媒體。libvlc_media_player_t:代表一個VLC媒體播放器(一個視訊播放器播放一個視訊)。注意VLC并不僅僅用于媒體播放。

建立或者以上3個結構體通過以下6個函數:

libvlc_new():建立libvlc_instance_t。libvlc_media_new_path():建立libvlc_media_t。libvlc_media_player_new_from_media():建立libvlc_media_player_t。libvlc_media_player_release():釋放libvlc_media_player_tlibvlc_media_release():釋放libvlc_media_t。libvlc_release():釋放libvlc_instance_t。

可以已認證下面的函數控制媒體的播放或者暫停,這些函數都需要使用libvlc_media_player_t作為參數。這裡處于簡化的目的,隻使用了播放和停止函數:

libvlc_media_player_play():播放。libvlc_media_player_pause():暫停。libvlc_media_player_stop():停止。

除了上述3個函數之外,還包括libvlc_media_player_set_position()等函數,這裡不再一一記錄。

幾點注意事項

libvlc_media_t的建立

建立libvlc_media_t有兩種方法:libvlc_media_new_path()和libvlc_media_new_location()。簡單描述一下這兩個函數的差別:libvlc_media_new_location()用于打開協定,而libvlc_media_new_path()用于打開檔案。因而傳遞給libvlc_media_new_path()的就是普通的檔案路徑(絕對路徑例如D:\xxx.flv,或者相對路徑例如xxx.flv),而傳遞給libvlc_media_new_location()的就是協定位址(例如“udp://….”,“http://”)。但是這裡有一點需要注意,在VLC中“檔案”也屬于一種廣義上的“協定”。是以使用libvlc_media_new_location()也可以打開檔案,但是必須在檔案路徑前面加上“檔案協定”的标記“file:///”。例如打開“F:\movie\cuc_ieschool.flv”下的視訊,實際使用的代碼如下所示。

把libVLC的彈出視窗嵌入到程式中

在這裡我隻實踐過Windows下把libVLC的彈出視窗嵌入到程式中。将視窗或者控件的句柄傳遞給libvlc_media_player_set_hwnd()函數即可。

這裡有一點需要注意,如果把libVLC彈出視窗嵌入到程式中的話,“全屏”功能就不能使用了。

關于libVLC加載的問題

在libVLC中可以通過libvlc_media_player_get_length(),libvlc_video_get_width(),libvlc_video_get_height()等函數擷取到視訊的時長,寬,高等資訊。但是有一個很奇怪的現象:如果在調用完libvlc_media_player_play()之後立即調用上述3個函數的話,傳回的值都是0,隻有“等待”一段時間(例如調用sleep())後再調用上述函數,才能得到正确的數值。對于這種現象,我覺得可能是libVLC加載完成之後,才能通過上述幾個函數獲得正确的值(自己推測的,還沒有深究)。

代碼

[cpp] ​​view plain​​ ​​copy​​

  1. /** 
  2.  * 最簡單的基于libVLC的播放器 
  3.  * Simplest libVLC Player 
  4.  * 
  5.  * 雷霄骅 Lei Xiaohua 
  6.  * [email protected] 
  7.  * 中國傳媒大學/數字電視技術 
  8.  * Communication University of China / Digital TV Technology 
  9.  * http://blog.csdn.net/leixiaohua1020 
  10.  * 本程式是一個最簡單的基于libVLC的視訊播放器。 
  11.  * 适合初學者學習libVLC。 
  12.  * This example is the simplest Video Player based on libVLC. 
  13.  * Suitable for the beginner of libVLC. 
  14.  */  
  15. #include <Windows.h>  
  16. #include "vlc/vlc.h"  
  17. int main(int argc, char* argv[])  
  18.  {  
  19.      libvlc_instance_t * inst;  
  20.      libvlc_media_player_t *mp;  
  21.      libvlc_media_t *m;  
  22.      libvlc_time_t length;  
  23.      int width;  
  24.      int height;  
  25.      int wait_time=5000;  
  26.      //libvlc_time_t length;  
  27.      /* Load the VLC engine */  
  28.      inst = libvlc_new (0, NULL);  
  29.      //Create a new item  
  30.      //Method 1:  
  31.      //m = libvlc_media_new_location (inst, "file:///F:\\movie\\cuc_ieschool.flv");  
  32.      //Screen Capture  
  33.      //m = libvlc_media_new_location (inst, "screen://");  
  34.      //Method 2:  
  35.      m = libvlc_media_new_path (inst, "cuc_ieschool.flv");  
  36.      /* Create a media player playing environement */  
  37.      mp = libvlc_media_player_new_from_media (m);  
  38.      /* No need to keep the media now */  
  39.      libvlc_media_release (m);  
  40.      // play the media_player  
  41.      libvlc_media_player_play (mp);  
  42.      //wait until the tracks are created  
  43.      _sleep (wait_time);  
  44.      length = libvlc_media_player_get_length(mp);  
  45.      width = libvlc_video_get_width(mp);  
  46.      height = libvlc_video_get_height(mp);  
  47.      printf("Stream Duration: %ds\n",length/1000);  
  48.      printf("Resolution: %d x %d\n",width,height);  
  49.      //Let it play   
  50.      _sleep (length-wait_time);   
  51.      // Stop playing  
  52.      libvlc_media_player_stop (mp);  
  53.      // Free the media_player  
  54.      libvlc_media_player_release (mp);  
  55.      libvlc_release (inst);  
  56.      return 0;  
  57.  }  

運作結果

繼續閱讀