在windows系统如果开发万能播放器,一般都是基本DirectShow来开发,开发也很简单,但缺点也很多,一个文件格式是否能够播放完全取决于你 是否安装了正确的解析器和解码器,即使现在有了万能解器安装包也会出现很多问题,不过自从很多开源软件的出现,比如大名鼎鼎的ffmpeg,vlc等,一 切都变得简单起来,基于ffmpeg sdk开发就不多介绍了,本文主要介绍基于 VLC SDK来开发自己的播放器,一切都是那么的简单.
1.先下载VLC player, , 安装的时候要安装开发库(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目录,目录结构如图:
#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[] =
vlc_ins = libvlc_new(sizeof(vlc_args)/sizeof(vlc_args[0]), vlc_args);
vlc_player = libvlc_media_player_new(vlc_ins);
// 通过文件路径创建一个媒体实例,这里是我的测试文件
vlc_media = libvlc_media_new_path(vlc_ins, "d:\\clips\\org.mp4");
libvlc_media_parse(vlc_media);
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);
time_t last_time = time(NULL);
while((time(NULL) < (last_time + 20)))
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);
编译运行,就可以在桌面上看到播放的视频了,用VLC SDK做自己的播放器是如此的简单。
VLC SDK 怎么知道VLC 已经播放结束,急。
我已经用VLC SDK 嵌入到MFC中,能播放视频,但是想知道视频播放的状态,就是知道什么时候结束的。
------解决方案--------------------------------------------------------
里面有一个libvlc_media_player_get_state获取播放状态的函数,如果返回libvlc_Ended,则表示视频已经播放完了。