VC++MFC使用VLC实现窗体中播放流媒体、磁盘视频文件完整例程--全部代码可下载

VLC 是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD、音频 CD、VCD 及各类流媒体协议。如果想在自己的程序中实现视频播放,使用VLC SDK可以说是一个简单高效的方案。

VLC SDK在以前的版本中包含在VLC的安装目录下SDK文件夹中,后来基于大多数人只需要播放器而非开发者的原因,VLC安装包中不再包含SDK。

学习VLC SDK最好还是去官方网站,国内文章大部分就是简单翻译一下而已:        VLC Developers Corner

一、下载使用VLC SDK

根据官方说法,SDK在7-ZIP压缩包中找SDK文件夹:

VC++MFC使用VLC实现窗体中播放流媒体、磁盘视频文件完整例程--全部代码可下载_第1张图片

 在VLC官方下载页面最下方可以找到完全版链接,虽然链接是旧版本,实际上包含最新版本:

VC++MFC使用VLC实现窗体中播放流媒体、磁盘视频文件完整例程--全部代码可下载_第2张图片

VC++MFC使用VLC实现窗体中播放流媒体、磁盘视频文件完整例程--全部代码可下载_第3张图片

 本人下载的是最新版3.0.17.4:

 也可以直接访问官方ftp下载:各版本FTP下载地址

点开相应版本后可选择不同的操作系统,然后下载7或zip文件解压后可找到SDK目录。

在VS中创建一个基于对话框的工程,添加两个按钮一个播放一个停止,一个PIC控件ID:IDC_PIC用于作为视频输出窗口,一个静态控件ID:IDC_MEDIA_STATE用于显示播放状态。运行如下图:

VC++MFC使用VLC实现窗体中播放流媒体、磁盘视频文件完整例程--全部代码可下载_第4张图片

 将VLC中SDK目录拷贝到项目所在文件夹中,包括plugins文件夹和连个动态库文件:

VC++MFC使用VLC实现窗体中播放流媒体、磁盘视频文件完整例程--全部代码可下载_第5张图片

 添加附加包含目录SDk\include\vlc\plugins;sdk\include\vlc;附加库文件目录添加sdk\lib;添加库文件libvlc.lib;libvlccore.lib;修改配置属性-常规-字符集为:使用多字节字符集。

在对话框头文件中加入:

typedef SSIZE_T ssize_t;
#include "vlc.h"

二、加入VLC LIB有几个要注意的问题:

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 ,原因是这个头文件在linux环境中才有,这一句注释掉不影响,否则编译出错。

三、实现窗体播放并显示播放信息

剩下的就按照官方例程代码搞就是了,先定义对象变量,在对话框头文件中:

	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。

播放网络流如图:

VC++MFC使用VLC实现窗体中播放流媒体、磁盘视频文件完整例程--全部代码可下载_第6张图片

 播放本地文件如图(播放结束状态):

VC++MFC使用VLC实现窗体中播放流媒体、磁盘视频文件完整例程--全部代码可下载_第7张图片

停止播放按钮代码:

	  /* 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文件基本都要用到。

VC++MFC使用VLC实现窗体中播放流媒体、磁盘视频文件完整例程--全部代码可下载_第8张图片

 完整的代码(包括VLC_Lib)下载:

链接:https://pan.baidu.com/s/12SBaDT-7-JJ6ti3BQ_b1yw 
提取码:1029 
直接执行vlc_test.exe可播放目录内示例视频1666957294.mov:

VC++MFC使用VLC实现窗体中播放流媒体、磁盘视频文件完整例程--全部代码可下载_第9张图片

你可能感兴趣的:(VC++编程技巧,VLC_LIB编程,visual,studio,c++,实时音视频,学习)