本文記錄使用libVLC的開發的最簡單的視訊播放器示例。VLC Media Player是一款優秀的播放器,但是由于它的源代碼編譯的難度比較大,一直沒有深入研究過它的開發方面的技術。此前觸到了一些VLC開發方面的東西,是以總結了一下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的視訊播放器的流程圖如下圖所示。
流程圖中包含了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
- /**
- * 最簡單的基于libVLC的播放器
- * Simplest libVLC Player
- *
- * 雷霄骅 Lei Xiaohua
- * [email protected]
- * 中國傳媒大學/數字電視技術
- * Communication University of China / Digital TV Technology
- * http://blog.csdn.net/leixiaohua1020
- * 本程式是一個最簡單的基于libVLC的視訊播放器。
- * 适合初學者學習libVLC。
- * This example is the simplest Video Player based on libVLC.
- * Suitable for the beginner of libVLC.
- */
- #include <Windows.h>
- #include "vlc/vlc.h"
- int main(int argc, char* argv[])
- {
- libvlc_instance_t * inst;
- libvlc_media_player_t *mp;
- libvlc_media_t *m;
- libvlc_time_t length;
- int width;
- int height;
- int wait_time=5000;
- //libvlc_time_t length;
- /* Load the VLC engine */
- inst = libvlc_new (0, NULL);
- //Create a new item
- //Method 1:
- //m = libvlc_media_new_location (inst, "file:///F:\\movie\\cuc_ieschool.flv");
- //Screen Capture
- //m = libvlc_media_new_location (inst, "screen://");
- //Method 2:
- m = libvlc_media_new_path (inst, "cuc_ieschool.flv");
- /* Create a media player playing environement */
- mp = libvlc_media_player_new_from_media (m);
- /* No need to keep the media now */
- libvlc_media_release (m);
- // play the media_player
- libvlc_media_player_play (mp);
- //wait until the tracks are created
- _sleep (wait_time);
- length = libvlc_media_player_get_length(mp);
- width = libvlc_video_get_width(mp);
- height = libvlc_video_get_height(mp);
- printf("Stream Duration: %ds\n",length/1000);
- printf("Resolution: %d x %d\n",width,height);
- //Let it play
- _sleep (length-wait_time);
- // Stop playing
- libvlc_media_player_stop (mp);
- // Free the media_player
- libvlc_media_player_release (mp);
- libvlc_release (inst);
- return 0;
- }