音视频播放流程和FFmpeg中最关键的几个结构体之间的关系

目录

 

1、音视频播放流程图

1.1 流媒体数据

1.2 封装格式(容器)

1.3 音视频的压缩数据

2、FFmpeg中相关的结构体

      1)  解协议(http,rtsp,rtmp,mms)

      2)  解封装(flv,avi,rmvb,mp4)

      3)   解码(h264,mpeg2,aac,mp3)

      4)  存数据


1、音视频播放流程图

1.1 流媒体数据

 

1.2 封装格式(容器)

        什么叫容器,从字面的含义来说,能放东西的东西,就叫容器。

        一部电影,不可能只有图像,还有声音,还会有文件作者,加密信息等等。但是我们又不能把这些东西单独存放,这样太麻烦了。所以发明这样一个桶,用来放图像,声音,等等的东西,就叫视频的容器。ps:又叫封装格式。

       一般来说,文件的拓展名就是容器名。比如.avi,.mp4,.flv,.mkv等,就是不同的容器。

封装格式(也叫容器)就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中,也就是说仅仅是一个外壳,可以把它当成一个放视频轨和音频轨的文件夹也可以。

例如MKV文件封装格式:

常见的视频文件格式:

微软视频 :wmv、asf、asx

Real Player :rm、 rmvb

MPEG视频 :mp4

手机视频 :3gp

Apple视频 :mov、m4v

其他常见视频:avi(一个视频轨和一个音频轨)、dat、mkv、flv、vob等

常见的音频文件格式,主要有两类:

  • 无损格式,例如WAV,FLAC,APE,ALAC,WavPack(WV)

         无损的音频格式(例如FLAC)压缩比大约是2:1,解压时不会产生数据/质量上的损失,解压产生的数据与未压缩的数据完全相同。如需要保证音乐的原始质量,应当选择无损音频编解码器。例如,用免费的FLAC无损音频编解码器你可以在一张DVD-R碟上存储相当于20张CD的音乐

  • 有损格式,例如MP3,AAC,Ogg Vorbis,Opus

        有损文件格式是基于声学心理学的模型,除去人类很难或根本听不到的声音,例如:一个音量很高的声音后面紧跟着一个音量很低的声音。MP3就属于这一类文件。

 

1.3 音视频的压缩数据

        这里的压缩又称编码,压缩的目的是为了减小音视频的数据量,因为

  • 未经压缩的数字视频的数据量巨大
  • 存储困难:一张DVD只能存储几秒钟的未压缩数字视频。
  • 传输困难 1兆的带宽传输一秒的数字电视视频需要大约4分钟。

即时通讯音视频开发(一):视频编解码之理论概述_1.png

 

2、FFmpeg中相关的结构体

         原文链接  雷霄骅:http://www.javashuo.com/article/p-edyzhiah-eq.html

          FFMPEG中结构体很多。最关键的结构体可以分成以下几类:

      1)  解协议(http,rtsp,rtmp,mms)

                AVIOContextURLProtocolURLContext主要存储视音频使用的协议的类型以及状态。URLProtocol存储输入视音频使用的封装格式。每种协议都对应一个URLProtocol结构。(注意:FFMPEG中文件也被当做一种协议“file”)

      2)  解封装(flv,avi,rmvb,mp4)

                 AVFormatContext主要存储视音频封装格式中包含的信息;AVInputFormat存储输入视音频使用的封装格式。每种视音频封装格式都对应一个AVInputFormat 结构。

      3)   解码(h264,mpeg2,aac,mp3)

                每个AVStream存储一个视频/音频流的相关数据;每个AVStream对应一个AVCodecContext,存储该视频/音频流使用解码方式的相关数据;每个AVCodecContext中对应一个AVCodec,包含该视频/音频对应的解码器。每种解码器都对应一个AVCodec结构。

      4)  存数据

              视频的话,每个结构一般是存一帧;音频可能有好几帧

               解码前数据:AVPacket

               解码后数据:AVFrame

他们之间的关系如图所示: