当初看VLC代码花了不少时间,其中很大的原因是不太了解视频播放的基本原理。现在看来,几乎所有的视频播放器,如VLC、MPlayer、Xine,包 括DirectShow,在播放视频的原理和架构上都是非常相似的,理解这个对理解VLC的源码会有事半功倍的效果。大致的来说,播放一个视频分为4个步骤: 1. acess 访问,或者理解为接收、获取、得到 2. demux 解复用,就是把通常合在一起的音频和视频分离(还有可能的字幕) 3. decode 解码,包括音频和视频的解码 4. output 输出,也分为音频和视频的输出(aout和vout)拿播放一个UDP组播的MPEG TS流来说吧,access部分负责从网络接收组播流,放到VLC的内存缓冲区中,access模块关注IP协议,如是否IPv6、组播地址、组播协议、 端口等信息;如果检测出来是RTP协议(RTP协议在UDP头部简单得加上了固定12个字节的信息),还要分析RTP头部信息。这部分可以参看VLC源码 /modules/access/udp.c 。在同目录下还可以看到大量的access模块,如file、http、dvd、ftp、smb、tcp、dshow、mms、v4l…等等而demux部分首先要解析TS流的信息。TS格式是MPEG2协议的一部分,概括地说,TS通常是固定188字节的一个packet,一个TS流可以包 含多个program(节目),一个program又可以包含多个视频、音频、和文字信息的ES流;每个ES流会有不同的PID标示。而又为了可以分析这 些ES流,TS有一些固定的PID用来间隔发送program和es流信息的表格:PAT和PMT表。关于TS格式的详细信息可以去google一下。 VLC专门做了一个独立的库libdvbpsi来解析和编码TS流,而调用它的代码可以参见VLC源码 /modules/demux/ts.c。其实之所以需要demux,是因为音视频在制作的时候实际上都是独立编码的,得到的是分开的数据,为了传输方便必须要用某种方式合起来,这就有了各种封装 格式也就有了demux。 demux分解出来的音频和视频流分别送往音频解码器和视频解码器。因为原始的音视频都是占用大量空间,而且冗余度较高的数据,通常在制作的时候就会进行 某种压缩。这就是我们熟知的音视频编码格式,包括MPEG1(VCD)、MPEG2(DVD)、MPEG4、H.264、rmvb等等。音视频解码器的作 用就是把这些压缩了的数据还原成原始的音视频数据。VLC解码MPEG2使用了一个独立的库libmpeg2,调用它的源文件是 /modules/codec/libmpeg2.c。VLC关于编解码的模块都放在/modules/codec目录下,其中包括著名的庞大的 ffmpeg。解码器,例如视频解码器输出的是一张一张的类似位图格式的图像,但是要让人从屏幕看得到,还需要一个视频输出的模块。当然可以像一个Win32窗口程序那 样直接把图像画到窗口DC上——VLC的一个输出模块WinGDI就是这么干的,但是通常这太慢了,而且消耗大量的CPU。在Windows下比较好的办 法是用DirectX的接口,会自动调用显卡的加速功能。这样的功能分解使得模块化更容易一点,每个模块住需要专注于自己的事;从整体来说功能强大而且灵活。但是事情总是不会那么简单。就拿access来说,媒体的访问是分层的,如RTSP就涉及到IPv4、TCP、UDP、RTCP、RTSP等多个层次的协 议。有些视频格式包括了传输、封装格式和编辑码格式如MPEG系列,有些封装格式是独立的容器,但是很多人会误解它是编解码格式,如mkv、avi这些。音频和视频在demux之后就是独立的,但是需要有一套机制把它们同步起来。同时我们需要有一套机制来控制速度、暂停、停止、跳进,获取各种媒体信息,这 些都是很复杂而又很重要的事情。另外也许需要在某个地方插入一些修改,来实现某种效果。如音频的EQ,视频的亮度调整之类的,VLC专门设计了access_filter、 audio_filter和video_filter类型的模块来做这一类事情。 VLC比较独特的地方是集成了原来的VLS的功能,这依赖于VLC中stream_output类型的模块,它们可以把正在播放的视频以某种方式重新转码 和发送出去,如http、UDP、文件等等。 MPlayer的结构与此是类似的,如/stream目录对应的是access的功能,/mpdemux对应的demux功能,/libmpcodecs 是解码器,/libvo和/libao2分别是视频和音频的输出。 DirectShow也是类似的,不过分类更多一些更复杂一点。DirectShow里面的模块叫做“filter”,filter之间通过”pin”来 连接。access的模块对应于DirectShow中的Source FIlter,这一类Filter只有输出pin没有输入pin。demux模块对应于splitter filter,这种filter有一个输入pin,多个输出pin。解码模块是一类transform filter,有一个输入pin、一个输出pin,输出模块对应于readering filter,有一个输入pin,没有输出pin。当然transform filter不一定是解码器,也可能是某种其他的处理。 原文地址 http://hi.baidu.com/skw0rm/blog/item/0ed9e5d3469d550b3af3cfac.html
分享到:
相关推荐
网上看到的一些视频播放的基本原理,经过分析总结,感觉还不错~!
当初看VLC代码花了不少时间,其中很大的原因是不太了解视频播放的基本原理。现在看来,几乎所有的视频播放器,如VLC、MPlayer、Xine,包 括DirectShow,在播放视频的原理和架构上都是非常相似的,理解这个对理解VLC...
嵌入式视频相关介绍 包括 视频接口 显示处理 模拟视频等内容
三极管工作原理视频教程rar,三极管工作原理视频教程
视频监控基本原理PPT学习教案.pptx
视频通信系统的基本原理学习.ppt
讲述嵌入式设备上视频处理的相关知识,比较有实用价值
视频原理,电视基本原理 , 色彩原理,在彩色电视机里,为了减小传输带宽
目录 华为HCIE RS-MPLS原理1.rar 华为HCIE RS-MPLS原理2.rar 华为HCIE RS-MPLS原理3.rar 华为HCIE RS-MPLS原理4.rar 华为HCIE RS-MPLS原理5.rar
CA基本原理课件
SNIFF真是一个古老的话题,关于在网络上采用SNIFF来获取敏感信息已经不是什么新鲜事,也不乏很多成功的案例,那么,SNIFF究竟是什么呢?SNIFF就是嗅探器,就是窃听器,SNIFF静悄悄的工作在网络的底层,把你的秘密...
本书是MPEG基本原理的经典教材,内容通俗易读,是一本不可多得的好书! 前言: MPEG 是当今最流行的音频/ 视频压缩技术之一。这是因为它不仅仅是一个单独的标准,而是一系 列以相似理论为基础且适合于不同应用的...
02-配合视频讲解CRT的基本原理。.pptx
本书从人眼的视觉出发,...介绍了目前国际上已实施的DVB-S、DVB-C、DVB-T、STSC和ISDB-T数学视频广播系统,以及条件接收、交互电视和视频点揪系统的基本概念;重点介绍了当前市场流行的几种机顶盒,并举例进行了分析
ASP.NET AJAX控件演示视频之ASP.NET AJAX基本原理
本文档是基于黑马程序员的b站视频课总结出来的,如果涉及侵权,请联系我删除。 这个文档里面记录了手动配置webpack的详细步骤,每个步骤都有相应的说明和截图说明。以及我在手动配置webapck的时候遇到的一些问题以及...
矢量量化原理与应用本书介绍矢量量化的基本原理,各种矢量量化的构造和设计方法,以及矢量量化在语音编码,图像编码,语声识别与合成中的应用。 全文目录 第一章 概述 一、引言 第二章 矢量量化的基本原理 第三章 ...
本视频的配套教程可以使用陈火旺版的编译原理,习题也基本一致。 课程主讲人: 廖力。个人感觉这个老师讲的很不错,条理清晰,逻辑分明。推荐一下。 编译原理一般认为是较难的一门课.从网上的评论来看,有人说学了...
视频压缩编码的基本原理和方法上课用有删减PPT学习教案.pptx
嵌入式视频处理基本原理