vlc 嵌入到 MFC 使用步骤以及相关问题解决方法

本文仅供入门使用

使用的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")

这样环境就搭好了(这种方式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 ;
};

        
        
#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文件目录下。
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* stdint.h standard header */  
  2. #pragma once  
  3. #ifndef _STDINT  
  4. #define _STDINT  
  5. #ifndef RC_INVOKED  
  6. #include <yvals.h>  
  7.   
  8. /* NB: assumes 
  9.     byte has 8 bits 
  10.     long is 32 bits 
  11.     pointer can convert to and from long long 
  12.     long long is longest type 
  13.  */  
  14.   
  15. _C_STD_BEGIN  
  16.         /* TYPE DEFINITIONS */  
  17. typedef signed char int8_t;  
  18. typedef short int16_t;  
  19. typedef int int32_t;  
  20.   
  21. typedef unsigned char uint8_t;  
  22. typedef unsigned short uint16_t;  
  23. typedef unsigned int uint32_t;  
  24.   
  25. typedef signed char int_least8_t;  
  26. typedef short int_least16_t;  
  27. typedef int int_least32_t;  
  28.   
  29. typedef unsigned char uint_least8_t;  
  30. typedef unsigned short uint_least16_t;  
  31. typedef unsigned int uint_least32_t;  
  32.   
  33. typedef char int_fast8_t;  
  34. typedef int int_fast16_t;  
  35. typedef int int_fast32_t;  
  36.   
  37. typedef unsigned char uint_fast8_t;  
  38. typedef unsigned int uint_fast16_t;  
  39. typedef unsigned int uint_fast32_t;  
  40.   
  41. #ifndef _INTPTR_T_DEFINED  
  42.  #define _INTPTR_T_DEFINED  
  43.  #ifdef _WIN64  
  44. typedef __int64 intptr_t;  
  45.  #else /* _WIN64 */  
  46. typedef _W64 int intptr_t;  
  47.  #endif /* _WIN64 */  
  48. #endif /* _INTPTR_T_DEFINED */  
  49.   
  50. #ifndef _UINTPTR_T_DEFINED  
  51.  #define _UINTPTR_T_DEFINED  
  52.  #ifdef _WIN64  
  53. typedef unsigned __int64 uintptr_t;  
  54.  #else /* _WIN64 */  
  55. typedef _W64 unsigned int uintptr_t;  
  56.  #endif /* _WIN64 */  
  57. #endif /* _UINTPTR_T_DEFINED */  
  58.   
  59. typedef _Longlong int64_t;  
  60. typedef _ULonglong uint64_t;  
  61.   
  62. typedef _Longlong int_least64_t;  
  63. typedef _ULonglong uint_least64_t;  
  64.   
  65. typedef _Longlong int_fast64_t;  
  66. typedef _ULonglong uint_fast64_t;  
  67.   
  68. typedef _Longlong intmax_t;  
  69. typedef _ULonglong uintmax_t;  
  70.   
  71.         /* LIMIT MACROS */  
  72. #define INT8_MIN    (-0x7f - _C2)  
  73. #define INT16_MIN   (-0x7fff - _C2)  
  74. #define INT32_MIN   (-0x7fffffff - _C2)  
  75.   
  76. #define INT8_MAX    0x7f  
  77. #define INT16_MAX   0x7fff  
  78. #define INT32_MAX   0x7fffffff  
  79. #define UINT8_MAX   0xff  
  80. #define UINT16_MAX  0xffff  
  81. #define UINT32_MAX  0xffffffff  
  82.   
  83. #define INT_LEAST8_MIN      (-0x7f - _C2)  
  84. #define INT_LEAST16_MIN     (-0x7fff - _C2)  
  85. #define INT_LEAST32_MIN     (-0x7fffffff - _C2)  
  86.   
  87. #define INT_LEAST8_MAX      0x7f  
  88. #define INT_LEAST16_MAX     0x7fff  
  89. #define INT_LEAST32_MAX     0x7fffffff  
  90. #define UINT_LEAST8_MAX     0xff  
  91. #define UINT_LEAST16_MAX    0xffff  
  92. #define UINT_LEAST32_MAX    0xffffffff  
  93.   
  94. #define INT_FAST8_MIN       (-0x7f - _C2)  
  95. #define INT_FAST16_MIN      (-0x7fff - _C2)  
  96. #define INT_FAST32_MIN      (-0x7fffffff - _C2)  
  97.   
  98. #define INT_FAST8_MAX       0x7f  
  99. #define INT_FAST16_MAX      0x7fff  
  100. #define INT_FAST32_MAX      0x7fffffff  
  101. #define UINT_FAST8_MAX      0xff  
  102. #define UINT_FAST16_MAX     0xffff  
  103. #define UINT_FAST32_MAX     0xffffffff  
  104.   
  105.  #if _INTPTR == 0 || _INTPTR == 1  
  106. #define INTPTR_MAX          0x7fffffff  
  107. #define INTPTR_MIN          (-INTPTR_MAX - _C2)  
  108. #define UINTPTR_MAX         0xffffffff  
  109.   
  110.  #else /* _INTPTR == 2 */  
  111. #define INTPTR_MIN          (-_LLONG_MAX - _C2)  
  112. #define INTPTR_MAX          _LLONG_MAX  
  113. #define UINTPTR_MAX         _ULLONG_MAX  
  114. #endif /* _INTPTR */  
  115.   
  116. #define INT8_C(x)   (x)  
  117. #define INT16_C(x)  (x)  
  118. #define INT32_C(x)  ((x) + (INT32_MAX - INT32_MAX))  
  119.   
  120. #define UINT8_C(x)  (x)  
  121. #define UINT16_C(x) (x)  
  122. #define UINT32_C(x) ((x) + (UINT32_MAX - UINT32_MAX))  
  123.   
  124. #ifdef _WIN64  
  125.  #define PTRDIFF_MIN        INT64_MIN  
  126.  #define PTRDIFF_MAX        INT64_MAX  
  127. #else /* _WIN64 */  
  128.  #define PTRDIFF_MIN        INT32_MIN  
  129.  #define PTRDIFF_MAX        INT32_MAX  
  130. #endif /* _WIN64 */  
  131.   
  132. #define SIG_ATOMIC_MIN  INT32_MIN  
  133. #define SIG_ATOMIC_MAX  INT32_MAX  
  134.   
  135. #ifndef SIZE_MAX  
  136.  #ifdef _WIN64  
  137.   #define SIZE_MAX      UINT64_MAX  
  138.  #else /* _WIN64 */  
  139.   #define SIZE_MAX      UINT32_MAX  
  140.  #endif /* _WIN64 */  
  141. #endif /* SIZE_MAX */  
  142. #define WCHAR_MIN       0  
  143. #define WCHAR_MAX   0xffff  
  144.   
  145. #define WINT_MIN    0x0000  
  146. #define WINT_MAX    0xffff  
  147.   
  148.  #define INT64_MIN  (-0x7fffffffffffffff - _C2)  
  149.  #define INT64_MAX  0x7fffffffffffffff  
  150.  #define UINT64_MAX 0xffffffffffffffffU  
  151.   
  152.  #define INT_LEAST64_MIN    (-0x7fffffffffffffff - _C2)  
  153.  #define INT_LEAST64_MAX    0x7fffffffffffffff  
  154.  #define UINT_LEAST64_MAX   0xffffffffffffffffU  
  155.   
  156.  #define INT_FAST64_MIN     (-0x7fffffffffffffff - _C2)  
  157.  #define INT_FAST64_MAX     0x7fffffffffffffff  
  158.  #define UINT_FAST64_MAX    0xffffffffffffffffU  
  159.   
  160.  #define INTMAX_MIN     (-0x7fffffffffffffff - _C2)  
  161.  #define INTMAX_MAX     0x7fffffffffffffff  
  162.  #define UINTMAX_MAX    0xffffffffffffffffU  
  163.   
  164. #define INT64_C(x)      ((x) + (INT64_MAX - INT64_MAX))  
  165. #define UINT64_C(x)     ((x) + (UINT64_MAX - UINT64_MAX))  
  166. #define INTMAX_C(x)     INT64_C(x)  
  167. #define UINTMAX_C(x)    UINT64_C(x)  
  168. _C_STD_END  
  169. #endif /* RC_INVOKED */  
  170. #endif /* _STDINT */  
  171.   
  172.  #if defined(_STD_USING)  
  173. using _CSTD int8_t; using _CSTD int16_t;  
  174. using _CSTD int32_t; using _CSTD int64_t;  
  175.   
  176. using _CSTD uint8_t; using _CSTD uint16_t;  
  177. using _CSTD uint32_t; using _CSTD uint64_t;  
  178.   
  179. using _CSTD int_least8_t; using _CSTD int_least16_t;  
  180. using _CSTD int_least32_t;  using _CSTD int_least64_t;  
  181. using _CSTD uint_least8_t; using _CSTD uint_least16_t;  
  182. using _CSTD uint_least32_t; using _CSTD uint_least64_t;  
  183.   
  184. using _CSTD intmax_t; using _CSTD uintmax_t;  
  185.   
  186. using _CSTD uintptr_t;  
  187. using _CSTD intptr_t;  
  188.   
  189. using _CSTD int_fast8_t; using _CSTD int_fast16_t;  
  190. using _CSTD int_fast32_t; using _CSTD int_fast64_t;  
  191. using _CSTD uint_fast8_t; using _CSTD uint_fast16_t;  
  192. using _CSTD uint_fast32_t; using _CSTD uint_fast64_t;  
  193.  #endif /* defined(_STD_USING) */  
  194.   
  195. /* 
  196.  * Copyright (c) 1992-2009 by P.J. Plauger.  ALL RIGHTS RESERVED. 
  197.  * Consult your license regarding permissions and restrictions. 
  198. V5.20:0009 */  
当然,要将定位的地方的<>改为引号


当你松了一口气,以为终于可以看到视频的时候,vs又无情的提示你出错了,竟然说什么多次宏定义
虽然是个警告,但是这怎么能忍受
定位到
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #define WCHAR_MIN 0  
然后思考了一下,既然重复了,那就删掉吧


经历了千辛万苦,终于看到了,泪都要掉下来了

然后要让不明真相的小伙伴炫耀炫耀,大手一切release编译,然后发布上传,多好的节奏
然后vs又跳出来告诉你

无法定位程序输入点  于动态链接库libvlc.dll


当时就想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.def
for /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了
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值