vlc开发随笔

Vlc开发总结 

本来想使用opencv开发视频实时播放的ocx插件,但是看了一些关于opencv的资料发现在摄像头检测以及网络摄像头识别的细节几乎没有,而且opencv在显示的时候也没发现怎么显示到mfcDialog上,面对貌似强大的opencv,我只能说我了解的还太少。因此转向了网上讨论比较多的vlc开发,在网上看了一下vlc的介绍:

设计原理: VLC有着其的模设计使得它新文件格式解析、解器或流方法模能很容易地包含来。个原也延伸到了其它域,使得VLC可以接口,音视频输出控制以及音视频滤波模有着广泛的选择在,VLC内部模300个。

特性: VLC迎的原因是它有极的播放能力,不完整、未下完成或坏的视频文件都能利地播放Vlc常被用来播放网络视频,因此少许延迟没关系,但是播放实时监控视频流的话,这是不能接受的!这个问题有待研究。

 

一.Vlc开发依赖项

Vlc支持跨:WindowsWinCELinuxMacOSX等操作平台,本次开发需要结合windowsmfc因此以visual studio 2010编译环境,网上有提供的vlc支持库libvlccore.dlllibvlc.dlllibvlc.lib等。上面的依赖库也可以自行编译。

 

二.Vlc提供的接口

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():返回libvlcchangesetlibvlcasynchronouseventslibvlc发出不同步事件许多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:主要是fourccdocec的跟踪信息。

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"播放媒体恰好一次,否则将得到一个空的数组。而多次播放则会导致多个重复数据。

 

三.Mfc下核心vlc程序示例

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);//释放该线程时间片给界面线程,用于处理界面响应。

 

上面仅仅是显示视频画面的核心程序,还有一些控制接口可以自行调用,根据程序的需要进行调用。

 

四.Vlc开发注意事项

Vs环境有两种编译模式,一种是debug版编译,另一种是release版本编译。顾名思义,debug版本编译的程序可以使用vs提供的内部工具进行编译调试,比如使用断点单步执行,堆栈查看,变量跟踪等。而release方式编译的工程不能进行编译,因此往往生成的release版本的文件要小于debug版。产品的发布也是要求发布release版。

让开发人员不爽的是,activex开发不能运行单步执行,因此单步调试的时候比较纠结。不过还有微软提供了ActiveX control Container,解决了一些问题。

 

五.已实现功能

1.      内嵌于web

2.      可实现窗口最大化最小化

3.      停止/开始

4.      录像

5.      rtsp流地址改变

 

六.现存问题

1.      在网上下载了版本为vlc-0.9.9的播放器,播放rtsp的视频流发现有半秒左右的延迟,运行自己写的程序也是这样,还没发现什么原因,怀疑是缓存buffer大小有关系。

2.      生成的ocx有很多依赖项,其中包括一个文件夹plugins,里面很多dll,还没有成功打包成cab,后续研究。

 

2012-12-3

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: WPF 是一种用于创建 Windows 应用程序的框架,而 VLC 是一种流行的开源媒体播放器。集成这两者可以实现在 WPF 应用程序中播放音视频的功能。 要在 WPF 应用程序中集成 VLC,首先需要确保已安装 VLC 的库文件。然后,在 WPF 项目中添加对 VLC 的引用,并在主界面中添加一个用于展示视频的控件,可以使用 WPF 中的 MediaElement 控件。 当用户需要播放一个视频时,可以通过编程的方式来控制 VLC 播放器。通过使用 VLC 提供的 API,可以完成视频的加载、播放、暂停、停止等操作。可以设置控件的 Source 属性,指定视频文件的路径,然后通过调用控件的 Play() 方法来开始播放视频。 除了基本的播放功能,还可以通过 VLC API 提供的其他方法来实现更多的功能,例如调整音量、设置循环播放、截图等。可以根据需求,通过编写代码来实现这些功能。 另外,为了提供更好的用户体验,可以在 WPF 应用程序中添加自定义的操作按钮、播放列表、播放控制等界面元素,来方便用户操作和管理视频。 在集成 VLC 的过程中,需要注意一些细节,如处理播放器的事件、异常处理、资源释放等。同时,要确保 VLC 的版本与所需功能的兼容性,以及遵循相应的开源许可协议。 总之,通过在 WPF 应用程序中集成 VLC,可以实现一个功能强大的媒体播放器,让用户可以方便地在应用程序中播放和管理音视频文件。这样的集成可以为应用程序增添丰富的多媒体功能,提升用户体验。 ### 回答2: WPF(Windows Presentation Foundation)是微软推出的一种用于创建现代化图形用户界面的技术。VLC是一个流行的多媒体播放器,具有强大的功能和广泛的兼容性。在WPF应用程序中集成VLC,可以实现在应用程序中播放各种类型的媒体文件和流。 要在WPF应用程序中集成VLC,首先需要将VLC的相关库文件引入到项目中。可以通过NuGet包管理器或手动添加引用的方式来完成,确保所有需要的库文件都被正确引入。 接下来,需要在WPF页面中添加一个可用于播放媒体文件的控件。可以使用MediaElement控件,该控件是WPF自带的媒体播放器控件。将其放置在页面上适当的位置,并设置相关属性,如宽度、高度和媒体源。 然后,在应用程序的代码中,需要使用VLC的相关API来控制媒体的播放。可以通过VLC提供的库函数来处理播放、暂停、停止、快进、音量调整等操作。也可以通过事件处理程序来监听媒体的状态变化,如播放完成或出现错误等。 最后,编译并运行WPF应用程序,就可以看到已成功集成VLC的效果。可以在应用程序中选择并播放各种媒体文件,并能通过自定义界面进行控制。 总之,通过在WPF应用程序中集成VLC,可以实现强大的多媒体播放功能,并能与其他WPF界面元素进行自由组合,以满足不同场景下的需求。集成过程需要引入VLC的库文件,并使用相关API来控制媒体的播放和管理。通过合理的设计和开发,可以打造出功能丰富、用户友好的媒体播放应用程序。 ### 回答3: WPF是一种用于开发Windows桌面应用程序的技术,而VLC是一款功能强大的多媒体播放器。将两者集成在一起,可以实现在WPF应用程序中嵌入VLC播放器的功能。 要在WPF应用程序中集成VLC,首先需要安装VLC插件并添加相应的引用。随后,可以在XAML中添加一个VLC控件,该控件将作为嵌入的VLC播放器显示。 在代码中,可以通过设置VLC控件的属性来控制播放器的行为,如路径、音量、播放控制等。可以编写事件处理程序来处理播放器状态的变化,如用户点击了播放、暂停或停止按钮等。 另外,通过VLC的API,我们还可以实现更多高级的功能,如视频下载、字幕选择、视频截图等。可以通过调用VLC的API方法来实现这些功能,并将结果显示在WPF应用程序中。 集成WPF和VLC开发过程需要熟悉WPF和VLC的API,并能够将两者进行适当的结合。通过这种方式,我们可以在WPF应用程序中实现强大的多媒体播放功能,从而提供更丰富的用户体验。 综上所述,WPF集成VLC开发可以通过安装VLC插件、添加引用、在XAML中添加VLC控件,编写代码控制播放器行为,并调用VLC的API实现高级功能。这样就可以在WPF应用程序中嵌入VLC播放器,并实现丰富的多媒体播放功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值