最简单的基于libVLC的视频播放器

使用libVLC开发一个播放器十分的容易。最简单的基于libVLC的视频播放器的流程图如下图所示。

流程图中包含了3个结构体:

libvlc_instance_t:代表一个libVLC的实例。
libvlc_media_t:代表一个可以播放的媒体。
libvlc_media_player_t:代表一个VLC媒体播放器(一个视频播放器播放一个视频)。注意VLC并不仅仅用于媒体播放。

创建或者以上3个结构体通过以下6个函数:

libvlc_new():创建libvlc_instance_t。
libvlc_media_new_path():创建libvlc_media_t。
libvlc_media_player_new_from_media():创建libvlc_media_player_t。
libvlc_media_player_release():释放libvlc_media_player_t
libvlc_media_release():释放libvlc_media_t。
libvlc_release():释放libvlc_instance_t。

可以已通过下面的函数控制媒体的播放或者暂停,这些函数都需要使用libvlc_media_player_t作为参数。这里处于简化的目的,只使用了播放和停止函数:

libvlc_media_player_play():播放。
libvlc_media_player_pause():暂停。
libvlc_media_player_stop():停止。

除了上述3个函数之外,还包括libvlc_media_player_set_position()等函数,这里不再一一记录。

几点注意事项

libvlc_media_t的创建

