当前位置:文档之家› VLC在MFC上的使用

VLC在MFC上的使用

VLC的简单介绍

VLC的全名是Video Lan Client,是一个开源的、跨平台的视频播放器。VLC支持大量的音视频传输、封装和编码格式,完整的功能特性列表可以在这里获得https://www.doczj.com/doc/9d16040076.html,/vlc/features.html,下面给出一个简要的不完整的列表:操作系统:Windows、WinCE、Linux、MacOSX、BEOS、BSD

访问形式:文件、DVD/VCD/CD、http、ftp、mms、TCP、UDP、RTP、IP 组播、IPv6、rtsp

编码格式:MPEG*、DIVX、WMV、MOV、3GP、FLV、H.263、H.264、FLAC 视频字幕:DVD、DVB、Text、V obsub

视频输出:DirectX、X11、XVideo、SDL、FrameBuffer、ASCII

控制界面:WxWidgets、QT4、Web、Telnet、Command line

浏览器插件:ActiveX、Mozilla(firefox)

实际上为了更清晰一点,我们可以反过来说说VLC不支持哪些常见的。首先是RealVideo(Real的Audio部分支持),因为Real的Video加码器存在版权的问题。实际上VLC 0.9.0已经加入了RealVideo的支持,但是需要额外的解码器(类似MPlayer)。另外,VLC不支持3GP的音频格式AMR。

至于为什么叫Video Lan Client,是因为以前还有一个Video Lan Server的项目(简称VLS),而目前VLS的功能已经合并到VLC中来,所以VLC不仅仅是一个视频播放器,它也可以作为小型的视频服务器,更可以一边播放一边转码,把视频流发送到网络上。VLC最为突出的就是网络流的播放功能,例如MPEG2的UDP TS流的播放和转发,几乎是无可替代的。

从程序结构来看,VLC的可扩展性是相当优秀的。VLC绝大部分用高效的C 代码来编写(少量的C++和汇编),但是实现了完全动态的模块化,所有功能包括程序框架本身都是module,可以在运行时载入,这使得VLC可以轻易的扩展多种功能并且容易维护。它的架构有一点类似于DirectShow的技术。

VLC也很注重版权方面的问题,你可以放心的自由的使用而不需要为版权的问题担心——VLC只包括免费的、自由的库。VLC基于GPL,因此也可以用于

商业应用,只需要保留GPL,以及公开源代码,如果你修改了VLC的话。

下面是VLC相关的一些链接:

VLC官方网站:https://www.doczj.com/doc/9d16040076.html,/

VLC下载页面:https://www.doczj.com/doc/9d16040076.html,/vlc/

VLC下载目录(源码和安装包):https://www.doczj.com/doc/9d16040076.html,/pub/videolan/vlc/ VLC Nightly Builds:https://www.doczj.com/doc/9d16040076.html,/

VLC 开发Wiki:https://www.doczj.com/doc/9d16040076.html,/Developers_Corner

VLC Win32第三方库预编译包下载目录:https://www.doczj.com/doc/9d16040076.html,/pub/testing/win32/

VLC 官方论坛:https://www.doczj.com/doc/9d16040076.html,/

VLC 邮件列表:https://www.doczj.com/doc/9d16040076.html,/developers/lists.html

VLC的编译

1.下载源码,地址为https://www.doczj.com/doc/9d16040076.html,/pub/videolan/vlc/

2.下载第三方库:

https://www.doczj.com/doc/9d16040076.html,/pub/testing/win32/contrib-20070530-

win32-bin-gcc-3.4.5-only.tar.bz2

3.将这两个解压到你MingW的用户目录下

4.进入VLC的目录下,命令为:cd /usr/vlc

5.输入命令./bootstrap

6.编写一个脚本,“configure-vlc.sh”(内容见附录1),然后执行,命令为:dos2unix configure-vlc.sh

./configure-vlc.sh

7.然后修改修改"/tmp/vlc-0.8.6i"目录下的libtool文件4760行

prog)

case $host in

cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;;

esac

改为:

prog)

case $host in

#*cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;;

*cygwin*) output=`$echo $output` ;;

esac

8.执行make就完成了编译的工作了。编译后使用命令make package-win32-base

进行打包就行了。

VLC的应用

VLC的应用主要有以下的几种方法:

1.直接调用VLC的进程

2.VLC的plugin for Mozilla

