一般情况下,播放一个音视频分为4个步骤
- 1、access访问
- 2、demux解复用
- 3、decode解码
- 4、output输出
access:访问
可以理解为接收、获取、得到数据资源,包括解析访问源(url),
使用http协议,rtsp协议,ftp协议,建立连接,获取数据。
demux:解复用
就是把通常合在一起的音频和视频分离,当然也有可能有字幕。通过分析数据包头来判断是什么数据文件,需要用什么解码格式。
为什么需要demux
其实之所以需要demux,是因为音视频在制作的时候实际上都是独立编码的,得到的是分开的数据,为了传输方便,必须用某种方式结合起来,这就有了各种封装格式,也就有了demux。
decode解码
包括音频和视频解码,或者软件解码和硬件解码。
out输出
分为音频和视频的输出(aout和vout)
如,播放一个UDP组播的MPEG TS流,
access部分负责从网络接收组播流媒,放到播放器的内存缓冲区,access模块关注ip协议,如是否IPv6,组播地址,组播协议,端口等信息。如果检测到是RTP协议(RTP协议是在UDP头部简单加上12个字节)
而demux部分首先要解析TS流媒的信息。TS格式是MPEG2协议的一部分,一般TS通常是固定188字节的packet,一个TS流中可以包含多个program(节目),一个program可以包含多个视频、音频、和文字信息的ES流,每个ES流会有不同PID标识,而为了可以分析这些ES流,TS有一些固定的PID用来间隔发送program和ES流得表格,PAT和PMT表。
对于VLC播放器,使用libdvbpsi来解析和编码TS流。(调用代码可以参考/modules/demux/ts.c)
demux分离出来的音频和视频流分别送往音频解码器和视频解码器,因为原始的音视频都是占用大量的空间。而且冗余度较高的数据。通常在制作的时候就会进行某种压缩。这就是我们知道的音视频编码格式,H.264,rmvb,mkv。音视频解码器作用就是把压缩的数据还原成原始的音视频数据。(VLC编解码模块都在/modules/codec目录下)。
最后output模块,视频解码器输出的是一张一张的类似位图格式的图像,但是要让人从屏幕看到,还需要一个视频输出的模块。如用SDL显示。音频也是一样,需要将pcm等数据转化成音声。
VLC源码
VLC(Video Lan Clent)是一个完整的多媒体框架,最大特点是可以根据需要动态加载许多插件模块,支持视频传输,封装和编码格式。框架核心是利用程序将各模块链接起来。对输入媒体数据,经过各模块处理后输出。
vlc目录结构:
- doc : 帮助文档
- include:VLC头文件
- lib:VLC对外实现函数目录,和src一起使用
- m4:AutoMake和AutoConf的宏文件
- modules:VLC插件目录
- share:图标、脚本
- src:源码
- contrib:存放可能用到的第三方软件信息
- compat:存放可能使用的函数
access
- dshow:DirectShow获取插件,用于windos平台
- dvb:使用V4L2API的输入模块,用于DVB-S/C/T媒体流
- mms:用于TCP,UDP的MMS和HTTP获取模块
- rtsp:基于实时流传输协议
- screen:获取屏幕图像的输入模块
- vcd:获取VCD数据的输入模块
- vcdx:获取VCD输入模块,可以导航,静止
audio-filter
- channel-mixer:各种混合器,解码器,如Dobly解码器
- converter:定点或浮点音频格式转换
- resample:各种音频重采样模块
audio-mixer
audio-output
codec
- dmo :一个DirectMediaObject解码器
- avcodec:包含ffmpeg库许多音视频解码器
- spudec: RLE DVD小标题解码
control
插件控制播放器的各种接口:手势、热键、远程控制和telnet
demux:不同解复用程序
- asf :asf解复用器
- avi :avi解复用器
- mp4 :mp4解复用器
- mpeg:mpeg解复用器
- playlist:播放清单导入模块
packetizer:打包模块,用于H264/AVC和MPEG 4音视频流
video-chroma :图像格式装换,如YUV转RGB
video-filter:各种视频滤波模块,如Deinterlace,Transform,Wall,Crop等。
video-output:视频输出模块
Src模块
- libVLC:它是提供接口的库,比如給VLC提供功能接口:流的输入,音视频输出,插件管理,线程系统。
- Interface:包含与用户交互的代码,如按键和设备弹出。
- Playlist:管理播放列表的交互,如停止、暂停、下一个,或随机播放。
- Input:打开一个输入组件,读包,解析它们并且将被还原的基本流传递给解码器。
- Video_output:初始化video显示器。从解码器得到所有的图片和子图片。将他们装换成YUV或RGB进行播放。
- Audio_output:初始化音频mixer。如发现正确播放频率,然后重新制作从解码器接受过来的音频帧。
- Stream_output:类似Audio_output
- Misc:被libvlc其他部分使用杂项。如线程系统,消息队列,CPU探测,对象查询系统,
视频输出:可以通过DriectX,X11,XVideo,SDL,FrameBuffer,ASCII