vlc播放器架构
acess :访问
• 可以理解为接收、获取、得到数据资源, 包括解析访问源(url)、使用http协议(ftp、 rtsp协议......)建立连接、获取数据等。
demux :解复用
• 就是把通常合在一起的音频和视频分离(还 有可能的字幕),通过分析数据包头来判断 是什么数据文件,需要用什么解码格式。
output
• 音视频模块,提供独立的可操作接口
subtitle 外挂字幕
• 软件解析后,直接发送至输出接口。
6.vlc调用内部接口运行过程
附:直接调用vlc上api播放音视频demo
• • • • • • • • • static void test_media_local(const char** argv, int argc) { libvlc_media_t *md1, *md2, *md3, *md4; libvlc_instance_t *vlc; libvlc_media_t *md; libvlc_media_player_t *mp; const char * file0 = test_default_sample0;//file vlc = libvlc_new (argc, argv); md = libvlc_media_new_path (vlc, file0);
• 而demux部分首先要解析TS流的信息。TS 格式是MPEG2协议的一部分,一般,TS通 常是固定188字节的一个packet,一个TS流 可以包含多个program(节目),一个 program又可以包含多个视频、音频、和文 字信息的ES流;每个ES流会有不同的PID 标示。而又为了可以分析这 些ES流,TS有 一些固定的PID用来间隔发送program和es 流信息的表格:PAT和PMT表。 • 对于VLC播放器,使用库libdvbpsi来解析和 编码TS流.(调用代码可以参见VLC源码 /modules/demux/ts.c。)
音频格式
• MPEG 1/2/3, AAC (MPEG4 part3), AC3 A/52 (Dolby Digital),WMA ,FLAC, Real Audio 2 , AMR (3GPP)
视频输出
• DirectX、X11、XVideo、SDL、 FrameBuffer、ASCII
访问输入
三.vlc播放器基本架构介绍
• vlc(Video Lan Client)设计框架结构。vlc是一个完整的多 媒体框架 (如DirectShow或GStreamer的),最大特点 是可以根据需要动态加载许多插件模块,支持大量的音视 频传输、封装和编码格式。框架核心就是用程序将各模块 连接起来,对输入媒体数据 经过各模块处理后输出。
字幕
• 文件内字幕,外挂字幕
5.数据处理流程框架
• VLC由一个运行核(libvlc)和很多功能模块组 成,很多功能都由模块提供. • 在目前vlc设计框架的基础上,将vlc中使用 的demux模块, decoder模块, out模块, 置换 成目前硬件平台支持的硬件demux, decoder, out模块,从而使用硬件解码。 demux, decoder 探测部分使用开源的 ffmpeg 中的库文件。
1.VLC 源代码结构
2.module功能模块目录树 VLC建立在很多独立的功能模块上面的,象 很多媒体播放器系统框架一样,每个模块 实现一个新的功能
3.src模块目录介绍
• LibVLC是VLC的重要部分。它是一个提供接口的 库,比如给VLC提供功能接口:流的接入,音频和 视频输出,插件管理,线程系统。LibVLC源码位 于src/及其子目录: • Interface/:包含与用户交互的代码如按键和设备弹 出。 • Playlist/:管理播放列表的交互,如停止、播放、 暂停 、下一个,或者随机播放。 • Input/:打开一个输入组件,读包,解析它们并且 将被还原的基本流传递给解码器。
•
• • •
mp = libvlc_media_player_new_from_media (md);
libvlc_media_player_play (mp); sleep(100); }
1.首先程序调用libvlc_new(lib\core.c)接口,实现创建一个VLC运行实 例libvlc_instance_t,该实例在程序运行过程中唯一。 2.在libvlc_new接口中,调用了libvlc_InternalInit函数实现具体的初始化 工作. 3.libvlc_InternalInit(\src\libvlc.c)函数中,首先通过system_Init函数完 成传入参数对系统的相关初始化,接着通过module_InitBank (\src\modules\bank.c)函数初始化module_bank结构体,并创建了 main模块,然后通过module_InitStatic载入静态模块,通过 module_LoadPlugins(\src\modules\bank.c)函数载入动态模块. 4.调用libvlc_media_new_path接口,载入播放节目单. 5.在获取流时,通过调用stream_UrlNew(src\input\stream.c)函数完成 对access、demux和path的解析。最后调用stream_AccessNew (\src\input\stream.c)函数,创建stream_t结构体对象,并初始化对 象中所有函数指针;
decoder
• 根据判断硬件支持情况,选择使用软硬件 解码器,视频都使用硬件解码器,有些独 立的音频播放可以使用软件解码器(mpeg audio layer 1/2/3 (mpga))。对于加扰的视 频需另外增加处理。 • 软件解码依赖ffmpeg提供库或其他开放的 源代码解码器。 • 如果使用软件decoder, 对于out输出模块, hdi需要提供独立的音视频接口。
1.sk_media播放器使用流程图及 部分接口
•
2.简单的sk_media播放器demo
• • • • • • • • • • • • • • • • } static int main_media_test () { int ret; sk_media_t skplayer_service_data; char *url=NULL; int res; sk_media_init(NULL); ret = sk_media_create_player(&skplayer_service_data,NULL); url="http://192.168.11.193/HEAAC_128K_3sec.mp4"; sk_media_player_set_file(skplayer_service_data,0,2,url,url); ret = sk_media_player_start(skplayer_service_data, 0, 1, 0); Sleep(10); sk_media_player_stop(skplayer_service_data); sk_media_destroy_player(skplayer_service_data,NULL); sk_media_term(NULL);
• Video_output/:初始化video显示器,从解码器得 到所有的图片和子图片(如subtitles)。随意将它们 转换为其它格式(如:YUV到RGB)并且播放。 • Audio_output/:初始化音频mixer(混合器)。如:发 现正确的播放频率,然后重新制作从解码器接收 过来的音频帧。 • Stream_output/:类似Audio_output。 • Misc/:被libvlc其它部分使用的杂项,如线程系统, 消息队列,CPU探测,对象查询系统,或者特定 平台代码。关于block_t结构 的一些功能也在其中 (block.c),包括队列的存放、删除等。(如果做本 地缓存可以考虑在block.c里处理)
• UDP/RTP Unicast(单播),UDP/RTP Multicast(组播), • TCP/RTP Unicast,DCCP/RTP Unicast, • HTTP / FTP, MPEG encoder,Video acquisition(视频 采集) • DVB,File
控制界面
• Gtk、QT4、Web、Telnet、Command line、 Lgui
• demux分解出来的音频和视频流分别送往音频解 码器和视频解码器。因为原始的音视频都是占用 大量空间,而且冗余度较高的数据,通常在制作 的时候就会进行 某种压缩。这就是我们熟知的音 视频编码格式,包括MPEG1(VCD)、MPEG2 (DVD)、MPEG4、H.264、rmvb等等。音视频 解码器的作用就是把这些压缩了的数据还原成原 始的音视频数据。(VLC解码MPEG2使用了一个 独立的库libmpeg2,调用它的源文件是 codec/libmpeg2.c。VLC关于编解码的模块都放 在/modules/codec目录下,其中包括著名的庞大 的 ffmpeg。)
4.vlc常用名词
• 容器 比较常见的容器格式包括AVI(.avi)、MPEG (.mpg, .mpeg)、QuickTime(.mov)、RealMedia (.rm)、MP4(.mp4)、Matroska(.mkv)、Ogg Media(.ogg)等
视频格式
• 常见的有:MPEG-1/2/4,divx,h.263, H.264 / MPEG-4 AVC, wmv, mov,
例如: 播放一个UDP组播的MPEG TS流
•
access部分负责从网络接收组播流, 放到播放器的内存缓冲区中,access模块 关注IP协议,如是否IPv6、组播地址、组播 协议、 端口等信息;如果检测出来是RTP 协议(RTP协议在UDP头部简单得加上了 固定12个字节的信息),还要分析RTP头 部信息。(对于VLC播放器,这部分可以参 看VLC源码 /modules/access/udp.c )。