3.VLC的ActiveX插件

4.调用libvlc

下面我主要介绍调用libvlc的方法:

任何VC环境下都可以调用MinGW/GCC编译得到的libvlc.dll,所以我们可以在VLC编译以后得到的或是从官网下载zip解压后或是安装VLC的软件包以后,其目录下会有一个sdk文件夹,在里面又包含两个文件夹:include--头文件及lib--库。这些都是我们用MFC调用libvlc.dll所必须的。头文件没啥好说的,库里面的libvlc.dll.a及libvlccore.dll.a就是我们需要的的静态库,我们分别手动改成libvlc.lib及libvlccore.lib就可以在VC环境中调用了。

下面就是建立工程,利用VLC的lib实现视频的编解码。

1.首先将VLC的目录下的vlc/sdk/include/vlc.h复制到主工程目录下,在主工程

目录下新建vlc和lib两个文件夹。

2.将vlc/sdk/include/目录下的除vlc.h之外的所有头文件复制到vlc文件目录下,

同时将vlc/sdk/lib目录下地libvlc.lib和libvlccore.lib复制到lib文件目录下。

3.将vlc/目录下的libvlc.dll、libvlccore.lib及plugins目录都复制到Debug目录

下。

4.将stdint.h复制到主目录下

5.打开Project Setting,在link标签的Object/library modules:下输入lib/libvlc.lib

lib/libvlccore.lib。

6.在C**Dlg.cpp中添加“vlc.h”的包含。

7.添加视频播放的代码然后Debug即可。

libvlc外部API的简单整理

libvlc.h

定义了libvlc的外部api,引用这个头文件就可以把VLC嵌入到我们的程序里面了。libvlc的对象必须先被初始化之后才能被使用。

libvlccore

libvlc_new():

用于初始化一个libvlc的实例,argc表示参数的个数,argv表示参数,返回创建的实例若当发生错误时返回NULL

libvlc_release():

用于销毁一个libvlc的实例libvlcerrorhandling

libvlc_errmsg():

返回的是在当前线程中产生的最新的libvlc错误,这个错误信息至少在另外一个错误发生之前(至少再调用一次libvlc)都是有效的,当没有任何错误的时候返回的是NULL

libvlc_clearerr():

用于清除当前线程的libvlc的错误状态.此操作是可选的,默认情况下,错误状态是会在新的错误发生时被覆盖.

libvlc_vprinterr():

用于设置当前线程的libvlc的错误状态和消息.无论何时都返回一个nul字符libvlc_printerr():

打印错误信息

libvlc_retain():

增加libvlc的引用计数,任何新的libvlc实例的引用计数为1

libvlc_add_intf():

尝试启动libvlc实例的用户接口,p_instance表示要启动的实例,name为接口名,NULL表示默认,返回0表示成功-1表示发生错误

libvlc_set_exits_handler():

此函数用于为一个已存在的libvlc事件注册一个回调.此方法在你用libvlc_add_intf()开启了至少一个接口时非常有用.典型的,这个函数将唤醒你的程序主循环(从其他线程).参数p_instance表示libvlc实例,cb表示当libvlc要退出时要调用的回调.opaque表示回调的数据指针.警告:此函数不能同libvlc_wait()同时调用.

libvlc_wait():

等待到有一个接口引发实例的推出动作.必须先用libvlc_add_intf()开启至少一个接口.

libvlc_set_user_agent():

设置应用程序名,当有协议要求的时候,libvlc将把这个名字作为用户代理串传递给它.参数name应该是一个可读的应用程序名,例如"FooBarplayer1.2.3",http 参数为HTTPUserAgent。例如"FooBar/1.2.3Python/2.6.0。

libvlc_get_Version():

返回libvlc的版本号

libvlc_get_compiler():

返回编译libvlc的编译器的版本。

libvlc_get_changeset():

返回libvlc的changeset?libvlcasynchronouseventslibvlc发出不同步事件

许多libvlc对象,如libvlc_instance_tlibvlc_media_player_t不同步的产生时间,它们中的每一个都提供了libvlc_event_manager_t事件管理器。你可以通过libvlc_event_attach()来订阅这些事件以及用libvlc_event_detach()来退订事件。

libvlc_event_manager_t

属于libvlc对象的事件管理器

libvlc_event_type_t:

表示libvlc的事件

libvlc_callback_t():

