视频播放的基本原理

视频播放的基本原理

VLC是一个功能强大的玩意,能做很多有意思的事情。

最简单的,从界面打开一个文件播放,也可以在命令行下使用,如
C:/Program Files/VideoLAN/VLC>vlc.exe test.ts

获取内置的帮助,会写到vlc-help.txt
C:/Program Files/VideoLAN/VLC>vlc.exe -h

获取更详细的帮助,有大量的选项介绍
C:/Program Files/VideoLAN/VLC>vlc.exe -H

在线使用帮助
http://www.videolan.org/doc/play-howto/en/play-howto-en.html
http://www.videolan.org/doc/streaming-howto/en/streaming-howto-en.html

搜索并显示可用的模块列表
C:/Program Files/VideoLAN/VLC>vlc.exe -l

Windows下,默认情况,VLC的配置文件在 %APPDATA%/vlc/vlcrc
%APPDATA%在XP下通常是 C:/Documents and Settings/用户名/Application Data
Linux下,在用户home目录的/.vlc/中

vlc的选项完全可以通过修改vlcrc来设置,界面只是略微方便一点

重置所有选项到默认状态
C:/Program Files/VideoLAN/VLC>vlc.exe –reset-config

VLC从vlcrc中指定的plugin-path,以及当前目录的modules和plugins目录来递归查找plugin

VLC的大部分功能都是通过plugin来实现的。VLC默认有大量的动态插件,例如官方VLC 0.8.6e有210个插件。为了加快启动速度,vlc会在%APPDATA%/vlc/cache中缓存plugin的列表,选项plugins-cache=0可以禁止缓存plugin

打开一个UDP组播流,组播组 239.255.1.1,端口 4567,默认端口1234
对于rtp协议,VLC会自动识别,写udp还是rtp都没问题
C:/Program Files/VideoLAN/VLC>vlc.exe udp://@239.255.1.1:4567

在本地UDP端口 888 接收流, “@”表示绑定一个地址,而不是连接该地址
C:/Program Files/VideoLAN/VLC>vlc.exe udp://@888

串流输出,就是在播放的时候,以某种方式向外传送视频,在打开界面
的串流/保存 中设置会比较方便
例如,循环播放test.ts, 以rtp方式传送到224.1.1.1端口1234, 同时显示视频
vlc.exe test.ts –loop :sout=#duplicate{dst=std{access=rtp,mux=ts,dst=224.1.1.1:1234},dst=display}
例如,接收UDP端口888,数据全部保存到C:/dump.ts
vlc.exe udp://@888 :demux=dump :demuxdump-file=”C:/dump.ts”

关于Windows下视频输出模块
Direct3D :效果比DirectX差一点,但是方便截图,也可以在图像上实现alpha
DirectX:效果最好,利用DirectX的显示加速
OpenGL:在不同的硬件上表现不太一样
WinGDI:最慢的一种,不需要显卡加速
caca:用彩色的Assic字符来显示,很有意思
临时启用某个视频输出,可以这样
C:/Program Files/VideoLAN/VLC-0.8.6e>vlc test.ts –vout=caca

ActiveX控件
官方发布的VLC自带ActiveX控件 axvlc.dll,注册之后可以方便的在应用程序和网页
中使用VLC,注册的办法是
C:/Program Files/VideoLAN/VLC-0.8.6e>regsvr32 axvlc.dll
ActiveX VLC的使用方法可以参考源代码中ActiveX目录的README.TXT和test.html
ActiveX控件的接口有第一版和第二版,第一版简单,功能少,已经不再维护
建议用第二版本,功能多一点

Mozilla Plugin
你还可以在Windows和Linux的Firefox中使用VLC。Windows下可以在安装VLC的时候选上
Mozilla plugin,事实上它做的就是在HKLM_Software_MozillaPlugin键下添加一个VLC的子键。
Linux下就不太清楚了,但是你可以把libvlcplugin.so(或者叫npvlc.so)和插件目录
放到Firefox的plugins目录,来使之生效。
同样这适用于基于Xulrunner的应用程序,事实上像 Miro、SongBird等xul应用都是用的
这个插件。
与ActiveX类似的,VLC的Mozilla Plugin也有两套接口,建议用新的第二版。

注册表
在Windows下VLC只使用很少量的注册表的信息,最重要的一条是HKLM_Software_VLC键
下的InstallDir项,VLC的Mozilla Plugin和ActiveX控件通过这一项来定位其插件的目录

Telnet、Http控制
对VLC来说,控制界面都是Interface类的模块,你可以使用各种控制模块。Windows下
默认使用的是wxwidgets图形界面,你还可以使用http、telnet等界面,来远程控制VLC,
够酷吧?如果你用VLC在服务器上专门作视频流转发一类的事情,这种远程界面
可以帮上大忙。

视频过滤器
0.8系列中有多达13种视频过滤器,为视频添加各种效果和特殊处理。用的比
较多的是反交错deinterlace过滤器,在观看MPEG2视频时很有用。

Skin2界面
一个漂亮一点的,可以换肤的界面,觉得它不太稳定很少用。

其他的
播放DVD、VCD光盘,打开DirectShow设备,播放当前屏幕…很多好玩的功能可以去摸索一下

一些问题

目前的VLC无法播放Real视频,如rm、rmvb。其实从0.9版本的VLC开始可以依赖其他解码
器播放。但就目前测试的情况来看,顺序播放没问题,但是拖动则效果很差

