由于实习项目需要,最近在研究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路径下,如上图篮框;
至此,设置完毕,运行项目,可以正常播放指定路径下的本地视频。