回调函数通知(callbackfunctionnotification翻译不准确),参数p_event为触发回调的时间.

libvlc_event_attach():

注册一个eventnotification。参数p_event_manager想要绑定的事件管理器.通常来说它是由vlc_my_object_event_manager()处获得的,此处的my_object是你想要监听的对象,i_event_type是想要监听的事件,f_callback是当i_event_type发生时要调用的函数。user_data是用户提供的伴随事件而传递的数据。成功时此函数返回0,发生错误时返回ENOMEM。

libvlc_event_detach():

退订一个event notification。

libvlc_event_type_name():

获得一个事件的类型名libvlc_logLibVLClogginglibvlc_log系列函数提供了访问libvlc消息日志的方法.这些函数仅用于高级用户或调试之用.

libvlc_get_log_verbosity():

获得VLC消息的详细级别

libvlc_set_log_verbosity():

设置VLC消息的详细级别

libvlc_log_open():

开启VLC消息日志实例(从一个libvlc实例中获得其消息日志实例)

libvlc_log_close():

关闭VLC消息日志实例

libvlc_log_count():

返回日志中消息条数

libvlc_log_clear():

清除日志实例.将把实例中的所有消息删除,为了防止消息阻塞,应该经常清除.

libvlc_log_get_iterator():

定位并返回一个日志中记录的iterator

libvlc_log_iterator_free():

释放一个先前定位好的iterator

libvlc_log_iterator_next():

返回下一条日志消息,当接下来为空的时候返回NULL,否则返回下一个消息对象libvlc_media.hlibvlc_media_t是一个可播放的媒体的抽象表达.它包含了这个媒体的位置以及各种可选的元数据.

libvlc_state_t:

此枚举类型的循序必须严格保证和源码一致,同时可参考mediacontrol_PlayerStatus,input_state_e枚举类型以及VideoLan.LibVLC.State(在bindings/cil/src/media.cs)

libvlc_media_stats_t:

Libvlc的媒体统计信息。

libvlc_media_track_info_t::

主要是fourcc和docec的跟踪信息。

libvlc_media_new_location():

使用一个给定的媒体资源路径来建立一个libvlc_media对象.参数psz_mrl为要读取的MRL(MediaResourceLocation).此函数返回新建的对象或NULL。libvlc_media_new_path():

从本地文件系统路径新建,其他参照上一条

libvlc_media_new_as_node():

使用给定的名称创建一个libvlc_media_t并将其作为一个空的节点

libvlc_media_add_option():

添加一个选项到已有的libvlc_media_t,这个选项将被用于决定media_player 如何读取媒体。这样一来就可以在每个媒体上指定各自的VLC的高级reading/streaming选项。

libvlc_media_add_option_flag():

减价一个带有可配置标记的选贤到已有的libvlc_media_t.其他同上一条. libvlc_media_retain():

