VLC 和 FFmpeg 之间的关系是什么?

您所在的位置:网站首页 vlc流媒体下载 VLC 和 FFmpeg 之间的关系是什么?

VLC 和 FFmpeg 之间的关系是什么?

2022-12-16 22:59| 来源: 网络整理| 查看: 265

VLC:

视频播放的基本原理当初看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不一定是解码器,也可能是某种其他的处理。

Libav、FFmpeg、mplayer、VLC开源项目、FFDshow这个项目最早由Fabrice Bellard发起,现在由Michael Niedermayer维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF“代表"FastForward“,项目组成  FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了目前领先的音/视频编码库libavcodec等。 libavformat :用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构  和读取音视频帧等功能; libavcodec :用于各种类型声音/图像编解码; libavutil :包含一些公共的工具函数; libswscale :用于视频场景比例缩放、色彩映射转换; libpostproc:用于后期效果处理; ffmpeg :该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等; ffsever :一个 HTTP 多媒体即时广播串流服务器; ffplay :是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示;多媒体处理功能  多媒体视频处理工具FFmpeg有非常强大的功能[1]包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。视频采集功能  FFmpeg是在Linux下开发出来的,但它可以在包括Windows在内的大多数操作系统中编译。这个项目是由Fabrice Bellard发起的,现在由Michael Niedermayer主持。  ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用。 ffmpeg在Linux下的视频采集  在Linux平台上,ffmpeg对V4L2的视频设备提高了很好的支持,如:  ./ffmpeg -t 10 -f video4linux2 -s 176*144 -r 8 -i /dev/video0-vcodec h263 -f rtp rtp://192.168.1.105:5060 > /tmp/ffmpeg.sdp  以上命令表示:采集10秒钟视频,对video4linux2视频设备进行采集,采集 QCIF(176*144)的视频,每秒8帧,视频设备为/dev/video0,视频编码为h263,输出格式为RTP,后面定义了IP地址及端口,将该码流所对应的SDP文件重定向到/tmp/ffmpeg.sdp中,将此SDP文件上传到流媒体服务器就可以实现直播了。 ffmpeg在windows下的视频采集  在windows下关于ffmpeg视频采集的资料非常少,但是ffmpeg还是支持windows下视频采集的。ffmpeg支持windows下video for windows(VFW)设备的视频采集,不过VFW设备已经过时,正在被WDM的视频设备所取代,但是ffmpeg还没有支持WDM的计划,不过好像有将WDM转为VFW的工具,因此ffmpeg还是可以在windows下进行视频采集的。视频格式转换功能  ffmpeg视频转换功能。视频格式转换,比如可以将多种视频格式转换为flv格式,可不是视频信号转换,,  ffmpeg可以轻易地实现多种视频格式之间的相互转换(wma,rm,avi,mod等),例如可以将摄录下的视频avi等转成现在视频网站所采用的flv格式。视频截图功能  对于选定的视频,截取指定时间的缩略图。视频抓图,获取静态图和动态图,不提倡抓gif文件;因为抓出的gif文件大而播放不流畅给视频加水印功能  使用ffmpeg 视频添加水印(logo)。支持的格式和协议支持的编码  源自FFmpeg项目组的两个视频编码:  Snow  FFV1  FFmpeg实现的其它音频视频编码: ITU-T video standards: H.261,[5]H.262 (aka MPEG-2Video), H.263[5], H.263v2 and H.264/MPEG-4 AVC[5] ITU-T vocoder standards: G.711µ-law, G.711 A-law, G.722.2 (aka AMR-WB. supports via OpenCORE) andG.726 ISO/IEC MPEG video standards: MPEG-1Video, MPEG-2 Video (aka H.262),MPEG-4 Visual and H.264/MPEG-4 AVC ISO/IEC MPEG audio standards: MP2,MP3, AAC and MPEG-4 ALS ISO/IEC/ITU-T JPEG image standards:JPEG and JPEG-LS SMPTE video standards: VC-1 (akaWMV3), VC-3 (aka AVID DNxHD) and DPX image DVD Forum standards related audio codecs: MLP and AC-3 3GPP vocoder standards: AMR-NB,AMR-WB (aka G.722.2. supports via OpenCORE) Windows Media Player related video codecs: Microsoft RLE, Microsoft Video 1, Cinepak, Indeo 2, 3 and 5[5],Motion JPEG, Microsoft MPEG-4 v1, v2 and v3, WMV1, WMV2 and WMV3 Windows Media Player related audio codecs: WMA1, WMA2, WMA Pro and WMA Voice Real Player related video codecs:Real Video 1, 2, 3 and 4 Real Player related audio codecs:Real Audio 1, 2, 3, 4, 5, 6, 7, 8 and 9 QuickTime related video codecs:Cinepak, Motion JPEG and Sorenson 3 Codec QuickTime related audio codecs:QDesign Music Codec 2 and ALAC Adobe Flash Player related video codecs: Sorenson 3 Codec, VP6 and Flash Screen Video Xiph-Org: Theora, Speex (vialibspeex), Vorbis and FLAC Sony: ATRAC1 and ATRAC3[5] NTT: TwinVQ On2: Duck TrueMotion 1, DuckTrueMotion 2, VP3, VP5[5] and VP6[5] RAD Game Tools: Smacker video andBink video  Truespeech  TXD[6]支持的格式  ASF  AVI  BFI[7]  IFF[8]  RL2[9]  FLV  MXF, Material eXchange Format, SMPTE 377M  Matroska  Maxis XA[10]  MSN Webcam stream[11]  MPEG transport stream  TXD[6]  OMA[12]  GXF, General eXchange Format, SMPTE 360M  mov,mp4,m4a,3gp,支持的协议  HTTP  RTP  RTSP  RealMedia RTSP/RDT  TCP  UDP  Gopher  RTMP  RTMPT, RTMPE, RTMPTE, RTMPS (via librtmp)  SDP  MMS over TCP相关版权  FFmpeg被许多开源项目采用,比如ffmpeg2theora,VLC, MPlayer, HandBrake, Blender, Google Chrome等。还有DirectShow/VFW的ffdshow(externalproject)和QuickTime的Perian (external project)也采用了FFmpeg。FFmpeg耻辱柱(Hall Of Shame):  由于FFmpeg是在LGPL/GPL协议下发布的(如果使用了其中一些使用GPL协议发布的模块则必须使用GPL协议),任何人都可以自由使用,但必须严格遵守LGPL/GPL协议。目前有很多播放软件都使用了FFmpeg的代码,但它们并没有遵守LGPL/GPL协议,没有公开任何源代码。我们应该对这种侵权行为表示耻辱。  2009年加入FFmpeg的播放软件:暴风影音、QQ影音、KMP都在其列。  2009年2月,韩国名软KMPlayer被FFmpeg开源项目发现使用了它们的代码和二进制文件,但是没有按照规定/惯例开放相应说明/源码。因此被人举报,进入了FFmpeg官网上的耻辱黑名单。  2009年5月,网友cehoyos下载了暴风影音软件,解压之后发现其安装程序内包含了大量的开源和私有解码器:avcodec,avformat,avutil,x264,xvid,bass,wmvdmod等,之后暴风影音被正式加入到FFmpeg耻辱名单。  2009年11月,网友roo_zhou向FFmpeg举报,指出QQ影音的credit只给出了修改的FFmpeg源码下载,声称是LGPL许可证。但实际是修改过的ffdshow,采用的是GPL许可证,之后QQ影音被正式加入到FFmpeg耻辱名单之列。