创建libvlc_media_t有两种方法:libvlc_media_new_path()和libvlc_media_new_location()。简单描述一下这两个函数的区别:libvlc_media_new_location()用于打开协议,而libvlc_media_new_path()用于打开文件。因而传递给libvlc_media_new_path()的就是普通的文件路径(绝对路径例如D:\xxx.flv,或者相对路径例如xxx.flv),而传递给libvlc_media_new_location()的就是协议地址(例如“udp://….”,“http://”)。但是这里有一点需要注意,在VLC中“文件”也属于一种广义上的“协议”。因此使用libvlc_media_new_location()也可以打开文件,但是必须在文件路径前面加上“文件协议”的标记“file:///”。例如打开“F:\movie\cuc_ieschool.flv”下的视频,实际使用的代码如下所示。

  1. libvlc_media_new_location (inst, "file:///F:\\movie\\cuc_ieschool.flv");

此外,VLC还支持很多“神奇”的协议,比如输入“screen://”协议就可以进行屏幕录制,代码如下。

  1. libvlc_media_new_location (inst, "screen://");

把libVLC的弹出窗口嵌入到程序中

在这里我只实践过Windows下把libVLC的弹出窗口嵌入到程序中。将窗口或者控件的句柄传递给libvlc_media_player_set_hwnd()函数即可。
这里有一点需要注意,如果把libVLC弹出窗口嵌入到程序中的话,“全屏”功能就不能使用了。

关于libVLC加载的问题

在libVLC中可以通过libvlc_media_player_get_length(),libvlc_video_get_width(),libvlc_video_get_height()等函数获取到视频的时长,宽,高等信息。但是有一个很奇怪的现象:如果在调用完libvlc_media_player_play()之后立即调用上述3个函数的话,返回的值都是0,只有“等待”一段时间(例如调用sleep())后再调用上述函数,才能得到正确的数值。对于这种现象,我觉得可能是libVLC加载完成之后,才能通过上述几个函数获得正确的值(自己推测的,还没有深究)。

********************************************************************************************************************************************************************

libvlc.h

定义了libvlc的外部api,引用这个头文件就可以把VLC嵌入到我们的程序里面了。

libvlc的对象必须先被初始化之后才能被使用。

libvlc core

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

  libvlc error handling

  • libvlc_errmsg()返回的是在idaoyong线程中产生的最新的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应该是一个可读的应用程序名,例如"FooBar player 1.2.3",http参数为HTTP User Agent。例如"FooBar/1.2.3 Python/2.6.0。
  • libvlc_get_Version():返回libvlc的版本号
  • libvlc_get_compiler():返回编译libvlc的编译器的版本。
  • libvlc_get_changeset() :返回libvlc的 changeset?

libvlc asynchronous events

libvlc 发出不同步事件

许多libvlc对象,如libvlc_instance_t libvlc_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():回调函数通知(call back function notification翻译不准确),参数p_event为触发回调的时间.
  • libvlc_event_attach():注册一个event notification。参数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_log LibVLC logging

libvlc_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.h

libvlc_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(Media Resource Location).此函数返回新建的对象或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相关推荐

  1. c#万能视频播放器 (转)

    c#万能视频播放器(附代码) c#万能视频播放器 本人之前很多的文章中均提到了使用libvlc为播放器内核制作的播放器,也许有些朋友对此感兴趣,于是我用c#写了一个调用libvlc api实现的万能视 ...

  2. C#编写的基于VLC的播放器

    首先看一下最终的程序效果 实现的功能: 1:打开播放的音视频文件((1)菜单栏"文件"->"打开",(2)工具栏(下面)"打开"(3) ...

  3. vlc-android 源码目录结构

    vlc的核心,libvlc, 里面集成解复用,解码, 提供出来这些解复用解码的功能集成在libvlc库中,提供统一调用接口,这样在windows,linux, 都可以统一调用这个libvlc的接口. ...

  4. 深入理解VLC(一)纵观全局

    VLC系列文章 深入理解VLC之代码流程 VLC,著名的开源播放器项目,它虽然很庞大,但是在架构设计上也高度模块化.幸运的是,官方wiki非常详细,无论是大的架构设计,还是每一个模块里面的代码细节,都 ...

  5. android vlc 参数,【VLC-Android】LibVLC API简介(至关于VLC的MediaPlayer)

    前言html 学新东西API很重要,这里抛砖引玉整理了一下,欢迎反馈!android 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: htt ...

  6. 【VLC-Android】LibVLC API简介(相当于VLC的MediaPlayer)

    前言 学新东西API很重要,这里抛砖引玉整理了一下,欢迎反馈! 声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over14 ...

  7. VLC播放器应用------LIBVLC API解析

    转自:http://www.cnblogs.com/qq78292959/archive/2011/08/21/2147956.html API libvlc_instance_t* libvlc_n ...

  8. paslibvlc使用方法_VLC播放器应用之二------LIBVLC API解析

    APIlibvlc_instance_t* libvlc_new(int  argc,  const char* const*  argv) libvlc_instance_t*libvlc_new( ...

  9. RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别

    1. 基本概念 PRC 远程过程调用 Remote Procedure Call,其就是一个节点请求另外一个节点提供的服务.当两个物理分离的子系统需要建立逻辑上的关联时,RPC 是牵线搭桥的常见技术手 ...

  10. 基于ffmpeg和libvlc的视频剪辑、播放器

    以前研究的时候,写过一个简单的基于VLC的视频播放器.后来因为各种项目,有时为了方便测试,等各种原因,陆续加了一些功能,现在集成了视频播放.视频加减速.视频剪切,视频合并(增加中)等功能在一起.有时候 ...

最新文章

  1. php html自动打开新页面大小,HTML_html 用超链接打开新窗口其可控制窗口属性,1、html超链接打开的窗口大小 - phpStudy...
  2. Micropython 红外防坠落小车实验教程
  3. python基础——变量和数据类型及常见类型转换函数
  4. Web框架之Django_04 模板层了解(过滤器、标签、自定义过滤器、标签、inclusion_tag、模板的继承与导入)
  5. 链表反转2(Reverse Linked List II)
  6. 8后淡入淡出没有了_8·30广州岑村ufo事件,人为制作的造假视频
  7. 通达OA 新旧两种数据库连接方式
  8. 列表推导式 生成器表达式
  9. POJ3253-Fence Repair
  10. PHP中用while的用法,php while语句的用法
  11. PDF Expert for mac(最好用的pdf编辑工具)
  12. 战略分析师/商业分析师需要掌握的技能
  13. 免费高性能计算机平台,北京大学高性能计算平台
  14. 【TS】泛型 Generics
  15. 树莓派wifi连接不上咋回事
  16. 北大直博保送生论文涉嫌抄袭?原作者实名举报,北大南开火速调查
  17. 2023最新抖音取图小程序源码分享,带会员功能对接支付部署教程
  18. 手机无法被计算机识别,手机usb无法被电脑识别怎么办_电脑无法识别手机usb设备的解决方法...
  19. anaconda python3 安装库_痛点:Anaconda3 python第三方库批量安装
  20. 抖音做直播有哪些技巧,抖音新手直播应该注意什么:国仁楠哥

热门文章

  1. R语言入门-常用的向量运算
  2. 小米6不显示与电脑连接到服务器,小米6怎么连接上电脑连不上怎么办
  3. 基于MDK1808-EK_T70开发板的miniGUI应用程序演示03: ads1110热电偶温度传感器
  4. [国家集训队]middle——中位数思维题
  5. 领接矩阵结构的图的遍历(广度和深度遍历)
  6. Apache ShenYu 网关正式支持 Dubbo3 服务代理
  7. 工业摄像头传感器尺寸与像元尺寸的关系
  8. matlab洛伦兹吸引子,用Matlab求解洛伦兹方程
  9. Java递归求费数列和_简述java递归与非递归算法,0-100求和,斐波那契数列,八皇后,汉诺塔问题...
  10. 【关于c/c++中开平方函数sqrt()的用法】