基於libVLC(VLC SDK)的視頻播放Demo


由於實習項目需要,最近在研究VLC Media Player,該播放器來源於École Centrale Paris(巴黎中央理工學校)的一個學術項目,名為VideoLAN,VLC意為VideoLAN Client。后發展為一個由志願者組成的非營利性組織,開發並提供免費、開源的多媒體解決方案。

我的工作是利用該播放器提供的開發工具libVLC來實現一個功能自定義的媒體播放器,使用C++語言。

在摸索的過程中參考了幾篇博客,也參考了官方給出的入門教程,所以說代碼不是問題。對我來說問題是如何配置VLC的開發環境。

經過幾番折騰,終於找到了一個可行的方案,下面按步驟來說明。

  Step 0:

    在VLC官網上下載最新的軟件安裝包;

    鏈接:http://www.videolan.org/vlc/index.html

    記住安裝目錄,定位sdk文件夾;

    

  Step 1:

    新建一個Win32控制台應用程序(本人在Visual Studio 2012下);

    

    簡單設置

    

  Step 2:

    在項目屬性設置頁面中,添加包含目錄;

    

    新建一行包含目錄;

    

    選擇sdk文件夾下的include文件夾;

    

    同理,添加庫目錄,路徑為sdk文件夾下的lib文件夾,設置后如下;

    

    設置附加依賴項;

    

    添加兩個庫文件vlclib.lib、vlclibcore.lib;

    

    

  Step 3:

    新建源文件,鍵入源代碼;

 1 #include <windows.h>
 2 #include <vlc/vlc.h>
 3 #include <time.h>
 4 
 5 int main(int argc, char* argv[])
 6 {
 7     libvlc_instance_t *     vlc_ins    = NULL;
 8     libvlc_media_player_t * vlc_player = NULL;
 9     libvlc_media_t *        vlc_media  = NULL;
10 
11     const char * vlc_args[] = 
12     {
13         "-I",
14         "dummy",
15         "--ignore-config",
16         "--extraintf=logger",
17         "--verbose=2", 
18     };  
19 
20     // 創建一個VLC實例
21     vlc_ins = libvlc_new(sizeof(vlc_args)/sizeof(vlc_args[0]), vlc_args);
22     if(vlc_ins != NULL)
23     {
24         // 創建一個VLC播放器
25         vlc_player = libvlc_media_player_new(vlc_ins);
26         if(vlc_player != NULL)
27         {
28             // 通過文件路徑創建一個媒體實例,這里是我的測試文件
29             vlc_media = libvlc_media_new_path(vlc_ins, "g:\\123.hlv");
30             if(vlc_media != NULL)
31             {
32                 // 解析媒體實例
33                 libvlc_media_parse(vlc_media);
34                 // 獲取媒體文件的播放長度,  返回 ms
35                 libvlc_time_t duration = libvlc_media_get_duration(vlc_media);
36 
37                 // 此處是獲取媒體包含多個的視頻和音頻軌以及其他類型的軌道信息
38                 libvlc_media_track_info_t *media_tracks = NULL;
39                 int trackCount = libvlc_media_get_tracks_info(vlc_media, &media_tracks);
40                 // 這里是釋放內存,但我測試的時候會有問題,還沒仔細研究是為何
41                 // free(media_tracks);  // crash?
42 
43                 // 把打開的媒體文件設置給播放器
44                 libvlc_media_player_set_media(vlc_player, vlc_media);
45 
46                 // 因為是windows系統,所以需要設置一個HWND給播放器作為窗口,這里就直接使用桌面窗口,這里僅是測試
47                 libvlc_media_player_set_hwnd(vlc_player, ::GetDesktopWindow());
48                 // 開始播放視頻
49                 libvlc_media_player_play(vlc_player);
50 
51                 // 這里僅是為了打印一些信息出來,20秒后退出
52                 time_t last_time = time(NULL);
53                 while((time(NULL) < (last_time + 200)))
54                 {
55                     Sleep(10);
56                     // 獲取當前播放位置
57                     libvlc_time_t play_time = libvlc_media_player_get_time(vlc_player);
58                     printf("playing time : %lld ms\r", (__int64)(play_time));
59 
60                     // 獲取媒體的狀態
61                     // libvlc_state_t media_state = libvlc_media_get_state(vlc_media);
62                     // printf("\nmedia state : %d\n", (int)(media_state));
63                 }
64                 // 停止
65                 libvlc_media_player_stop(vlc_player);
66                 // 釋放
67                 libvlc_media_release(vlc_media);
68             }
69             // 釋放
70             libvlc_media_player_release(vlc_player);
71         }
72         // 釋放
73         libvlc_release(vlc_ins);
74     }
75     return 0;
76 }

 

    參考鏈接1:http://blog.sina.com.cn/s/blog_62a8419a01014eey.html

    參考鏈接2:http://www.oschina.net/code/snippet_230937_45237

    參考鏈接3:https://wiki.videolan.org/LibVLC_Tutorial/

  Step 4:

    此時運行代碼會出現“core libvlc error: No plugin found”的錯誤。還需要手動導入VLC的plugin文件夾;

    進入VLC安裝路徑:C:\Program Files (x86)\VideoLAN\VLC\,將其下plugin文件夾拷貝至VS項目的Debug文件夾下;

    

    另外可能必要的操作是將VLC安裝目錄下的libvlc.dll以及libvlccore.dll拷貝至項目Debug路徑下,如上圖籃框;

 

  至此,設置完畢,運行項目,可以正常播放指定路徑下的本地視頻。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM