VLC 是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD、音频 CD、VCD 及各类流媒体协议。如果想在自己的程序中实现视频播放,使用VLC SDK可以说是一个简单高效的方案。
VLC SDK在以前的版本中包含在VLC的安装目录下SDK文件夹中,后来基于大多数人只需要播放器而非开发者的原因,VLC安装包中不再包含SDK。
学习VLC SDK最好还是去官方网站,国内文章大部分就是简单翻译一下而已: VLC Developers Corner
根据官方说法,SDK在7-ZIP压缩包中找SDK文件夹:
在VLC官方下载页面最下方可以找到完全版链接,虽然链接是旧版本,实际上包含最新版本:
本人下载的是最新版3.0.17.4:
也可以直接访问官方ftp下载:各版本FTP下载地址
点开相应版本后可选择不同的操作系统,然后下载7或zip文件解压后可找到SDK目录。
在VS中创建一个基于对话框的工程,添加两个按钮一个播放一个停止,一个PIC控件ID:IDC_PIC用于作为视频输出窗口,一个静态控件ID:IDC_MEDIA_STATE用于显示播放状态。运行如下图:
将VLC中SDK目录拷贝到项目所在文件夹中,包括plugins文件夹和连个动态库文件:
添加附加包含目录SDk\include\vlc\plugins;sdk\include\vlc;附加库文件目录添加sdk\lib;添加库文件libvlc.lib;libvlccore.lib;修改配置属性-常规-字符集为:使用多字节字符集。
在对话框头文件中加入:
typedef SSIZE_T ssize_t;
#include "vlc.h"
1、在包含vlc.h前要加入typedef SSIZE_T ssize_t 这句 不加入会导致出错:error C2065: “libvlc_media_read_cb”: 未声明的标识符的错误。由于加入这句,所以要使用多字节字符集。
2、原始的vlc.h文件中包含有路径vlc,但是实际上其他头文件和vlc.h在同一级目录,可以建个目录把文件放里,也可以把vlc路径去掉,用查找替换很简单,本人使用的是后者:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
替换为:
#include "libvlc.h"
#include "libvlc_renderer_discoverer.h"
#include "libvlc_media.h"
#include "libvlc_media_player.h"
#include "libvlc_media_list.h"
#include "libvlc_media_list_player.h"
#include "libvlc_media_library.h"
#include "libvlc_media_discoverer.h"
#include "libvlc_events.h"
#include "libvlc_dialog.h"
#include "libvlc_vlm.h"
#include "deprecated.h"
3、找到libvlc_dialog.h,注释掉#include
剩下的就按照官方例程代码搞就是了,先定义对象变量,在对话框头文件中:
libvlc_instance_t * inst;
libvlc_media_player_t *mp;
libvlc_media_t *m;
在上面创建的播放按钮中添加播放代码:
/* Load the VLC engine */
inst = libvlc_new (0, NULL);
/* Create a new item */
/*添加流媒体URL*/
m = libvlc_media_new_location (inst, "rtsp://admin:a***@192.168.0.207:554/channel=0_stream=0&onvif=0.sdp?real_stream");
/*播放硬盘文件使用下面语句*/
//m = libvlc_media_new_path (inst, "d:\\1666957294.mov");
if(m==NULL)
{
GetDlgItem(IDC_MEDIA_STATE)->SetWindowText("创建媒体对象失败");
return;
}
/* Create a media player playing environement */
mp = libvlc_media_player_new_from_media (m);
/* No need to keep the media now */
libvlc_media_release (m);
/* This is a code that show how to hooks into a window */
libvlc_media_player_set_hwnd (mp, GetDlgItem(IDC_PIC)->GetSafeHwnd());
/* play the media_player */
libvlc_media_player_play (mp);
SetTimer(1,500,NULL);
这里例程是播放的IPC视频流,关于视频流地址的获取,见本人另一篇文章:onvif协议H265编码摄像机的rtsp地址获取
如果要播放本地文件,使用libvlc_media_new_path函数。开启一个定时器是为了更新播放状态,在类向导中添加定时器消息,加入代码:
void Cvlc_testDlg::OnTimer(UINT_PTR nIDEvent)
{
libvlc_state_t media_state = libvlc_media_get_state(m);
static int timeout=0;
CString str;
switch(media_state)
{
case libvlc_NothingSpecial:
str="NothingSpecial";
break;
case libvlc_Opening:
str="Opening";
timeout++;
if(timeout>6) //等待三秒
str="打开流媒体超时";
break;
case libvlc_Playing:
str="Playing";
break;
case libvlc_Paused:
str="Paused";
break;
case libvlc_Stopped:
str="Stopped";
break;
case libvlc_Ended:
str="Ended";
break;
case libvlc_Error:
str="Error";
break;
}
GetDlgItem(IDC_MEDIA_STATE)->SetWindowText(str);
CDialogEx::OnTimer(nIDEvent);
}
使用libvlc_state 定义状态变量media_state,该类型为枚举型,下面通过分支判断。
经测试,网络媒体流打开如果没有数据,状态为Opening,10秒后状态为Ended;如果打开本地文件不存在,状态为NothingSpecial然后转为 Ended。
播放网络流如图:
播放本地文件如图(播放结束状态):
停止播放按钮代码:
/* Stop playing */
libvlc_media_player_stop (mp);
/* Free the media_player */
libvlc_media_player_release (mp);
libvlc_release (inst);
KillTimer(1);
使用VLC LIB实现自己的播放器还是很简单的!
另外,VLC LIB中plugins目录较大,实际测试实现简单播放仅需要里面三个文件夹就够了,这三个文件夹也64兆,里面的dll文件基本都要用到。
链接:https://pan.baidu.com/s/12SBaDT-7-JJ6ti3BQ_b1yw
提取码:1029
直接执行vlc_test.exe可播放目录内示例视频1666957294.mov: