VLC视频播放器原理详细分析含TS流格式分析

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\用户名\ApplicationData
Linux下,在用户home目录的/.vlc/中
vlc的选项完全可以通过修改vlcrc来设置,界面只是略微方便一点
重置所有选项到默认状态
C:\Program Files\VideoLAN\VLC>vlc.exe–reset-config
VLC从vlcrc中指定的plugin-path,以及当前目录的modules和plugins目录来递归查找plugin
VLC 的大部分功能都是通过plugin来实现的。VLC默认有大量的动态插件,例如官方VLC0.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.exeudp://@239.255.1.1:4567
在本地UDP端口 888 接收流, “@”表示绑定一个地址,而不是连接该地址
C:\Program Files\VideoLAN\VLC>vlc.exeudp://@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>regsvr32axvlc.dll
ActiveX VLC的使用方法可以参考源代码中ActiveX目录的README.TXT和test.html
ActiveX控件的接口有第一版和第二版,第一版简单,功能少,已经不再维护
建议用第二版本,功能多一点
Mozilla Plugin
你还可以在Windows和Linux的Firefox中使用VLC。Windows下可以在安装VLC的时候选上
Mozillaplugin,事实上它做的就是在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组播的MPEGTS流来说吧,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中的SourceFIlter,这一类Filter只有输出pin没有输入pin。demux模块对应于splitterfilter,这种filter有一个输入pin,多个输出pin。解码模块是一类transformfilter,有一个输入pin、一个输出pin,输出模块对应于readeringfilter,有一个输入pin,没有输出pin。当然transform filter不一定是解码器,也可能是某种其他的处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法入门篇八 贪心算法

牛客网 左程云老师的算法入门课 贪心算法 贪心算法的解题步骤 例子 题目要求 解题策略 按照结束时间早的会议先安排,比如先安排【2,4】,当4结束了,所有开始时间小于4的全部淘汰,【1,7】、【3&#xff…

算法入门篇九 暴力递归

牛客网 左程云老师的算法入门课 暴力递归 原则 汉诺塔问题 问题 打印n层汉诺塔从左边移动到最右边的过程 思想 一共六个过程,左到右、左到中,中到左,中到右,右到左,右到中,互相嵌套使用 左到右 将1…

rtsp和sdp

RTSP 是由Realnetwork 和Netscape共同提出的如何有效地在IP网络上传输流媒体数据的应用层协议 。 实时流协议(RTSP)建立并控制一个或几个时间同步的连续流媒体,如音频和视频。尽管连续媒体流与控制流交叉是可能的,RTSP本身并不发…

使用javascript实现对于chineseocr的API调用

ChineseOCR在线API 网页地址 界面 提供多种接口调用方式,比如在线调用、Javascript api调用、curl api调用和python api调用四种方式,本次使用javascript api调用的方式进行OCR识别在线Javascript工具 在线工具网页链接在线Base64 转化工具 在线工具…

移动流媒体业务的技术与标准

1 引言   流媒体业务是从Internet上发展起来的一种多媒体应用,指使用流(Streaming)方式在网络上传输的多媒体文件,包括音频、视频和动画等。   流媒体传输技术的主要特点是以流(streaming)的形式进行多…

使用python实现对于chineseocr的API调用

ChineseOCR在线API 网页链接 界面 提供多种接口调用方式,比如在线调用、Javascript api调用、curl api调用和python api调用四种方式,本次使用javascript api调用的方式进行OCR识别在线Base64 转化工具 Base64在线小工具代码修改 新增一个变量fill_w…

UDP穿透NAT

NAT(Network AddressTranslators),网络地址转换: 网络地址转换是在IP地址日益缺乏的情况下产生的,它的主要目的就是为了能够地址重用。NAT分为两大类,基本的NAT和NAPT(Network Address/Port Translator)。 最开始NAT是运行在路由器…

算法入门篇十 图

图的存储方式 临接表临接矩阵 表达 点集/边集有向图/无向图 Graph&#xff08;大结构就是图&#xff09;&#xff08;包含点集合和边集合&#xff09; import java.util.HashMap; import java.util.HashSet;public class Graph {public HashMap<Integer, Node> nodes;…

SDP协议 学习笔记