http://blog.csdn.net/leixiaohua1020/article/details/38283297 UDP1.1. 发送H.264裸流至组播地址注:组播地址指的范围是224.0.0.0—239.255.255.255

下面命令实现了发送H.264裸流“chunwan.h264”至地址udp://233.233.233.223:6666

[plain] view plain copy

ffmpeg -re -i chunwan.h264 -vcodec copy -f h264 udp://233.233.233.223:6666

注1:-re一定要加,代表按照帧率发送,否则ffmpeg会一股脑地按最高的效率发送数据。注2:-vcodec copy要加,否则ffmpeg会重新编码输入的H.264裸流。1.2. 播放承载H.264裸流的UDP

[plain] view plain copy

ffplay -f h264 udp://233.233.233.223:6666

注:需要使用-f说明数据类型是H.264播放的时候可以加一些参数,比如-max_delay,下面命令将-max_delay设置为100ms:

[plain] view plain copy

ffplay -max_delay 100000 -f h264 udp://233.233.233.223:6666

1.3. 发送MPEG2裸流至组播地址下面的命令实现了读取本地摄像头的数据,编码为MPEG2,发送至地址udp://233.233.233.223:6666。 [plain] view plain copy

ffmpeg -re -i chunwan.h264 -vcodec mpeg2video -f mpeg2video udp://233.233.233.223:6666 1.4. 播放MPEG2裸流指定-vcodec为mpeg2video即可。

[plain] view plain copy

ffplay -vcodec mpeg2video udp://233.233.233.223:6666

RTP2.1. 发送H.264裸流至组播地址。下面命令实现了发送H.264裸流“chunwan.h264”至地址rtp://233.233.233.223:6666

[plain] view plain copy

