一般情况下,播放一个音视频分为4个步骤
可以理解为接收、获取、得到数据资源,包括解析访问源(url),
使用http协议,rtsp协议,ftp协议,建立连接,获取数据。
就是把通常合在一起的音频和视频分离,当然也有可能有字幕。通过分析数据包头来判断是什么数据文件,需要用什么解码格式。
为什么需要demux
其实之所以需要demux,是因为音视频在制作的时候实际上都是独立编码的,得到的是分开的数据,为了传输方便,必须用某种方式结合起来,这就有了各种封装格式,也就有了demux。
包括音频和视频解码,或者软件解码和硬件解码。
分为音频和视频的输出(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(Video Lan Clent)是一个完整的多媒体框架,最大特点是可以根据需要动态加载许多插件模块,支持视频传输,封装和编码格式。框架核心是利用程序将各模块链接起来。对输入媒体数据,经过各模块处理后输出。
vlc目录结构:
access
audio-filter
audio-mixer
audio-output
codec
control
插件控制播放器的各种接口:手势、热键、远程控制和telnet
demux:不同解复用程序
packetizer:打包模块,用于H264/AVC和MPEG 4音视频流
video-chroma :图像格式装换,如YUV转RGB
video-filter:各种视频滤波模块,如Deinterlace,Transform,Wall,Crop等。
video-output:视频输出模块
Src模块
视频输出:可以通过DriectX,X11,XVideo,SDL,FrameBuffer,ASCII