SDP:Session Description ProtocolSDP格式:Session descriptionv (protocolversion)o (owner/creatorand session identifier)s (sessionname)i* (sessioninformation)u* (URI ofdescription)e* (emailaddress)p* (phonenumber)c*(connection information - not required if in…

以太坊私有链 使用dev模式

dev 使用dev模式&#xff0c;创建一个管理员账号&#xff0c;控制挖矿&#xff0c;将证明机制改为POA启动dev模式&#xff0c;需要重新创建一个文件夹&#xff0c;重新搭建私有链条 命令 mkdir myDevChain cd myDevChain geth --datadir . --dev console 2>output.log 实…

超文本传输协议

超文本传输协议 超文本传输协议超文件传输协定(HTTP&#xff0c;HyperTextTransfer Protocol)是因特网上应用最为广泛的一种网络传输协定。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。 目录 介绍请求信息请求方法安全方法超…

以太坊区块链 JSON-RPC

RPC定义 以太坊客户端提供了API和一组远程调用的&#xff08;RPC&#xff09;命令&#xff0c;这些命令被编码成json的格式&#xff0c;被叫做JSON-RPC-API。本质上&#xff0c;JSON-RPC API就是一个接口&#xff0c;允许我们编写的程序使用以太坊客户端作为网关&#xff0c;访…

利用MFC调用libvlc.dll作一个简单的播放器

简单介绍MFC调用libvlc.dll作一个简单的播放器&#xff0c;抛砖引玉&#xff0c;各位VC达人继续深入研究&#xff0c;Jeremiah对VC确实不太感兴趣&#xff0c;所以就不做太深入的研究了。2009.10.29修改&#xff1a;加入clip_children属性设置。参开第1步。环境&#xff1a; …

对于以太坊虚拟机 (EVM)及其相关知识的讲解

以太坊虚拟机&#xff08;EVM&#xff09; EVM是智能合约的运行环境作为区块验证协议的一部分&#xff0c;参与网络的每个节点都会运行EVM&#xff0c;审查节点会检查验证正在验证的区块中列出的交易&#xff0c;并运行EVM中交易触发的代码EVM是沙盒封装的&#xff0c;并且是完…

对于以太坊的Solidity语言介绍

Solidity是什么 Solidity是一门面向合约的、为实现智能合约而创建的高级编程语言&#xff0c;主要目的是为了在以太坊虚拟机&#xff08;EVM&#xff09;上运行Solidity是静态语言&#xff0c;支持继承、库和复杂的用户定义等特性内含的类型除了常见的编程语言中的标准类型&am…

live555 接收rtsp视频流流程分析

live555 接收rtsp视频流流程分析 RTSP交互流程 C表示RTSP客户端&#xff0c;S表示RTSP服务端 ① C->S: OPTIONrequest //询问S有哪些方法可用 S->C: OPTION response //S回应信息中包括提供的所有可用方法 ② C->S: DESCRIBErequest //要求得到S…

使用Remix编写Solidity语言的小例子

设置数值/取数值/加法运算 讲解 uint默认使用256位数的整型view表示这个函数仅仅对于数据仅仅是读取&#xff0c;没有修改操作returns(uint )&#xff0c;如果单纯指定uint&#xff0c;返回的是函数体内的return值&#xff0c;如果包含uint sum,uint SAD_a&#xff0c;那么返…

RTP协议栈简介

流媒体指的是在网络中使用流技术传输的连续时基媒体&#xff0c;其特点是在播放前不需要下载整个文件&#xff0c;而是采用边下载边播放的方式&#xff0c;它是视频会议、IP电话等应用场合的技术基础。RTP是进行实时流媒体传输的标准协议和关键技术&#xff0c;本文介绍如何在L…

深入理解Solidity

Solidity源文件布局 pragma&#xff08;版本杂注&#xff09; 用于指定源文件的版本&#xff0c;表明编译器的版本&#xff0c;例如 pragma solidity ^0.4.0^用于指代版本号需要大于0.4.0但是不可以超过大的层级&#xff0c;必须小于0.5.0也可以使用大于等于小于来指定版本 i…

H264 流媒体 编码汇总

实时传输协议&#xff08;RTP&#xff09;和实时控制协议&#xff08;RTCP&#xff09; RTP是一种提供端对端传输服务的实时传输协议&#xff0c;用来支持在单目标广播和多目标广播网络服务中传输实时数据&#xff0c;而实时数据的传输则由RTCP协议来监视和控制。 RTP定义在RFC…