ffmpeg -re -i chunwan.h264 -vcodec copy -f rtp rtp://233.233.233.223:6666>test.sdp

注1:-re一定要加,代表按照帧率发送,否则ffmpeg会一股脑地按最高的效率发送数据。注2:-vcodec copy要加,否则ffmpeg会重新编码输入的H.264裸流。注3:最右边的“>test.sdp”用于将ffmpeg的输出信息存储下来形成一个sdp文件。该文件用于RTP的接收。当不加“>test.sdp”的时候,ffmpeg会直接把sdp信息输出到控制台。将该信息复制出来保存成一个后缀是.sdp文本文件,也是可以用来接收该RTP流的。加上“>test.sdp”后,可以直接把这些sdp信息保存成文本。

2.2. 播放承载H.264裸流的RTP。

[plain] view plain copy

ffplay test.sdp

3. RTMP3.1. 发送H.264裸流至RTMP服务器(FlashMedia Server,Red5等)面命令实现了发送H.264裸流“chunwan.h264”至主机为localhost,Application为oflaDemo,Path为livestream的RTMP URL。

[plain] view plain copy

ffmpeg -re -i chunwan.h264 -vcodec copy -f flv rtmp://localhost/oflaDemo/livestream

3.2. 播放RTMP

[plain] view plain copy

ffplay “rtmp://localhost/oflaDemo/livestream live=1”

注:ffplay播放的RTMP URL最好使用双引号括起来,并在后面添加live=1参数,代表实时流。实际上这个参数是传给了ffmpeg的libRTMP的。有关RTMP的处理,可以参考文章:ffmpeg处理RTMP流媒体的命令大全

mplayer的架构如果说MPC是Windows上的元祖,那么mplayer就是linux上媒体播放的元祖了。mplayer使用ffmpeg作为解码核心,也是与 ffmpeg结合最紧密的项目,ffmpeg的代码就是由mplayer来host,开发者群也有非常大的交集。借助linux开发/使用者的强大实力,mplayer建立了要比DirectShow稳定的多的工作流程。超越ffmpeg本身的功能外,后来又通过反向工程使之可以调用Windows上的DirectShow Filter DLL,让mplayer架构越来越吸引人,成为兼具稳定性和性能的优秀作品。

优点:稳定,兼容性也可以说相当不错缺点:代码结构不清晰;纯C语言开发,难于阅读;显卡硬件加速还需要越过更多障碍

VLC的架构VLC是个后起之秀,开发速度的进展可以说是一只奇葩。虽然同样基于ffmpeg,但可能是相对于“左三年右三年缝缝补补又三年”的mplayer架构来说,VLC的架构在设计之初就很好的考虑到模块化开发,所以使它更吸引年轻的开发人员。成为近年发展非常快的架构。

优点:稳定,兼容性也可以说相当不错缺点:纯C语言开发,难于阅读;硬件加速略有障碍

说起视频捕捉问题,我们先要来看一下视频捕捉卡。根据使用的驱动程序的不同来分类,目前市场上大致有两种捕捉卡:VFW (Video for Windows)卡和WDM (Windows Driver Model)卡。前者是一种趋于废弃的驱动模型,而后者是前者的替代模型;WDM还支持更多新的特性,比如直接支持电视接收、视频会议、1394接口的设备、桌面摄像机、多条视频流(Line-21或Closed-Caption等)同时输出等等。采用VFW的一般都是些以前生产的卡;市面上新出现的,一般都是采用了WDM驱动程序。另外,视频捕捉卡的接口,可以是以PCI或AGP的方式插入PC机箱,也可以直接以USB接口的方式外挂;还有就是通过1394接口与PC机相连的数码摄像机等等。

使用DirectShow来处理一般的视频捕捉问题,是相对比较简单的。这当然得益于DirectShow这一整套先进的应用架构。捕捉卡通常也是以一个(Capture) Filter的形式出现的。处理视频捕捉,我们同样是使用Filter Graph,同样是操作Filter;控制起来,就似于操作媒体文件的播放。当然,这主要是从应用程序控制层面上来说的;视频捕捉的应用场合比较多,视频捕捉本身的一些处理还是有它的特殊性的,而且牵涉面比较广

HTML5 视频直播CDN(内容分发网络)技术原理说说CDN技术

HLS-P2P直播: lava-tech / hls-p2phttp://www.gensee.com/blog_31cc34624d7811e58d0290b11c0ec861.html

https://www.zhihu.com/question/42162310作者:姚冬链接:https://www.zhihu.com/question/42162310/answer/93858266来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

【文章福利】免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTCrtmp hlsrtsp ffplay srs 等等)有需要的可以点击994289133加群领取哦~



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3