`

视频播放的基本原理

阅读更多

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不一定是解码器,也可能是某种其他的处理。


http://blog.csdn.net/bisword/archive/2009/02/05/3865000.aspx

分享到:
评论

相关推荐

    视频播放的基本原理详解

    ### 视频播放基本原理详解 #### 一、视频播放器概述 视频播放器是用于解码和播放视频文件的应用程序。随着互联网技术的发展,视频播放器已经成为了人们日常生活中不可或缺的一部分。本文将通过分析VLC播放器的工作...

    vlc 视频播放的基本原理

    ### VLC视频播放的基本原理 #### 一、视频播放器架构概览 在深入解析VLC视频播放器的工作原理之前,我们需要先对视频播放的基本架构有一个大概的了解。无论是VLC、MPlayer还是Xine,甚至是DirectShow等播放器,在...

    视频播放器原理

    本文将围绕视频播放的基本原理展开,深入探讨视频播放器内部的工作流程及其关键技术。 #### 一、视频播放基本原理概述 视频播放器的主要任务是将数字视频信号转换为人们可以感知的视觉和听觉信息。这一过程可以...

    嵌入式视频处理基本原理-ADI

    【嵌入式视频处理基本原理】是关于在嵌入式系统中处理视频信号的技术,它涉及到多种关键概念和挑战。嵌入式视频处理涵盖了视频接口、显示处理和模拟视频等重要方面。 首先,视频接口是连接视频源和显示设备的关键...

    嵌入式视频处理基本原理

    ### 嵌入式视频处理基本原理:深入探讨 #### 一、人类视觉感知与视频技术的关系 在探讨嵌入式视频处理之前,先理解人类视觉感知的基本原理至关重要,因为视频处理技术的设计往往受到人眼特性的启发。人眼包含两种...

    基础知识-嵌入式视频处理基本原理

    ### 基础知识-嵌入式视频处理基本原理 #### 一、视频技术概览 随着科技的进步和发展,视频技术已经成为人们生活中不可或缺的一部分。在嵌入式领域中,掌握视频处理的基本原理对于构建高性能多媒体系统至关重要。...

    视频监控基本原理PPT学习教案.pptx

    "视频监控基本原理PPT学习教案" 视频监控基本原理是安全防范的一部分,涉及到安全防范的概念、手段和技术。安全防范是社会公共安全的一部分,以防盗、防劫、防入侵、防破坏为主要内容。安全防范有三种基本手段:...

    .net 视频播放插件

    首先,我们需要理解.NET视频播放插件的基本原理。这种插件通常是基于.NET Framework开发的,利用C#或VB.NET等编程语言编写,它提供了一种接口,使得Web应用程序能够调用播放器控件来播放多媒体内容。在.NET环境中,...

    背景视频循环播放短暂黑屏、播放自动停止解决办法

    在处理背景视频循环播放过程中遇到的短暂黑屏和播放自动停止问题时,首先需要了解的是循环播放视频的基本原理和可能出现故障的环节。循环播放视频是指在一段视频播放结束后,自动开始重新播放,从而形成一个连续的...

    海康威视-视频监控原理培训.pptx

    海康威视 视频监控原理 培训 教程从安防的发展、分类以及视频监控设计到的设备等进行了系统的讲解,为广大安防从业者提供了较为详实的理论教材。

    视频video原理

    要理解电视机之前,我们先了解一下光的基本原理。白光的光谱中包含着红橙黄绿青蓝紫等七多种光,这是牛顿老师发现的。后来,科学家又发现这七种光实际就是三段光谱,分别是红光、蓝光、绿光。这三种光进行混合就能混...

    仿头条视频播放在线播放

    JiaoZiVideoPlayer可能是一个开源的Android视频播放器库,它提供了基本的播放、暂停、快进、快退等功能,还可能支持弹幕、倍速播放、画面缩放等高级特性。开发者需要理解Android多媒体框架,如MediaPlayer、...

    浏览器播放视频测试

    这个开源插件的工作原理可能是通过JavaScript和Flash技术,创建一个桥接,使得即使在不支持Flash的现代浏览器中,也能通过Flash技术解析和播放FLV视频流。同时,为了提升用户体验,插件可能还会包含自动检测浏览器...

    WPF MediaElement视频播放

    它的核心功能包括播放、暂停、停止、快进、倒退等基本操作,还可以调整音量和显示视频画面。 要使用MediaElement,首先需要在XAML布局文件中声明它。一个简单的示例如下: ```xml ``` 在上面的代码中,`...

    php视频播放程序

    ### PHP视频播放程序知识点解析 #### 一、代码解析与功能...综上所述,通过以上对PHP视频播放程序的解析,我们不仅了解了其实现原理和技术细节,还拓展了许多相关的知识点。这对于开发人员来说是十分宝贵的参考资料。

    视频通信系统的基本原理学习.ppt

    视频通信系统的基本原理主要涉及视频数据的采集、编码、解码、显示以及网络传输等多个方面。以下是对这些知识点的详细阐述: 1. 视频通信系统基本框架: 视频通信系统通常由视频采集、处理、编码、网络传输和解码...

    Linux源代码实验--210音视频播放实验

    这些问题的解决需要对多媒体处理的基本原理有深刻理解,比如时间戳的处理、解码流程、缓冲区管理等。 此外,如果实验涉及到开发自定义播放器,那么我们还需要学习Qt或GTK+等GUI库,用于创建用户界面。同时,需要...

    点击图片播放视频

    这个过程需要理解前端开发的基本原理,包括网页交互、DOM操作和视频播放API的使用。对于初学者来说,这是一个很好的实践项目,可以帮助他们提升Web开发技能。而对于有经验的开发者,这样的设计可以提高网站的互动性...

    HTML5视频播放示例

    本示例旨在帮助初学者理解并掌握HTML5视频播放的基本原理和实践技巧。 首先,HTML5通过`<video>`标签引入了原生的视频播放支持。这是一个自闭合的元素,可以嵌入到HTML文档中,用于展示视频内容。基本语法如下: `...

    Vitamio视频播放Demo源码

    7. **UI设计**:除了基本的视频播放功能,源码可能还包含自定义播放器界面的设计,例如进度条、全屏切换、播放/暂停按钮等,这些都是通过Android的布局和事件处理实现的。 8. **硬件加速**:Vitamio的一个亮点是...

Global site tag (gtag.js) - Google Analytics