VLC SDK在VS2010中的配置及簡單使用舉例

1.        從http://www.videolan.org/vlc/download-windows.html下載vlc-2.2.0-win32.7z,解壓縮;

2.        新建一個VLCtest控制檯工程;

3.        將/vlc-2.2.0-win32/vlc-2.2.0/sdk/include添加到工程屬性中,C/C++ -->General --> Additional Include Directories;

4.        將/vlc-2.2.0-win32/vlc-2.2.0/中的libvlc.lib、libvlc.dll、libvlccore.lib、libvlccore.dll及plugins目錄拷貝到工程執行目錄下;

5.        VLCtest工程中各個文件的代碼爲:

stdafx.h:

  1. #pragma once  
  2.   
  3. #include "targetver.h"  
  4.   
  5. #include <stdio.h>  
  6. #include <time.h>  
  7. #include <windows.h>  
  8.   
  9. #include <vlc/vlc.h>  

stdafx.cpp:
  1. #include "stdafx.h"  
  2.   
  3. #ifdef _DEBUG  
  4.     #pragma comment(lib, "../../../lib/dbg/x86_vc10/libvlc.lib")  
  5.     #pragma comment(lib, "../../../lib/dbg/x86_vc10/libvlccore.lib")  
  6. #else  
  7.     #pragma comment(lib, "../../../lib/rel/x86_vc10/libvlc.lib")  
  8.     #pragma comment(lib, "../../../lib/rel/x86_vc10/libvlccore.lib")  
  9. #endif  

VLCtest.cpp:
  1. #include "stdafx.h"  
  2. #include <iostream>  
  3.   
  4. using namespace std;  
  5.   
  6. void test1()  
  7. {     
  8.     libvlc_instance_t* vlc_ins    = NULL;  
  9.     libvlc_media_player_t* vlc_player = NULL;  
  10.     libvlc_media_t* vlc_media  = NULL;  
  11.   
  12.     const char* vlc_args[] = {"-I""dummy""--ignore-config""--extraintf=logger""--verbose=2"};    
  13.       
  14.     //創建一個VLC實例,release版本在此處會crash  
  15.     vlc_ins = libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args);  
  16.   
  17.     if (vlc_ins != NULL) {  
  18.         //創建一個VLC播放器  
  19.         vlc_player = libvlc_media_player_new(vlc_ins);  
  20.   
  21.         if (vlc_player != NULL) {  
  22.             //通過文件路徑創建一個媒體實例  
  23.             vlc_media = libvlc_media_new_path(vlc_ins, "f:\\photo\\WP_20140405_002.mp4");  
  24.   
  25.             if (vlc_media != NULL) {  
  26.                 //解析媒體實例  
  27.                 libvlc_media_parse(vlc_media);  
  28.   
  29.                 //獲取媒體文件的播放長度,返回ms  
  30.                 libvlc_time_t duration = libvlc_media_get_duration(vlc_media);  
  31.   
  32.                 //此處是獲取媒體包含多個的視頻和音頻軌以及其它類型的軌道信息  
  33.                 libvlc_media_track_info_t* media_tracks = NULL;  
  34.                 int trackCount = libvlc_media_get_tracks_info(vlc_media, &media_tracks);  
  35.   
  36.                 //這裏是釋放內存,但我測試的時候會有問題,還沒仔細研究是爲何  
  37.                 //free(media_tracks);  //crash?  
  38.   
  39.                 //把打開的媒體文件設置給播放器  
  40.                 libvlc_media_player_set_media(vlc_player, vlc_media);  
  41.   
  42.                 // 因爲是windows系統,所以需要設置一個HWND給播放器作爲窗口,這裏就直接使用桌面窗口,這裏僅是測試  
  43.                 libvlc_media_player_set_hwnd(vlc_player, ::GetDesktopWindow());  
  44.   
  45.                 //開始播放視頻  
  46.                 libvlc_media_player_play(vlc_player);  
  47.   
  48.                 //這裏僅是爲了打印一些信息出來,20秒後退出  
  49.                 time_t last_time = time(NULL);  
  50.   
  51.                 while ((time(NULL) < (last_time + 20))) {  
  52.                     Sleep(10);  
  53.                     //獲取當前播放位置  
  54.                     libvlc_time_t play_time = libvlc_media_player_get_time(vlc_player);  
  55.                     printf("playing time : %lld ms\r", (__int64)(play_time));  
  56.   
  57.                     //獲取媒體的狀態  
  58.                     //libvlc_state_t media_state = libvlc_media_get_state(vlc_media);  
  59.                     //printf("\nmedia state : %d\n", (int)(media_state));  
  60.                 }     
  61.                 libvlc_media_player_stop(vlc_player);//停止  
  62.                 libvlc_media_release(vlc_media);//釋放  
  63.             }  
  64.             libvlc_media_player_release(vlc_player);//釋放  
  65.         }  
  66.         libvlc_release(vlc_ins);//釋放  
  67.     }  
  68. }  
  69.   
  70. void test2()  
  71. {  
  72.     libvlc_instance_t* inst;  
  73.     libvlc_media_player_t* mp;  
  74.     libvlc_media_t* m;  
  75.       
  76.     //init vlc modules, should be done only once  
  77.     inst = libvlc_new(0, NULL);  
  78.   
  79.     //Create a new item  
  80.     m = libvlc_media_new_path(inst, "f:\\photo\\WP_20140405_002.mp4");  
  81.   
  82.     //Create a media player playing environment  
  83.     mp = libvlc_media_player_new_from_media(m);  
  84.     libvlc_media_parse(m);  
  85.     libvlc_time_t duration = libvlc_media_get_duration(m);  
  86.   
  87.     //No need to keep the media now  
  88.     libvlc_media_release(m);  
  89. #if 0  
  90.     //This is a non working code that show how to hooks into a window,  
  91.     //if we have a window around  
  92.     //libvlc_drawable_t drawable = xdrawable;  
  93.     //or on windows  
  94.     void *drawable = &g_hwnd;  
  95.     libvlc_media_player_set_hwnd(mp, drawable);  
  96. #endif  
  97.     // play the media_player  
  98.     libvlc_media_player_play(mp);  
  99.   
  100.     Sleep((DWORD)duration); //Let it play a bit  
  101.   
  102.     //Stop playing  
  103.     libvlc_media_player_stop(mp);  
  104.   
  105.     // Free the media_player  
  106.     libvlc_media_player_release(mp);  
  107.     libvlc_release(inst);  
  108. }  
  109.   
  110. int main(int argc, char* argv[])  
  111. {  
  112.     //test1();  
  113.     test2();  
  114.   
  115.     cout<<"ok!"<<endl;  
  116.     return 0;  
  117. }  

6.    經測試,test1()和test2()在Debug模式下均能正常運行,在Release下均會crash,均是執行到libvlc_new函數處有問題,具體原因還不清楚,後面會進一步分析。

說明:在Release下,將Linker->Optimization->References中的值由Yes (/OPT:REF)修改爲No (/OPT:NOREF),就可以在Release下執行了。

以上測試代碼來自於:

1.      http://blog.sina.com.cn/s/blog_62949ff40101edml.html 

2.      http://www.360doc.com/content/14/0309/10/2036337_358957305.shtml

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