在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,则表示视频已经播放完了。

用C/C++开发基于VLC SDK的视频播放器的更多相关文章

  1. (转)薛飞 基于VLC的Unity视频播放器(二)

    转自:http://www.manew.com/thread-144229-1-1.html 留个记录.

  2. 仿迅雷播放器教程 -- 基于VLC的MFC播放器 (6)

        代码下载:http://download.csdn.net/detail/qq316293804/6409417   昨天的教程里写着预计MFC播放器会隔得久一点,但是今晚仔细看了下VLC的常 ...

  3. 基于<最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)>的一些个人总结

    最近因为项目接近收尾阶段,所以变的没有之前那么忙了,所以最近重新拿起了之前的一些FFMPEG和SDL的相关流媒体播放器的例子在看. 同时自己也用FFMPEG2.01,SDL2.01结合MFC以及网上罗 ...

  4. 最简单的基于FFMPEG+SDL的视频播放器 ver2 (採用SDL2.0)

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  5. 最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  6. 用JavaCV改写“100行代码实现最简单的基于FFMPEG+SDL的视频播放器 ”

    FFMPEG的文档少,JavaCV的文档就更少了.从网上找到这篇100行代码实现最简单的基于FFMPEG+SDL的视频播放器.地址是http://blog.csdn.net/leixiaohua102 ...

  7. 100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)【转】

    转自:http://blog.csdn.net/leixiaohua1020/article/details/8652605 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] ...

  8. 封装:WPF基于MediaElement封装的视频播放器

    原文:封装:WPF基于MediaElement封装的视频播放器 一.目的:应用MediaElement创建媒体播放器 二.效果图 三.目前支持功能 播放.暂停.停止.快进.快退.声音大小.添加播放列表 ...

  9. 最简单的基于FFMPEG+SDL的视频播放器:拆分-解码器和播放器

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

随机推荐

  1. Unity3D 相关项目代码

    一.Application.PresistentDataPath 注意最后面是没有/的 public static string PresistentDataPathForEditor = " ...

  2. MessageBox.Show()如何换行

    MessageBox.Show("你好!\n\r可以使用", "换行");

  3. hdu 4038 Stone

    思路: 如果负数的个数为偶数则不必改变,为奇数就将最大负数变为正: 对于正数,尽量将1,2变为3即可. 代码如下: #include<cstring> #include<iostre ...

  4. Floodlight 防火墙是如何起作用的

    前言 用mininet + floodlight搭建好环境之后,运行flooglight,然后在mininet中建立网络拓扑,建好之后,pingall,所有host之间可以ping通. 然后向控制器f ...

  5. JDK安装配置问题

    JDK安装过程中会有两个安装提示,一个是jdk的安装,一个是jre的安装

  6. Hibernate逍遥游记-第13章 映射实体关联关系-004双向多对多(inverse="true")

    1. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hi ...

  7. 机器学习 —— 概率图模型(Homework: Representation)

    前两周的作业主要是关于Factor以及有向图的构造,但是概率图模型中还有一种更强大的武器——双向图(无向图.Markov Network).与有向图不同,双向图可以描述两个var之间相互作用以及联系. ...

  8. Android 学习(一)

    这几天被一些功能折磨的要死了,于是放下了这个,看点其它的东西,算是转移一下焦点.床头放了不少书籍,也都被翻阅过,翻阅过,却不曾细细的品味过,俗话说,书可借而不可买也,这话用到自己的身上丝毫不错.因为是 ...

  9. QTP不能打开或者新建FunctionLibrary的解决方法

    今天打开QTP,然后打开function library的时候,qtp窗口右下角一直都是open...状态,怀疑是qtp与其他的软件冲突了. 解决方法: 直接执行QTP安装程序,然后选择修复QTP,问 ...

  10. ios ableviewcell的动态加载数据,模仿喜马拉雅动态数据加载

    iphone(UITableViewCell)动态加载图片http://developer.apple.com/library/ios/#samplecode/LazyTableImages/Intr ...