1. 程式人生 > >最簡單的基於libVLC的例子:最簡單的基於libVLC的視訊播放器

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

=====================================================

最簡單的基於libVLC的例子文章列表:

=====================================================

本文記錄使用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/lib
3.標頭檔案*.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_t
libvlc_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_media_new_location (inst, "file:///F:\\movie\\cuc_ieschool.flv");
此外,VLC還支援很多“神奇”的協議,比如輸入“screen://”協議就可以進行螢幕錄製,程式碼如下。
libvlc_media_new_location (inst, "screen://");

把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載入完成之後,才能通過上述幾個函式獲得正確的值(自己推測的,還沒有深究)。

程式碼

/**
 * 最簡單的基於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;
 }

執行結果

程式執行後,會彈出一個視窗播放“cuc_ieschool.flv”檔案。

下載

Simplest libVLC Example

專案主頁


本工程是包含了一些基於libVLC的示例程式。一共包含了如下幾個子程式。
playerGUI: 最簡單的基於libVLC的播放器-圖形介面版。
simplest_libvlc_example: 最簡單的基於libVLC的播放器。
simplest_libvlc_streamer: 最簡單的基於libVLC的推流器。