VLC开发

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

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

四简单接口调用:

#include <windows.h>
#include "libvlc.h"
#include "libvlc_media.h"
#include "stdio.h"
#include "libvlc_structures.h"
#include "libvlc_media_player.h"
#include "libvlc_events.h"
#include "libvlc_media_discoverer.h"
#include "libvlc_media_library.h"
#include "libvlc_media_list.h"
#include "libvlc_media_list_player.h"

#pragma comment(lib, "libvlc.lib")
#pragma comment(lib, "libvlccore.lib")

int main(int argc, char* argv[])
{
	libvlc_instance_t *     vlc_ins    = NULL;
	libvlc_media_player_t * vlc_player = NULL;
	libvlc_media_t *        vlc_media  = NULL;

	const char * vlc_args[] = 
	{
		"-I",
		"dummy",
		"--ignore-config",
		"--extraintf=logger",
		"--verbose=2", 
	};  

	// 创建一个VLC实例
	vlc_ins = libvlc_new(sizeof(vlc_args)/sizeof(vlc_args[0]), vlc_args);
	if(vlc_ins != NULL)
	{
		// 创建一个VLC播放器
		vlc_player = libvlc_media_player_new(vlc_ins);
		if(vlc_player != NULL)
		{
			// 通过文件路径创建一个媒体实例,这里是我的测试文件
			vlc_media = libvlc_media_new_path(vlc_ins, "d:\\clips\\org.mp4");
			if(vlc_media != NULL)
			{
				// 解析媒体实例
				libvlc_media_parse(vlc_media);
				// 获取媒体文件的播放长度,  返回 ms
				libvlc_time_t duration = libvlc_media_get_duration(vlc_media);

				// 此处是获取媒体包含多个的视频和音频轨以及其他类型的轨道信息
				libvlc_media_track_info_t *media_tracks = NULL;
				int trackCount = libvlc_media_get_tracks_info(vlc_media, &media_tracks);
				// 这里是释放内存,但我测试的时候会有问题,还没仔细研究是为何
				// free(media_tracks);  // crash?

				// 把打开的媒体文件设置给播放器
				libvlc_media_player_set_media(vlc_player, vlc_media);

				// 因为是windows系统,所以需要设置一个HWND给播放器作为窗口,这里就直接使用桌面窗口,这里仅是测试
				libvlc_media_player_set_hwnd(vlc_player, ::GetDesktopWindow());
				// 开始播放视频
				libvlc_media_player_play(vlc_player);
				/*****************************************************************************
				// 这里仅是为了打印一些信息出来,20秒后退出
				time_t last_time = time(NULL);
				while((time(NULL) < (last_time + 20)))
				{
					Sleep(10);
					// 获取当前播放位置
					libvlc_time_t play_time = libvlc_media_player_get_time(vlc_player);
					printf("playing time : %lld ms\r", (__int64)(play_time));

					// 获取媒体的状态
					// libvlc_state_t media_state = libvlc_media_get_state(vlc_media);
					// printf("\nmedia state : %d\n", (int)(media_state));
				}
				*******************************************************************************/
				// 停止
				libvlc_media_player_stop(vlc_player);
				// 释放
				libvlc_media_release(vlc_media);
			}
	// 释放
	libvlc_media_player_release(vlc_player);
	}
	// 释放
	libvlc_release(vlc_ins);
	}
	getchar();
	return 0;
}


你可能感兴趣的:(VC)