本文仅供入门使用
使用的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.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了