保留一个引用到一个媒体描述对象(libvlc_media_t.使用libvlc_media_release()来减少一个媒体描述对象的引用计数

libvlc_media_release():

减少一个libvlc_media_t的引用计数,如果减少到0时,此此函数将释放此对象(销毁).它将发送一个libvlc_MediaFreed事件到所有的监听者那里。如果一个libvlc_media_t被释放了,它就再也不能使用了。

libvlc_media_get_mrl():

从一个媒体描述对象处获得它的mrl

libvlc_media_duplicate():

镜像一份媒体描述对象

libvlc_media_get_meta():

读取媒体的元数据。如果媒体还没被解析,则返回NULL,这个方法会自动调用libvlc_media_parse_async(),因此,在调用此方法以后,你可以接收到一个libvlc_MediaMetaChanged事件。如果你希望使用一个同步的版本,请确保你在调用get_meta()之前调用了libvlc_media_parse();

libvlc_media_set_meta():

设置媒体的元数据,此方法不会保存数据,还需要调用libvlc_media_save_meta()来保存.

libvlc_media_get_state():获取当前媒体描述对象的状态.可能的状态被定义在livblc_structures.c中.

libvlc_media_subitems():

获得一个媒体描述对象的子项目.此方法将增加媒体描述对象的引用计数,使用libvlc_media_list_release()减少引用计数.

libvlc_media_event_manager():

获得一个媒体描述对象的事件管理器.

libvlc_media_get_duration():

获得一个媒体描述对象的持续时间.发生错误时返回-1.

libvlc_media_parse()

解析一个本地媒体的元数据和轨道信息,此方法是同步的.

libvlc_media_parse_async():

同上,此方法不同步,你可以监听libvlc_MediaParsedChanged事件来追踪他,如果已经被解析过了则此事件不会被触发。

libvlc_media_is_parsed():

获得一个媒体描述对象的分析状态。当分析过了返回true。

libvlc_media_set_user_data():

设置媒体描述符的用户数据,此数据仅被host程序访问,VLC.framework将它作为一个指向一个引用了一个libvlc_media_t指针的本地对象的指针来使用libvle_media_get_tracks_info():

获得媒体描述符的基本流信息.注意你必须使用--sout="#description"播放媒体恰好一次,否则将得到一个空的数组。而多次播放则会导致多个重复数据。

利用libvlc的API实现的VLC播放器

在添加了libvlc的各种lib文件、dll文件和相应的头文件后,我们就可以开始VLC播放器的编写了,根据上面所提到了各种API函数,可以编写下面的VLC 播放器代码:

/*******************************************************************/ /****函数中的libvlc_...都是VLC提供的API函数接口*********************/ /*******************************************************************/ libvlc_media_player_t *p_media_player =NULL;

void VLC_Player()

{

libvlc_media_player_release(p_media_player);//清理上次播放中的播放器占的内存等

libvlc_exception_t ex;

libvlc_exception_init(&ex);

int vlc_argc = 0;

const char * const vlc_argv[] = {

"-I", "dummy", /* Don't use any interface */

"--ignore-config" /* Don't use VLC's config */

};

vlc_argc = sizeof(vlc_argv)/sizeof(vlc_argv[0]);

libvlc_instance_t *p_instance = libvlc_new(vlc_argc, vlc_argv, &ex);

if (p_instance == NULL)

{

AfxMessageBox("Can not allocate the libvlc");

return;

}

//char* psz_mrl = "rtp://@239.255.0.1:5004";//组播,get state返回libvlc_Error ////char* psz_mrl = "..\\test.264";//这个参数可以正常播放test.264

/*libvlc_media_t *p_media = libvlc_media_new(p_instance, "./w.sdp",&ex);*/ libvlc_media_t *p_media = libvlc_media_new(p_instance, "./test.264",&ex);

if (p_media == NULL)

AfxMessageBox("Can not find the streaming");

p_media_player = libvlc_media_player_new_from_media(p_media, &ex);

libvlc_drawable_t hwnd = (libvlc_drawable_t)this->GetDlgItem(IDC_EDIT1)-> GetSafeHwnd();

if (hwnd == NULL)

{

AfxMessageBox("1");

return;

}

libvlc_video_set_parent(p_instance,hwnd,&ex);//设置播放的父窗口

libvlc_media_player_play(p_media_player, &ex);//播放器播放media

libvlc_exception_clear(&ex);//清理libvlc_exception_t结构体

libvlc_release(p_instance);//清理libvlc实例

libvlc_media_release(p_media); //播放后,释放新建的media内容Sleep(0);//释放该线程时间片给界面线程,用于处理界面响应。}

附录1:

PKG_CONFIG_PATH=/usr/win32/lib/pkgconfig \ CPPFLAGS="-I/usr/win32/include -I/usr/win32/include/ebml" \ LDFLAGS=-L/usr/win32/lib \

CC="gcc -mno-cygwin" CXX="g++ -mno-cygwin" \

./configure \

--disable-gtk \

--enable-nls --enable-sdl --with-sdl-config-path=/usr/win32/bin \ --enable-ffmpeg --with-ffmpeg-mp3lame --with-ffmpeg-faac \ --with-ffmpeg-zlib --enable-faad --enable-flac --enable-theora \ --with-wx-config-path=/usr/win32/bin \

--with-freetype-config-path=/usr/win32/bin \

--with-fribidi-config-path=/usr/win32/bin \

--enable-live555 --with-live555-tree=/usr/win32/https://www.doczj.com/doc/9d16040076.html, \

--enable-caca --with-caca-config-path=/usr/win32/bin \

--with-xml2-config-path=/usr/win32/bin \

--with-dvdnav-config-path=/usr/win32/bin \

--disable-cddax --disable-vcdx --enable-goom \

--enable-twolame --enable-dvdread \

--enable-shared-libvlc \

--enable-debug

相关主题
文本预览
相关文档 最新文档