RTSP的播放,拖动有问题,在获取播放位置时有缺陷。例如和达尔文服务器的配合。

视频播放的基本原理

当初看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不一定是解码器,也可能是某**重点内容**种其他的处理。
时间: 2024-08-14 08:03:51

视频播放的基本原理的相关文章

腾讯Android自动化测试实战2.1.2 自动化测试框架基本原理

2.1.2 自动化测试框架基本原理 经过前面的一个简单的自动化测试案例,我们对Android的自动化测试有了一个感性的认识,很多有相关工作经验的测试同学也都会理解,这和PC的自动化测试思路是相通的,只不过所借助的框架不同,目前业界已经有很多成熟的开源Android端自动化测试框架,经常用到的框架代表有Robotium和UI Automator,各个框架可能在具体应用上有些不同,如有些偏稳定性,有些适用于Web应用,有些能支持跨应用,等等,但其主要思想是通过控件的位置.名称.属性等获取控件对象,并

android-微信聊天界面气泡形式的小视频播放如何实现?

问题描述 微信聊天界面气泡形式的小视频播放如何实现? 用.9图实现时会有边框,而微信里的效果应该不是这样实现的,连右边的小三角也是视频画面,有没有大神指点下这是如何实现的? 解决方案 产生一个图片,点击以后打开新的activity播放 解决方案二: 你想实现什么效果还用疑问句?谁也不知道呀

Robocode基本原理之坐标锁定

导论 前面我们了解了Robocode中的绝对方向,相对方向及整个方向系统.相信大 家对此深有体会了.但是问题又来了,单知道方向似乎不能完全达到了解敌人的 目的.怎样去探测敌人的距离?怎样精确的锁定目标呢?对于移动中的目标我们 又如何处理?在这里我们将利用Java.lang 基本类库中的Math类及一些基本三角 函数方法为你揭开这些迷雾.对于那些快被遗忘的三角几何知识在本文的最后 Skyala.Li有比较详细的讲解. 坐标基本概念 首先我们还是来看看Robocode API中的一段文字翻译. Al

视频播放的那些事

视频作为淘宝教育业务的基础服务,本文根据自身在手淘中视频播放的实践,谈谈在手淘中视频播放遇到的问题及其解决方案. 播放器 在手淘过去一年多的历史长河中存在五种类型的播放器. 原生 HTML5 video 标签 Android 5.3.2 版本之后的 UC 内核增强 SAC 播放器 Android 5.4.9 版本之后的 UC HAC 播放器 Android 5.3.2 版本之前的 Glue native 播放器 Android 5.3.2 版本及其之后的 PlayBuddy 播放器 下面从支持平

红蜻蜓抓图精灵为何抓视频播放器画面结果一片漆黑?

  用户普遍反映红蜻蜓抓图精灵(RdfSnap)无法对视频播放器中的视频进行正确捕捉,表现为只能捕捉播放器框架,而播放画面处只有黑背底没有图像,这个问题可以通过降低视频播放器的视频加速性能来解决,以下是几种播放器的设置方法: 1)RealOne 播放器:鼠标点击 RealOne 播放器菜单中的[工具]>>[首选项],在弹出的[首选项]窗口左侧列表中选择[硬件],将右下方[视频卡兼容性]调整到中间或最左端; 2)Real Player 播放器:鼠标点击 Real Player 播放器菜单中的[视

网页视频播放器程序代码通用代码

在给客户做个程序时,突然遇到个问题,就是产品页用户提交视频播放文件时,如何根据提交的网址内的视频格式进行正确的播放呢....郁闷了一会,想好了思路,说动手就动手... 思路是先取得文件的类型,并根据类型选择不同的网页播放器代码..三下五去二.....同时为了代码在以后的复用性,写成了通用的调用函数.方便以后在别的系统中调用.. 现发布源代码如下: 以下为引用的内容:Sub SelPlay(strUrl,strWidth,StrHeight)Dim Exts,isExtIf strUrl <>

网页设计参考:WEBJX收集网页视频播放器的界面设计案例

文章描述:20个视频播放器界面欣赏及点评. 网页设计中非常细节的东西,比如就一个描边,有时就造成了用户心理感受上的差别,进而影响用户的使用偏好,直至对整个设计的成功与否以及作品的商业价值产生非常大的影响.类似于"千里之堤毁于蚁穴"和"蝴蝶效应"的感觉.夸大其词吗?绝对不!细节的力量我认为在网页设计中有着无穷的魅力.认真想想那些你个人认为优秀的设计作品,其中是什么东西打动了你?真的很多时候就是一种描述不出来的颜色,一些1像素的高光,或者是一种质感. 例如下面的这20个

我优化YouTube视频播放页面的故事

  三年前,当我还在YouTube做一名web程序员时,有一位资深的工程师发了一通牢骚,说播放视频的页面体积太大.这个页面体积已经膨胀到了高达 1.2MB,包含有数十次的请求.这个工程师公开的宣称说,"如果他们Quake能在100KB的体积下克隆出我们的页面,我们没有理由达不到这个体 积!"因为我同意他的观点,并且我正在找新的任务,于是就决定接受这个挑战,让YouTube的视频播放页面的体积减到100KB以下.那天晚上从旧金山 回家的火车上,我编写了一个基本的原型.我决定限制页面上的功

网页中插入视频播放代码全集

插入|视频播放|网页 1.avi格式 代码片断如下: <object id="video" width="400" height="200" border="0" classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"><param name="ShowDisplay" value="0">&l