VLC介绍以及库的使用
来源:互联网 发布:数据分析建模 编辑:程序博客网 时间:2024/05/21 00:00
VLC原指VideoLAN客户端(VideoLANClient),是一款开源的、跨平台的、可扩展的、多媒体播放器、流媒体服务器及框架,可播放大多数多媒体文件,以及DVD、音频CD、VCD及各类流媒体协议,现更名为VLC media player,最新版本为2.2.0。
VideoLanServer(VLS)的功能已经合并到VLC中,所以VLC不仅仅是一个音/视频播放器,它也可以作为小型的视频服务器(或作为流媒体服务器使用),更可以一边播放一边转码,把视频流发送到网络上。VLC最为突出的就是网络流的播放功能。
VLC通常不影响也不依赖于系统中自带的解码器。
VLC的license是GPL。
VLC采用多线程并行解码架构,线程之间通过单独的一个线程控制所有线程的状态,解码器采用filter模式,组织方式为模块架构。
VLC播放一个视频大致分为4个步骤:(1)、access,从不同的源获取流;(2)、demux,就是把通常合在一起的音频和视频分离(还有可能的字幕);(3)、decode,解码,包括音频和视频的解码;(4)、output,输出,也分为音频和视频的输出(aout和vout)。
VLC能够处理的流类型包括:(1)、ES(ElementaryStreams);(2)、PS(Program Stream);TS(Transport Stream)
下面简单说明下源码中各个目录的作用,其实源码中大部分每个.h、.c文件的开始处都对此文件的作用进行了简单描述:
1. /autotools:
2. /bin:此目录下的winvlc.c文件用于生成.exe执行文件;
3. /compat:生成libcompat库的源文件,此目录下包含了与平台相关的一些代码,比如Windows、POSIX、BSD等;
4. /contrib:第三方库,此目录下包含很多空的目录,如果要想编译这些第三方库,需要自己单独下;
5. /doc:一些log等说明信息;
6. /extras:一些额外的文件;
7. /include:所有头文件的集合;
8. /lib:生成libvlc库的源文件;
9. /m4:宏处理器;
10. /modules:VLC的模块部分,这些模块只在程序载入它们时有效;每一个模块,可提供不同的功能,它们适合特定文件或某一特定的环境;此外,audio_output/video_output/interface模块都写成了可跨平台的代码,方便支持新的平台。如果你想编译某个模块可以通过:% ./configure --enable-module_name ;如果不想编译某个模块可以通过: % ./configure --disable-module_name ;如果想得到某个模块的帮助信息,可通过:%vlc --advanced -p module_name ;
11. /modules/access:从不同的源获取流;
12. /modules/access_output:以不同的形式输出流;
13. /modules/arm_neon:arm架构,一些汇编代码;
14. /modules/audio_filter:各种音频滤波器;
15. /modules/audio_mixer:音量设置模块;
16. /modules/audio_output:音频输出模块,声音将会输出到你的音频系统中;
17. /modules/codec:音视频编解码模块;
18. /modules/control:动作控制功能,如鼠标手势控制vlc等;
19. /modules/demux:将合在一起的音频和视频分离(还有可能包括字幕);
20. /modules/gui:不同平台的用户界面模块;
21. /modules/hw/vdpau:VDPAU(VideoDecode and Presentation API for Unix)的API可以让视频播放器把一部分的视频解码和视频图像补偿交给GPU,最初由NVIDIA开发;
22. /modules/lua:与Lua脚本语言相关的模块;
23. /modules/meta_engine:
24. /modules/misc:杂项,包括webservice解析、xml解析、playlist输出模块等;
25. /modules/mux:将视频、音频、字幕合并为某一个视频格式,如.avi、.mp4等;
26. /modules/notify:notificationplugin;
27. /modules/packetizer:音视频打包模块,如H264/AVC、MLP/TrueHD等;
28. /modules/services_discovery:servicesdiscovery module;
29. /modules/stream_filter:streamfilter;
30. /modules/stream_out:流输出模块;
31. /modules/text_renderer:文本渲染模块;
32. /modules/video_chroma:图像格式转换默认,如YUV到RGB等;
33. /modules/video_filter:视频各种滤波模块,例如对渲染的图像进行色度、对比度、饱和度的调整等;
34. /modules/video_output:视频输出模块,允许VLC显示视频到你的屏幕上;
35. /modules/video_splitter:视频分割模块;
36. /modules/visualization:可视化模块,包括projectM、GOOM等;
37. /po:i18n(语言翻译)文件;
38. /share:图标、脚本等等;
39. /src:生成libvlccore库的源文件;
40. /src/Android:android平台专用模块;
41. /src/audio_output:音频输出模块;
42. /src/config:配置模块,从命令行和配置文件加载配置,提供功能模块的读取和写入配置;
43. /src/darwin:Mac(Darwin)平台专用模块;
44. /src/extras:一些平台的特殊代码;
45. /src/input:获取流模块,建立并读取一个输入流,并且分离其中的音频和视频,然后把分离好的音频和视频流发送给解码器;
46. /src/interface:用户接口模块,提供代码中可以调用的接口;
47. /src/misc:libvlc库使用的其它部分功能,是被其它模块使用的杂项,如数据库管理、CPU检测、图像的读写等;
48. /src/modules:模块管理;
49. /src/network:提供网络接口(socket管理,网络错误等);
50. /src/os2:OS/2平台专用模块;
51. /src/playlist:播放列表控制模块;
52. /src/posix:与POSIX(可移植操作系统接口)相关的模块;
53. /src/stream_output:输出音频流和视频流到网络;
54. /src/test:libvlccore库的测试模块;
55. /src/text:字符集;
56. /src/video_output:初始化视频播放器,把从解码器得到的视频画面转化格式(从YUV转为RGB)然后播放它们;
57. /src/win32:windows平台专用模块;
58. /test:一些脚本和测试代码;
VLC中所有的模块均以动态库(插件)方式来管理,就连main模块也不例外。可以在windows下查看VLC安装目录下的plugin目录,里面包含了所有的动态库。当VLC启动的时候,主模块采用动态加入的方式。采用宏定义将该模块的入口函数导出,以让其它函数调用,同时入口函数里面初始化了该模块相关的所有函数指针。
VLC采用全模块化结构,在系统内部,通过动态的载入所需的模块,放入一个module_bank的结构体中统一管理,连VLC的Main模块也是通过插件的方式动态载入的(通过module_InitBank函数在初始化建立module_bank时)。对于不支持动态载入插件的系统环境中,VLC也可以采用builtin的方式,在VLC启动的时候静态载入所需要的插件,并放入module_bank统一管理。VLC无论是作为流媒体服务器还是多媒体播放器,它的实质就是一个”播放器”,它实质处理的是ES、PES、PS、TS等流间的转换、传输与显示。
下来基于 VLC SDK来开发自己的播放器
#include#include#include#include#include#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);// 获取媒体文件的播放长度, 返回 mslibvlc_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);// 此处获取信息...// 释放内存libvlc_media_tracks_release(&media_tracks, trackCount);// 把打开的媒体文件设置给播放器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);}return 0;}
- VLC介绍以及库的使用
- vlc代码的使用
- VLC使用的问题
- VLC 介绍
- ViewPager的介绍以及使用
- VLC第三方视频框架的使用 (第一步,导入VLC库)
- VLC详细的使用说明以及配置…
- VLC 函数指针的使用
- 计时函数的使用,以及chrono库的简单介绍
- Android使用VLC库开发自己的视频播放器
- 『VLC』vlc-plugin的使用与代码套用
- VLC使用
- VLC使用
- VLC使用
- Lucene的使用以及简单介绍
- Log4j 的使用以及简单介绍
- top命令的使用以及介绍
- poi的使用以及简单介绍
- Spring Bean装配之Spring对JSR支持的说明
- QT-常见错误总结
- java设计模式之工厂方法探究
- java.net.BindException: Address already in use: JVM_Bind错误解决办法
- linux-挂载新分区
- VLC介绍以及库的使用
- 下划线转驼峰,3种实现方式效率对比
- 【Get深一度】小波分析概念3——正则性是什么意思,通俗解释
- 微博开放平台api使用
- error: unknown type name 'class' 的解决方法
- 原生js实现网页触屏滑动
- zeroc ice 源码编译 怎么搞?
- 深入浅出Docker(二):Docker命令行探秘
- WebDriver API详解-操作页面元素