vlc播放器架构汇总课件.ppt
《vlc播放器架构汇总课件.ppt》由会员分享,可在线阅读,更多相关《vlc播放器架构汇总课件.ppt(70页珍藏版)》请在三一办公上搜索。
1、vlc播放器架构,2014播放器简述,包含内容,播放器的基本原理介绍sk_media播放器介绍vlc播放器基本架构介绍,一般情况下,播放一个音视频分为4个步骤:1). acess 访问2). demux 解复用3). decode 解码4). output 输出,一.播放器的基本原理介绍,可以理解为接收、获取、得到数据资源,包括解析访问源(url)、使用http协议(ftp、rtsp协议.)建立连接、获取数据等。,acess :访问,demux :解复用,就是把通常合在一起的音频和视频分离(还有可能的字幕),通过分析数据包头来判断是什么数据文件,需要用什么解码格式。,为什么需要demux,其实
2、之所以需要demux,是因为音视频在制作的时候实际上都是独立编码的,得到的是分开的数据,为了传输方便必须要用某种方式合起来,这就有了各种封装 格式,也就有了demux。,decode 解码,包括音频和视频的解码,或者软件解码和硬件解码。,output 输出,分为音频和视频的输出(aout和vout),access部分负责从网络接收组播流,放到播放器的内存缓冲区中,access模块关注IP协议,如是否IPv6、组播地址、组播协议、 端口等信息;如果检测出来是RTP协议(RTP协议在UDP头部简单得加上了固定12个字节的信息),还要分析RTP头部信息。(对于VLC播放器,这部分可以参看VLC源码
3、/modules/access/udp.c )。,例如: 播放一个UDP组播的MPEG TS流,而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/
4、ts.c。),demux分解出来的音频和视频流分别送往音频解码器和视频解码器。因为原始的音视频都是占用大量空间,而且冗余度较高的数据,通常在制作的时候就会进行 某种压缩。这就是我们熟知的音视频编码格式,包括MPEG1(VCD)、MPEG2(DVD)、MPEG4、H.264、rmvb等等。音视频解码器的作用就是把这些压缩了的数据还原成原始的音视频数据。(VLC解码MPEG2使用了一个独立的库libmpeg2,调用它的源文件是 codec/libmpeg2.c。VLC关于编解码的模块都放在/modules/codec目录下,其中包括著名的庞大的 ffmpeg。),output模块,视频解码器输出的
5、是一张一张的类似位图格式的图像,但是要让人从屏幕看得到,还需要一个视频输出的模块。音频也是一样,需要将pcm等数据转化为声音,二.sk_media播放器介绍,sk_media播放器使用开源软件vlc_2.1.0(后面介绍)。sk_media播放器的解码部分,mp3(mpga)格式用软件解码,其它格式使用硬件解码,以便加快解码速度。sk_media播放器以插件的形式提供接口(sk_media.h)给浏览器和应用,以达到平台无关性。sk_media.h是公司提供的统一的播放器对外接口。,1.sk_media播放器使用流程图及部分接口,2.简单的sk_media播放器demo,static int
6、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(,三.vlc播放器基本架构介绍,vlc(Video Lan Client)设计框架结构。vlc是一个完整的多媒体框架(如DirectShow或GStreamer的),最大特点是可以根据需要动态加载许多插件模块,支持大量的音视频传输、封装和编码格式。框架核心就是用程序将各模块连接起来,对输入媒体数据 经过各模块处理后输出。,1.VLC
7、源代码结构,2.module功能模块目录树VLC建立在很多独立的功能模块上面的,象很多媒体播放器系统框架一样,每个模块实现一个新的功能,3.src模块目录介绍,LibVLC是VLC的重要部分。它是一个提供接口的库,比如给VLC提供功能接口:流的接入,音频和视频输出,插件管理,线程系统。LibVLC源码位于src/及其子目录:Interface/:包含与用户交互的代码如按键和设备弹出。Playlist/:管理播放列表的交互,如停止、播放、暂停 、下一个,或者随机播放。Input/:打开一个输入组件,读包,解析它们并且将被还原的基本流传递给解码器。,Video_output/:初始化video显示
8、器,从解码器得到所有的图片和子图片(如subtitles)。随意将它们转换为其它格式(如:YUV到RGB)并且播放。Audio_output/:初始化音频mixer(混合器)。如:发现正确的播放频率,然后重新制作从解码器接收过来的音频帧。Stream_output/:类似Audio_output。Misc/:被libvlc其它部分使用的杂项,如线程系统,消息队列,CPU探测,对象查询系统,或者特定平台代码。关于block_t结构 的一些功能也在其中(block.c),包括队列的存放、删除等。(如果做本地缓存可以考虑在block.c里处理),4.vlc常用名词,容器比较常见的容器格式包括AVI(
9、.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,音频格式,MPEG 1/2/3, AAC (MPEG4 part3), AC3 - A/52 (Dolby Digital),WMA ,FLAC, Real Audio 2, AMR (3GPP),视频输出,DirectX、X11、XVideo、SDL、FrameBuffer、AS
10、CII,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,字幕,文件内字幕,外挂字幕,5.数据处理流程框架,VLC由一个运行核(libvlc)和很多功能模块组成,很多功能都由模块提供.在目前vlc设计框架的基础上,将vlc中使用的demux模块, decoder模块, out模块, 置换成目
11、前硬件平台支持的硬件demux, decoder, out模块,从而使用硬件解码。demux, decoder 探测部分使用开源的ffmpeg 中的库文件。,vlc播放器的数据处理流程框图,播放列表playlist,对gui 页面提供统一接口,使用vlc 统一接口。,Access,网络或本地文件下载,移植vlc 支持的网络下载协议。-http、tcp/udp、RTSP/RTP,demux,先按照给出的文件流类型,选择容器解析和demux解析。若无文件流类型,则使用探测的方式尝试。解析容器,使用软件ffmpeg提供的或其他插件提供等。对于音视频加扰的流,使用软件demux解码器可能会产生ca解扰
12、问题,考虑使用硬件demux,不在讨论范围内。软件解码依赖ffmpeg提供库或其他开放的源代码解码器。针对ts 流的格式的文件,vlc使用软件libdvbpsi 开源库。 如果使用硬件demux, 对于decoder模块,hdi需要提供独立操作的接口。,decoder,根据判断硬件支持情况,选择使用软硬件解码器,视频都使用硬件解码器,有些独立的音频播放可以使用软件解码器(mpeg audio layer 1/2/3 (mpga)。对于加扰的视频需另外增加处理。软件解码依赖ffmpeg提供库或其他开放的源代码解码器。 如果使用软件decoder, 对于out输出模块,hdi需要提供独立的音视频接
13、口。,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_sa
14、mple0;/file vlc = libvlc_new (argc, argv); md = libvlc_media_new_path (vlc, file0); mp = libvlc_media_player_new_from_media (md); libvlc_media_player_play (mp); sleep(100);,1.首先程序调用libvlc_new(libcore.c)接口,实现创建一个VLC运行实例libvlc_instance_t,该实例在程序运行过程中唯一。2.在libvlc_new接口中,调用了libvlc_InternalInit函数实现具体的初始化工
15、作.3.libvlc_InternalInit(srclibvlc.c)函数中,首先通过system_Init函数完成传入参数对系统的相关初始化,接着通过module_InitBank(srcmodulesbank.c)函数初始化module_bank结构体,并创建了main模块,然后通过module_InitStatic载入静态模块,通过module_LoadPlugins(srcmodulesbank.c)函数载入动态模块.4.调用libvlc_media_new_path接口,载入播放节目单.5.在获取流时,通过调用stream_UrlNew(srcinputstream.c)函数完成对
16、access、demux和path的解析。最后调用stream_AccessNew(srcinputstream.c)函数,创建stream_t结构体对象,并初始化对象中所有函数指针;,6.再调用stream_Seek(includevlc_stream.h)内联函数,设置起始位置7.调用stream_Size(includevlc_stream.h)获得大小;8.调用stream_Read(includevlc_stream.h),读取到缓冲区;9.libvlc_media_player_play播放通过input_Create创建线程运行空间,input_Start中创建线程Run(src
17、inputinput.c)10.Run线程是整个VLC作为流媒体服务器的核心。其主要分为如下几个步骤:Init、MainLoop和End。其中MainLoop是一个无限循环,是完成流媒体的整个发布过程:a.首先调用Init(srcinputinput.c)函数,初始化相关统计参数;b.其次再调用input_EsOutNew(srcinputes_out.c)函数,初始化es_out_t结构体对象和es_out_sys_t结构体对象,并设置相关函数指针;c.再调用InputSourceInit(srcinputinput.c)函数,初始化input_thread_t对象中的input_sourc
18、e_t对象,主要有access_t、stream_t、demux_t三个结构体对象;,d.再调用MainLoop(srcinputinput.c)函数,完成读取、解复用、解码、复用和传输;e.MainLoop函数为无限循环,直到input_thread_t对象存在b_die、b_error、b_eof时为止。在该函数中,存在如下行代码:i_ret=p_input-input.p_demux-pf_demux(p_input-input.p_demux);它就是流媒体服务器运行的起点,所有的后续操作都会在该函数中继续衍生。f.pf_demux调用的是(modulesdemuxps)中的Demux
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vlc 播放 架构 汇总 课件

链接地址:https://www.31ppt.com/p-1481593.html