vlc 嵌入到 MFC 使用步骤以及相关问题解决方法
来源:互联网 发布:淘宝买刀犯法吗 编辑:程序博客网 时间:2024/05/18 00:50
本文仅供入门使用
使用的VLC版本 vlc-2.1.3-win32.exe
使用的vs版本 vs2008 sp1
首先到官网下载 VLC media player
安装完成后,在安装目录下面有我们需要的开发环境
将libvlc.lib和libvlccore.lib 导入工程
还有libvlc.dll 和 libvlccore.dll
另外头文件在include文件夹下面
不会导入的请先在工程目录下建立个lib文件夹,把2个lib复制过去,将include文件夹下的vlc文件夹复制到工程目录下,把2个dll复制到你的debug文件夹下(如果你是debug编译工程的话)然后将下面的添加到stdafx.h里面
#include ".\\vlc\\vlc.h"
#pragma comment(lib, ".\\lib\\libvlc.lib")
#pragma comment(lib, ".\\lib\\libvlccore.lib")
#pragma comment(lib, ".\\lib\\libvlc.lib")
#pragma comment(lib, ".\\lib\\libvlccore.lib")
这样环境就搭好了(这种方式release会报错,请翻到最后看解决方法)
我们写一个简单的vlc类
class CMyVLC{public:CMyVLC();~CMyVLC();public:void Play(HWND hwnd);private:libvlc_instance_t*m_vlcInst;libvlc_media_player_t*m_vlcMplay;libvlc_media_t*m_vlcMedia;};
来自CODE的代码片MyVLC.h
#include "stdafx.h"#include "MyVLC.h"CMyVLC::CMyVLC(){m_vlcMedia = NULL;m_vlcMplay = NULL;const char* const m_vlcArgs[] = {"-I", "dummy","--ignore-config",};m_vlcInst = libvlc_new(sizeof(m_vlcArgs) / sizeof(m_vlcArgs[0]), m_vlcArgs);}CMyVLC::~CMyVLC(){if(m_vlcMplay){libvlc_media_player_release(m_vlcMplay);m_vlcMplay = NULL;}if(m_vlcInst){libvlc_release(m_vlcInst);m_vlcInst = NULL;}}void CMyVLC::Play(HWND hwnd){/*如果要使用本地地址的话,请使用libvlc_media_new_path函数*/m_vlcMedia = libvlc_media_new_location(m_vlcInst, "rtsp://192.168.1.101:8554/aaa");m_vlcMplay = libvlc_media_player_new (m_vlcInst);libvlc_media_player_set_media (m_vlcMplay, m_vlcMedia);libvlc_media_release(m_vlcMedia);libvlc_media_player_set_hwnd(m_vlcMplay,hwnd);libvlc_media_player_play(m_vlcMplay);}
来自CODE的代码片MyVLC.cpp
要使用的话只需要实例化一个对象,然后调用唯一的接口play就好了,当然你要传入句柄……
效果就是句柄的窗口播放你设定的视频或流
终于要编译了,但是编译器报出找不到包含文件的错误,明明从官网下的啊,怎么回事?然后你定位到报错的地方
看到了这个
#include <vlc/libvlc_structures.h>
然后你检查了下vlc下面的文件,有这个头文件啊
突然灵光一闪发现是<>不是引号,这怎么可以?
难道要全部改掉吗?当然不用,只需要 项目-》项目属性-》配置属性-》c/c++-》常规-》附加包含目录,把刚才vlc的目录添加进去就可以啦。
如果你是用的我上面提供的引用头文件的方法,那么只要写个 ./ 就好了(就一个点和反斜杠)。
然后按下F5,不过vs又报错了,心头一阵火大,vs难道是猴子派来的逗13吗?
赶紧定位,然后发现了
#include <stdint.h>
然后找了找,发现没有这个头文件,然后又去网上搜索了一下,发现
stdint.h是c99中引进的一个标准C库的头文件
那好,既然这样,就去下载一个吧,然后放到vlc文件目录下。
- /* stdint.h standard header */
- #pragma once
- #ifndef _STDINT
- #define _STDINT
- #ifndef RC_INVOKED
- #include <yvals.h>
- /* NB: assumes
- byte has 8 bits
- long is 32 bits
- pointer can convert to and from long long
- long long is longest type
- */
- _C_STD_BEGIN
- /* TYPE DEFINITIONS */
- typedef signed char int8_t;
- typedef short int16_t;
- typedef int int32_t;
- typedef unsigned char uint8_t;
- typedef unsigned short uint16_t;
- typedef unsigned int uint32_t;
- typedef signed char int_least8_t;
- typedef short int_least16_t;
- typedef int int_least32_t;
- typedef unsigned char uint_least8_t;
- typedef unsigned short uint_least16_t;
- typedef unsigned int uint_least32_t;
- typedef char int_fast8_t;
- typedef int int_fast16_t;
- typedef int int_fast32_t;
- typedef unsigned char uint_fast8_t;
- typedef unsigned int uint_fast16_t;
- typedef unsigned int uint_fast32_t;
- #ifndef _INTPTR_T_DEFINED
- #define _INTPTR_T_DEFINED
- #ifdef _WIN64
- typedef __int64 intptr_t;
- #else /* _WIN64 */
- typedef _W64 int intptr_t;
- #endif /* _WIN64 */
- #endif /* _INTPTR_T_DEFINED */
- #ifndef _UINTPTR_T_DEFINED
- #define _UINTPTR_T_DEFINED
- #ifdef _WIN64
- typedef unsigned __int64 uintptr_t;
- #else /* _WIN64 */
- typedef _W64 unsigned int uintptr_t;
- #endif /* _WIN64 */
- #endif /* _UINTPTR_T_DEFINED */
- typedef _Longlong int64_t;
- typedef _ULonglong uint64_t;
- typedef _Longlong int_least64_t;
- typedef _ULonglong uint_least64_t;
- typedef _Longlong int_fast64_t;
- typedef _ULonglong uint_fast64_t;
- typedef _Longlong intmax_t;
- typedef _ULonglong uintmax_t;
- /* LIMIT MACROS */
- #define INT8_MIN (-0x7f - _C2)
- #define INT16_MIN (-0x7fff - _C2)
- #define INT32_MIN (-0x7fffffff - _C2)
- #define INT8_MAX 0x7f
- #define INT16_MAX 0x7fff
- #define INT32_MAX 0x7fffffff
- #define UINT8_MAX 0xff
- #define UINT16_MAX 0xffff
- #define UINT32_MAX 0xffffffff
- #define INT_LEAST8_MIN (-0x7f - _C2)
- #define INT_LEAST16_MIN (-0x7fff - _C2)
- #define INT_LEAST32_MIN (-0x7fffffff - _C2)
- #define INT_LEAST8_MAX 0x7f
- #define INT_LEAST16_MAX 0x7fff
- #define INT_LEAST32_MAX 0x7fffffff
- #define UINT_LEAST8_MAX 0xff
- #define UINT_LEAST16_MAX 0xffff
- #define UINT_LEAST32_MAX 0xffffffff
- #define INT_FAST8_MIN (-0x7f - _C2)
- #define INT_FAST16_MIN (-0x7fff - _C2)
- #define INT_FAST32_MIN (-0x7fffffff - _C2)
- #define INT_FAST8_MAX 0x7f
- #define INT_FAST16_MAX 0x7fff
- #define INT_FAST32_MAX 0x7fffffff
- #define UINT_FAST8_MAX 0xff
- #define UINT_FAST16_MAX 0xffff
- #define UINT_FAST32_MAX 0xffffffff
- #if _INTPTR == 0 || _INTPTR == 1
- #define INTPTR_MAX 0x7fffffff
- #define INTPTR_MIN (-INTPTR_MAX - _C2)
- #define UINTPTR_MAX 0xffffffff
- #else /* _INTPTR == 2 */
- #define INTPTR_MIN (-_LLONG_MAX - _C2)
- #define INTPTR_MAX _LLONG_MAX
- #define UINTPTR_MAX _ULLONG_MAX
- #endif /* _INTPTR */
- #define INT8_C(x) (x)
- #define INT16_C(x) (x)
- #define INT32_C(x) ((x) + (INT32_MAX - INT32_MAX))
- #define UINT8_C(x) (x)
- #define UINT16_C(x) (x)
- #define UINT32_C(x) ((x) + (UINT32_MAX - UINT32_MAX))
- #ifdef _WIN64
- #define PTRDIFF_MIN INT64_MIN
- #define PTRDIFF_MAX INT64_MAX
- #else /* _WIN64 */
- #define PTRDIFF_MIN INT32_MIN
- #define PTRDIFF_MAX INT32_MAX
- #endif /* _WIN64 */
- #define SIG_ATOMIC_MIN INT32_MIN
- #define SIG_ATOMIC_MAX INT32_MAX
- #ifndef SIZE_MAX
- #ifdef _WIN64
- #define SIZE_MAX UINT64_MAX
- #else /* _WIN64 */
- #define SIZE_MAX UINT32_MAX
- #endif /* _WIN64 */
- #endif /* SIZE_MAX */
- #define WCHAR_MIN 0
- #define WCHAR_MAX 0xffff
- #define WINT_MIN 0x0000
- #define WINT_MAX 0xffff
- #define INT64_MIN (-0x7fffffffffffffff - _C2)
- #define INT64_MAX 0x7fffffffffffffff
- #define UINT64_MAX 0xffffffffffffffffU
- #define INT_LEAST64_MIN (-0x7fffffffffffffff - _C2)
- #define INT_LEAST64_MAX 0x7fffffffffffffff
- #define UINT_LEAST64_MAX 0xffffffffffffffffU
- #define INT_FAST64_MIN (-0x7fffffffffffffff - _C2)
- #define INT_FAST64_MAX 0x7fffffffffffffff
- #define UINT_FAST64_MAX 0xffffffffffffffffU
- #define INTMAX_MIN (-0x7fffffffffffffff - _C2)
- #define INTMAX_MAX 0x7fffffffffffffff
- #define UINTMAX_MAX 0xffffffffffffffffU
- #define INT64_C(x) ((x) + (INT64_MAX - INT64_MAX))
- #define UINT64_C(x) ((x) + (UINT64_MAX - UINT64_MAX))
- #define INTMAX_C(x) INT64_C(x)
- #define UINTMAX_C(x) UINT64_C(x)
- _C_STD_END
- #endif /* RC_INVOKED */
- #endif /* _STDINT */
- #if defined(_STD_USING)
- using _CSTD int8_t; using _CSTD int16_t;
- using _CSTD int32_t; using _CSTD int64_t;
- using _CSTD uint8_t; using _CSTD uint16_t;
- using _CSTD uint32_t; using _CSTD uint64_t;
- using _CSTD int_least8_t; using _CSTD int_least16_t;
- using _CSTD int_least32_t; using _CSTD int_least64_t;
- using _CSTD uint_least8_t; using _CSTD uint_least16_t;
- using _CSTD uint_least32_t; using _CSTD uint_least64_t;
- using _CSTD intmax_t; using _CSTD uintmax_t;
- using _CSTD uintptr_t;
- using _CSTD intptr_t;
- using _CSTD int_fast8_t; using _CSTD int_fast16_t;
- using _CSTD int_fast32_t; using _CSTD int_fast64_t;
- using _CSTD uint_fast8_t; using _CSTD uint_fast16_t;
- using _CSTD uint_fast32_t; using _CSTD uint_fast64_t;
- #endif /* defined(_STD_USING) */
- /*
- * Copyright (c) 1992-2009 by P.J. Plauger. ALL RIGHTS RESERVED.
- * Consult your license regarding permissions and restrictions.
- V5.20:0009 */
当然,要将定位的地方的<>改为引号
当你松了一口气,以为终于可以看到视频的时候,vs又无情的提示你出错了,竟然说什么多次宏定义
虽然是个警告,但是这怎么能忍受
定位到
- #define WCHAR_MIN 0
经历了千辛万苦,终于看到了,泪都要掉下来了
然后要让不明真相的小伙伴炫耀炫耀,大手一切release编译,然后发布上传,多好的节奏
然后vs又跳出来告诉你
当时就想xx*%^&2@1(&7#
不过问题总是要解决的,经过不懈的搜索,找出了原因所在,反正就是用的那个库文件libvlc.lib要自己编译,不能用安装目录下自带的
下面附上编译方法
首先,开始到开始菜单里vs下面找到Visual Studio 2008 命令提示,点进去,执行下面3句。假定你的vlc安装目录是 【C:\Program Files\VideoLAN】,不是的话自己替换
dumpbin /exports "C:\Program Files\VideoLAN\VLC\libvlc.dll" > "C:\Program Files\VideoLAN\VLC\libvlc.def"
echo EXPORTS > libvlc.deffor /f "usebackq tokens=4,* delims=_ " %i in (`dumpbin /exports "c:\Program Files\VideoLan\VLC\libvlc.dll"`) do if %i==libvlc echo %i_%j >> libvlc.def
lib /def:"C:\Program Files\VideoLAN\VLC\libvlc.def" /out:"C:\Program Files\VideoLAN\VLC\libvlc.lib" /machine:x86
然后将生产的lib文件替换掉工程里面的libvlc.lib,再重新编译一次就ok了
0 0
- vlc 嵌入到 MFC 使用步骤以及相关问题解决方法
- Eclipse连接Hadoop步骤以及相关问题解决
- OGRE嵌入到MFC
- OGRE嵌入到MFC
- OGRE嵌入到MFC
- [转载]在MFC窗口中嵌入VLC ActiveX控件
- 将KlayGE嵌入到MFC
- 嵌入CEF到MFC程序
- win7共享文件步骤以及权限不足问题解决方法
- mysql5.1升级5.6步骤以及出现问题解决方法
- Unity-Unity工程嵌入到Xcode原生工程中的相关步骤
- 嵌入学习步骤及方法
- 移植VLC到arm板操作步骤
- CGAL window 10安装、Demo使用步骤以及问题解决记录
- GreenDao的使用及相关步骤方法
- cv::namedWindow, GLFWwindow以及其他程序嵌入到MFC中的教程
- CEF 嵌入到MFC的流程,包括启动CEF以及CEF程序的关闭流程。
- 在MFC中使用SDL2.0(SDL窗口嵌入到MFC中)
- 自己动手写处理器之第一阶段(2)——MIPS指令集架构的演变
- 【业界新闻】安防行业新技术受关注 传输存储是关键
- 新浪微博iOS平台SSO授权认证原理分析
- mysql命令详解
- Flash与cocos2dx的结合
- vlc 嵌入到 MFC 使用步骤以及相关问题解决方法
- ARM 预声明的核心寄存器及其别名
- Visual Prolog 的 Web 专家系统 (3)
- iOS App 自定义 URL Scheme 设计
- Silverlight图片相对路径的设置
- php利用socket函数模拟发送http请求
- 【业界新闻】全闪存阵列性能极高 但难以取代高端存储
- VLAN技术浅谈
- 使用 Java Native Interface 的最佳实践