用C/C++开发基于VLC SDK的视频播放器
睿丰德科技 专注RFID识别技术和条码识别技术与管理软件的集成项目。质量追溯系统、MES系统、金蝶与条码系统对接、用友与条码系统对接

之后 就是完整的代码: #include <stdio.h> #include <tchar.h> #include <time.h> #include <windows.h> #include <vlc/vlc.h> #pragma comment(lib, "libvlc.lib") #pragma comment(lib, "libvlccore.lib") int main(int argc, char* argv[]) { libvlc_instance_t * vlc_ins = NULL; libvlc_media_player_t * vlc_player = NULL; libvlc_media_t * vlc_media = NULL; const char * vlc_args[] = { "-I", "dummy", "--ignore-config", "--extraintf=logger", "--verbose=2", }; // 创建一个VLC实例 vlc_ins = libvlc_new(sizeof(vlc_args)/sizeof(vlc_args[0]), vlc_args); if(vlc_ins != NULL) { // 创建一个VLC播放器 vlc_player = libvlc_media_player_new(vlc_ins); if(vlc_player != NULL) { // 通过文件路径创建一个媒体实例,这里是我的测试文件 vlc_media = libvlc_media_new_path(vlc_ins, "d:\\clips\\org.mp4"); if(vlc_media != NULL) { // 解析媒体实例 libvlc_media_parse(vlc_media); // 获取媒体文件的播放长度, 返回 ms libvlc_time_t duration = libvlc_media_get_duration(vlc_media); // 此处是获取媒体包含多个的视频和音频轨以及其他类型的轨道信息 libvlc_media_track_info_t *media_tracks = NULL; int trackCount = libvlc_media_get_tracks_info(vlc_media, &media_tracks); // 这里是释放内存,但我测试的时候会有问题,还没仔细研究是为何 // free(media_tracks); // crash? // 把打开的媒体文件设置给播放器 libvlc_media_player_set_media(vlc_player, vlc_media); // 因为是windows系统,所以需要设置一个HWND给播放器作为窗口,这里就直接使用桌面窗口,这里仅是测试 libvlc_media_player_set_hwnd(vlc_player, ::GetDesktopWindow()); // 开始播放视频 libvlc_media_player_play(vlc_player); // 这里仅是为了打印一些信息出来,20秒后退出 time_t last_time = time(NULL); while((time(NULL) < (last_time + 20))) { Sleep(10); // 获取当前播放位置 libvlc_time_t play_time = libvlc_media_player_get_time(vlc_player); printf("playing time : %lld ms\r", (__int64)(play_time)); // 获取媒体的状态 // libvlc_state_t media_state = libvlc_media_get_state(vlc_media); // printf("\nmedia state : %d\n", (int)(media_state)); } // 停止 libvlc_media_player_stop(vlc_player); // 释放 libvlc_media_release(vlc_media); } // 释放 libvlc_media_player_release(vlc_player); }
// 释放 libvlc_release(vlc_ins); } return 0; } 编译运行,就可以在桌面上看到播放的视频了,用VLC SDK做自己的播放器是如此的简单。 VLC SDK 怎么知道VLC 已经播放结束,急。
我已经用VLC SDK 嵌入到MFC中,能播放视频,但是想知道视频播放的状态,就是知道什么时候结束的。
------解决方案--------------------------------------------------------
里面有一个libvlc_media_player_get_state获取播放状态的函数,如果返回libvlc_Ended,则表示视频已经播放完了。RFID管理系统集成商 RFID中间件 条码系统中间层 物联网软件集成
在windows系统如果开发万能播放器,一般都是基本DirectShow来开发,开发也很简单,但缺点也很多,一个文件格式是否能够播放完全取决于你 是否安装了正确的解析器和解码器,即使现在有了万能解器安装包也会出现很多问题,不过自从很多开源软件的出现,比如大名鼎鼎的ffmpeg,vlc等,一 切都变得简单起来,基于ffmpeg sdk开发就不多介绍了,本文主要介绍基于 VLC SDK来开发自己的播放器,一切都是那么的简单.
1.先下载VLC player, http://www.videolan.org/vlc/, 安装的时候要安装开发库(SDK) 2.用VC 6.0/2003/2005/2008/2010 IDE均可开发自己的测试程序 3.创建一个控制台程序,当然创建一个窗口程序更好,由于只是为了关注于如何使用VLC SDK,所以都无所谓的 4.在工程中设置好vlc的 include和lib路径,一般VLC sdk路径是C:\Program Files\VideoLAN\VLC\sdk 5.复制libvlc.dll, libvlccore.dll,plugins目录到工程debug目录,如果是release需要复制到release目录,目录结构如图:
之后 就是完整的代码: #include <stdio.h> #include <tchar.h> #include <time.h> #include <windows.h> #include <vlc/vlc.h> #pragma comment(lib, "libvlc.lib") #pragma comment(lib, "libvlccore.lib") int main(int argc, char* argv[]) { libvlc_instance_t * vlc_ins = NULL; libvlc_media_player_t * vlc_player = NULL; libvlc_media_t * vlc_media = NULL; const char * vlc_args[] = { "-I", "dummy", "--ignore-config", "--extraintf=logger", "--verbose=2", }; // 创建一个VLC实例 vlc_ins = libvlc_new(sizeof(vlc_args)/sizeof(vlc_args[0]), vlc_args); if(vlc_ins != NULL) { // 创建一个VLC播放器 vlc_player = libvlc_media_player_new(vlc_ins); if(vlc_player != NULL) { // 通过文件路径创建一个媒体实例,这里是我的测试文件 vlc_media = libvlc_media_new_path(vlc_ins, "d:\\clips\\org.mp4"); if(vlc_media != NULL) { // 解析媒体实例 libvlc_media_parse(vlc_media); // 获取媒体文件的播放长度, 返回 ms libvlc_time_t duration = libvlc_media_get_duration(vlc_media); // 此处是获取媒体包含多个的视频和音频轨以及其他类型的轨道信息 libvlc_media_track_info_t *media_tracks = NULL; int trackCount = libvlc_media_get_tracks_info(vlc_media, &media_tracks); // 这里是释放内存,但我测试的时候会有问题,还没仔细研究是为何 // free(media_tracks); // crash? // 把打开的媒体文件设置给播放器 libvlc_media_player_set_media(vlc_player, vlc_media); // 因为是windows系统,所以需要设置一个HWND给播放器作为窗口,这里就直接使用桌面窗口,这里仅是测试 libvlc_media_player_set_hwnd(vlc_player, ::GetDesktopWindow()); // 开始播放视频 libvlc_media_player_play(vlc_player); // 这里仅是为了打印一些信息出来,20秒后退出 time_t last_time = time(NULL); while((time(NULL) < (last_time + 20))) { Sleep(10); // 获取当前播放位置 libvlc_time_t play_time = libvlc_media_player_get_time(vlc_player); printf("playing time : %lld ms\r", (__int64)(play_time)); // 获取媒体的状态 // libvlc_state_t media_state = libvlc_media_get_state(vlc_media); // printf("\nmedia state : %d\n", (int)(media_state)); } // 停止 libvlc_media_player_stop(vlc_player); // 释放 libvlc_media_release(vlc_media); } // 释放 libvlc_media_player_release(vlc_player); }
// 释放 libvlc_release(vlc_ins); } return 0; } 编译运行,就可以在桌面上看到播放的视频了,用VLC SDK做自己的播放器是如此的简单。 VLC SDK 怎么知道VLC 已经播放结束,急。
我已经用VLC SDK 嵌入到MFC中,能播放视频,但是想知道视频播放的状态,就是知道什么时候结束的。
------解决方案--------------------------------------------------------
里面有一个libvlc_media_player_get_state获取播放状态的函数,如果返回libvlc_Ended,则表示视频已经播放完了。RFID管理系统集成商 RFID中间件 条码系统中间层 物联网软件集成