笔记:https://blog.youkuaiyun.com/tainjau/article/category/9272757
音视频基础知识
封装、解码、重采样、像素格式
1.MPEG-4
MPEG-4标准将众多多媒体应用集成于一个完整框架内,旨在为多媒体通信及应用环境提供标准算法及工具,从而建立起一种能被多媒体传输、存储、检索等应用领域普遍采用的统一数据格式。
第十四部分:MPEG-4文件格式
第十五部分:AVC文件格式
第十部分:高级视频编码或称高级视频编码(Advanced Video Coding,缩写为AVC)
●MPEG-4是一套用于 音频、视频信息的压缩编码标准
●MPEG-4 Part 14 MPEG-4文件格式 Part 15中AVC文件格式
●H264 ( AVC Part10 )
2.常用封装格式
●AVI压缩标准可任意选择
●FLV ts流媒体格式
●ASF
●mp4
- 大多数情况下,文件的后缀名就是封装格式的名称
- 封装格式不影响视频画质。它只负责把内部的视频轨和音频轨集成在一起,只起到一个文件夹(或者压缩包)的作用,并没有对视频轨和音频轨造成影响。
分享雷神做的辅助学习封装格式的小工具:
封装格式的主要作用是把视频码流和音频码流按照一定的格式存储在一个文件中。如下图:
3.常用编码格式
●视频H264 ( AVC Part10 ), wmv, XviD ( Part2 ), mjpeg
●音频aac ,MP3(有损), ape(无损), flac
视频编码
:https://blog.youkuaiyun.com/adolph_lu/article/details/89528377
名称 | 推出机构 | 推出时间 | 目前使用领域 |
HEVC(H.265) | MPEG/ITU-T | 2013 | 研发中 |
H.264 | MPEG/ITU-T | 2003 | 各个领域 |
MPEG4 | MPEG | 2001 | 不温不火 |
MPEG2 | MPEG | 1994 | 数字电视 |
VP9 | | 2013 | 研发中 |
VP8 | | 2008 | 不普及 |
VC-1 | Microsoft Inc. | 2006 | 微软平台 |
1.为什么要进行视频编码
- 未经编码的数据数字视频的数据量很大
- 存储困难
- 传输困难
例如:一张大小为1080*720的图像,帧率25FPS,一个像素用12位表示,那么可以作如下计算:
一帧图像的数据大小1080*720*12/8/1024 = 1139KB 约1MB
一秒图像的数据大小1MB*25 = 25MB
一分钟图像的数据大小25MB*60 = 1500MB 约1.6GB
完整的计算:
1080*720*12*25*60 = 1399680000bit
1399680000/8/1024/1024 = 1668MB
从上面的计算就可以看出未经编码的视频数据是有多么的庞大。所以必须经过编码压缩之后,视频数据才方便存储,方便在网络上传输。
2.常见的编码格式
2.1 MPEG1
VCD编码格式。
MPEG1编码标准制定于1992年,可适用于不同带宽的设备,如CD-ROM,Video-CD、CD-i。它用于传输1.5Mbps数据传输率的数字存储媒体运动图像及其伴音的编码,经过MPEG-1标准压缩后,视频数据压缩率为1/100~1/200,影视图像的分辨率为360×240×30(NTSC制)或360×288×25(PAL制),它的质量要比家用录像系统(VHS-Video Home System)的质量略高。音频压缩率为1/6.5,声音接近于CD-DA的质量。MPEG-1允许超过70分钟的高质量的视频和音频存储在一张CD-ROM盘上。
VCD采用的就是MPEG-1的标准,该标准是一个面向家庭电视质量级的视频、音频压缩标准。MPEG-1的编码速率最高可达4-5Mbits/sec,但随着速率的提高,其解码后的图象质量有所降低。MPEG-1也被用于数字电话网络上的视频传输,如非对称数字用户线路(ADSL),视频点播(VOD),以及教育网络等。同时,MPEG-1也可被用做记录媒体或是在INTERNET上传输音频。MPEG1标准占用的网络带宽在1.5M左右。
MPEG1的视频压缩算法对运动不激烈的视频信号可获得较好的图像质量,但当运动激烈时,图像会产生马赛克现象。
2.2 MPEG2
DVD编码格式
MPEG-2制定于1994年,设计目标是高级工业标准的图象质量以及更高的传输率。MPEG-2所能提供的传输率在3-10Mbits/sec间,其在 NTSC制式下的分辨率可达720X486,MPEG-2也可提供并能够提供广播级的视像和CD级的音质。MPEG-2的音频编码可提供左右中及两个环绕 声道,以及一个加重低音声道,和多达7个伴音声道(这就是DVD可有8种语言配音的原因)。
MPEG-2标准中规定了两种输出码流,MPEG2-TS和MPEG2-PS:
- MPEG-TS(Transport Stream(传输流))主要应用于实时传送的节目,比如实时广播的电视节目。 其特点是从视频流的任一片段开始都是可以独立解码。电视节目是任何时候打开电视机都能解码(收看)的
- MPEG2-PS(Program Stream(程序流))主要应用于存储的具有固定时长的节目,如DVD电影,可添加字幕等一些程序操作。PS流其包长不固定,且较长,一旦失去同步信息,接收机无法确定下一包的同步位置,会造成失步,导致严重的信息丢失。PS流适用于误码小、信道较好的环境,如演播室、家庭环境和存储介质中。
2.3 MPEG4
MPEG-4制定于1998年,全称为Moving Picture Experts Group 4,是为了播放流式媒体的高质量视频而专门设计的,它可利用很窄的带度,通过帧重建技术,压缩和传输数据,以求使用最少的数据获得最佳的图像质量。
MPEG-4标准是面向对象的压缩方式,不是像MPEG-1和MPEG-2那样简单地将图像分为一些像块,而是根据图像的内容, 其中的对象(物体、人物、背景)分离出来,分别进行帧内、帧间编码,并允许在不同的对象之间灵活分配码率,对重要的对象分配较多的字节,对次要的对象分配 较少的字节,从而大大提高了压缩比,在较低的码率下获得较好的效果, MPEG-4支持MPEG-1、MPEG-2中大多数功能,提供不同的视频标准源格 式、码率、帧频下矩形图形图像的有效编码。
总之,MPEG-4有三个方面的优势:
- 具有很好的兼容性;
- MPEG-4有很好的压缩比,最高达200:1;
- MPEG-4在提供高压缩比的同时,对数据的损失很小。所以,MPEG-4的应用能大幅度的降低录像存储容量,获得较高的录像清晰度,特别适用于长时间实时录像的需求,同时具备在低带宽上优良的网络传输能力。
2.4 H264/AVC
H.264是一种高性能的视频编解码技术。目前国际上制定视频编解码技术的组织有两个,一个是“国际电联(ITU-T)”,它制定的标准有H.261、H.263、H.263+等,另一个是“国际标准化组织(ISO)”它制定的标准有MPEG-1、MPEG-2、MPEG-4等。而H.264则是由两个组织联合组建的联合视频组(JVT)共同制定的新数字视频编码标准,所以它既是ITU-T的H.264,又是ISO/IEC的MPEG-4高级视频编码(Advanced Video Coding,AVC),而且它将成为MPEG-4标准的第10部分。因此,不论是MPEG-4 AVC、MPEG-4 Part 10,还是ISO/IEC 14496-10,都是指H.264。
H.264最具价值的部分是更高的数据压缩比,在同等的图像质量,H.264的数据压缩比能比DVD系统中使用的 MPEG-2高2~3倍,比MPEG-4高1.5~2倍。举个例子,原始文件的大小如果为100GB,采用MPEG-2压缩标准压缩后变成4GB,压缩比为25∶1,而采用H.264压缩标准压缩后变为1GB,从100GB到1GB,H.264的压缩比达到惊人的100∶1。尤其值得一提的是,H.264在具有高压缩比的同时还拥有高质量流畅的图像。
正因为如此,经过H.264压缩的视频数据,在网络传输过程中所需要的带宽更少,也更加经济。在MPEG-2需要6Mbps的传输速率匹配时,H.264只需要1Mbps~2Mbps的传输速率。
2.5 WMV/WMV-HD//VC-1
WMV(Windows Media Video)是微软公司开发的一组数字影片编解码格式的通称,它是Windows Media架构下的一部分。
WMV最初是为低速率流媒体应用作为专有编解码开发出来的。
WMV-HD也是微软公司所创立的一种视频压缩格式。其压缩率远高于MPEG-2标准,同样是2小时的HDTV节目,如果使用MPEG-2最多只能压缩至30GB,而使用WMV-HD这样的高压缩率编码器,在画质丝毫不降的前提下都可压缩到15GB以下。虽然WMV-HD是微软的独有标准,在开放性和兼容性上没有其他几种格式好,但由于目前大家都在使用微软的操作系统,因此推出之后仍然迅速普及。
除了WMV-HD以外,微软WMV第九版(WMV9)编码技术叫做VC-1,2003年正式提出,于2006年正式成为国际标准,是微软开发的视频压缩技术系列中的最新版本。VC-1结合几种编码格式的优点于一身,在压缩比率上介于H.264与MPEG-2之间,画质表现方面与H.264接近,且在编码算法的复杂度上只为H.264的一半,处于一个中间的平衡点位置,对硬件要求较低、高压缩率、高画质、低耗时等特点使得VC-1成为一种比较理想的编码方式,发展前景较为可观。
2.6 DivX/XviD
DivX是由MPEG-4衍生出的一种视频编码(压缩)标准,也即我们通常所说的DVDrip格式, 它采用了MPEG4的压缩算法,同时又综合了MPEG-4与MP3各方面的技术,说白了就是使用DivX压缩技术对DVD盘片的视频图像进行高质量压缩, 同时用MP3或AC3对音频进行压缩,然后再将视频与音频合成,并加上相应的外挂字幕文件而形成的视频格式。其画质直逼DVD,而体积只有DVD的数分之 一。
Xvid(旧称为XviD)是一个开放源代码的MPEG-4影像编解码器,是由一群原OpenDivX开发者在OpenDivX于2001年7月停止开发后自行开发的。
Xvid支持量化(Quantization)、范围控制的运动侦测(Motion Search)、码率曲线分配(Curve)、动态关键帧距(I-frame interval)、心理视觉亮度修正、演职员表选项、外部自定义控制、运动向量加速(Hinted ME)编码、画面优化解码等众多编码技术,对用户来说功能十分强大。
Xvid的主要竞争对手是DivX。但Xvid是开放源代码的,而DivX则只有免费(不是自由)的版本和商用版本。
2.7 M-JPEG
Motion JPEG(M-JPEG或MJPEG,Motion Joint Photographic Experts Group,FourCC:MJPG)是一种影像压缩格式,其中每一帧图像都分别使用JPEG编码。M-JPEG常用在数字相机和摄像头之类的图像采集设备上,非线性剪辑系统也常用这种格式。QuickTime播放器和包括Mozilla Firefox,Google Chrome,Safari在内许多网页浏览器原生支持M-JPEG。
M-JPEG只使用帧内压缩(区别于算法更复杂的帧间压缩),只单独的对某一帧进行压缩,而不考虑影像画面中不同帧之间的变化。因此压缩效率比较低,一般低于1:20,而使用了帧间压缩的现代影像压缩格式(如MPEG1、MPEG2和H.264/MPEG-4 AVC)一般能超过1:50.由于各帧直接是相互独立的,M-JPEG的编解码在对运算能力和内存的要求较低。
音频编码
:https://blog.youkuaiyun.com/adolph_lu/article/details/89555047
名称 | 推出机构 | 推出时间 | 目前使用领域 |
AAC | MPEG | 1997 | 各个领域(新) |
AC-3 | Dolby Inc. | 1992 | 电影 |
MP3 | MPEG | 1993 | 各个领域(旧) |
WMA | Microsoft Inc. | 1999 | 微软平台 |
1.为什么要进行音频编码
音频编码的主要作用是将音频采样数据(PCM等)压缩成为音频码流,从而降低音频的数据量,偏于存储和传输。
2.音频的裸数据格式就是脉冲编码调制(Pulse Code Modulation,PCM)数据。
描述一段PCM数据一般需要以下几个概念:量化格式(sampleFormat)、采样率(sampleRate)、声道数(channel)。
3.音频的几个基本概念
采样率:记录声音时每秒的采样个数,它用赫兹(Hz)来表示。
量化格式(采样精度):指记录声音的动态范围,它以位(Bit)为单位。
声道数:通道的数目
4.采样率根据使用类型不同大概有以下几种(k既千位符号,1khz=1000hz):
- 8khz:电话等使用,对于记录人声已经足够使用。
- 22.05khz:广播使用频率。
- 44.1khz:音频CD。
- 48khz:DVD、数字电视中使用。
- 96khz-192khz:DVD-Audio、蓝光高清等使用。
采样精度常用范围为8bit-32bit,而CD中一般都使用16bit。
5.比特率:每秒传输的数据量。公式如下
比特率 = 采样率 × 采样深度 × 通道数
比如 采样率 = 44100,采样深度 = 16,通道 = 2 的音频的的比特率就是 44100 * 16 * 2 = 1411200 bps
6.比特率中的数字和字母到底是什么意思
首先128k的全称“128kbps”,我们分解一下:128是数字,k是千位符,b是单位,s是秒,ps其实就是“/s”。这样来看,128kbps就是128kb/s。也就是每秒128kb。请注意,这里的b是小写的b,也就是位。
知道了这个,我们就能算出来128kb的文件大概占用多少的存储空间:
128*1000=128000b/s÷8=16000B/s÷1024=15.625KB/s
15.625KB/s*60=937.5KB/分钟÷1024=0.9155MB/分钟
所以,128kb的音频文件,大概每分钟长度的大小都在0.92M或者916kb左右。
7.有损压缩和无损压缩。
有损压缩就是通过删除一些已有数据中不太重要的数据来达到压缩目的。
无损压缩就是通过优化排列方式来达到压缩目的。
大概可以这样去看:有损压缩就像我们在一篇文章中删除一些不重要的助词,达到目的,解压缩后,已删除的内容无法恢复;而无损则是通过排版方式达到的,解压缩之后,还能获得完整的PCM数据
8.集中常用的音频编码格式
(1)WAV
PCM(脉冲编码调制)是Pulse Code Modulation的缩写。WAV编码的一种实现(有多种实现方式,但是都不会进行压缩操作)就是在PCM数据格式的前面加上44字节,分别用来描述PCM的采样率、声道数、数据格式等信息。
特点:音质非常好,大量软件都支持。
适用场合:多媒体开发的中间文件、保存音乐和音效素材。
(2)MP3(有损)
MP3具有不错的压缩比,使用LAME编码(MP3编码格式的一种实现)的中高码率的MP3文件,听感上非常接近源WAV文件,当然在不同的应用场景下,应该调整合适的参数以达到最好的效果。
特点:音质在128Kbit/s以上表现还不错,压缩比比较高,大量软件和硬件都支持,兼容性好。
适用场合:高比特率下对兼容性有要求的音乐欣赏。
(3)AAC(有损)
AAC是新一代的音频有损压缩技术,它通过一些附加的编码技术(比如PS、SBR等),衍生出了LC-AAC、HE-AAC、HE-AAC v2三种主要的编码格式。
LC-AAC是比较传统的AAC,相对而言,其主要应用于中高码率场景的编码(≥80Kbit/s);
HE-AAC(相当于AAC+SBR)主要应用于中低码率场景的编码(≤80Kbit/s);
而新近推出的HE-AAC v2(相当于AAC+SBR+PS)主要应用于低码率场景的编码(≤48Kbit/s)。事实上大部分编码器都设置为≤48Kbit/s自动启用PS技术,而>48Kbit/s则不加PS,相当于普通的HE-AAC。
特点:在小于128Kbit/s的码率下表现优异,并且多用于视频中的音频编码。
适用场合:128Kbit/s以下的音频编码,多用于视频中音频轨的编码。
(4)Ogg(有损)
Ogg是一种非常有潜力的编码,在各种码率下都有比较优秀的表现,尤其是在中低码率场景下。Ogg除了音质好之外,还是完全免费的,这为Ogg获得更多的支持打好了基础。Ogg有着非常出色的算法,可以用更小的码率达到更好的音质,128Kbit/s的Ogg比192Kbit/s甚至更高码率的MP3还要出色。但目前因为还没有媒体服务软件的支持,因此基于Ogg的数字广播还无法实现。Ogg目前受支持的情况还不够好,无论是软件上的还是硬件上的支持,都无法和MP3相提并论。
特点:可以用比MP3更小的码率实现比MP3更好的音质,高中低码率下均有良好的表现,兼容性不够好,流媒体特性不支持。
适用场合:语音聊天的音频消息场景。
(5)APE(无损)
APE是流行的数字音乐无损压缩格式之一,因出现较早,在全世界特别是中国大陆有着广泛的用户群。与MP3这类有损压缩格式不可逆转地删除(人耳听力不敏感的)数据以缩减源文件体积不同,APE这类无损压缩格式,是以更精炼的记录方式来缩减体积,还原后数据与源文件一样,从而保证了文件的完整性。
APE由软件Monkey's audio压制得到,开发者为Matthew T. Ashland,源代码开放,因其界面上有只“猴子”标志而出名。相较同类文件格式FLAC,ape有查错能力但不提供纠错功能,以保证文件的无损和纯正;其另一个特色是压缩率约为55%,比FLAC高,体积大概为原CD的一半,便于存储。
APE作为一种无损压缩音频格式,通过Monkey's Audio这个软件可以将庞大的WAV音频文件压缩为APE,,体积虽然变小了,但音质和原来一样。通过Monkey's Audio解压缩还原以后得到的WAV文件可以做到与压缩前的源文件完全一致。所以APE被誉为“无损音频压缩格式”,Monkey''s Audio被誉为“无损音频压缩软件”。
简单来讲,APE 压缩与WinZip或WinRAR这类专业数据压缩软件压缩原理类似,只是APE等无损压缩数字音乐之后的APE音频文件是可以直接被播放的。APE的压缩速率是动态的,压缩时只压缩可被压缩部分,不能被压缩的部分还是会保留下来。
(6)FLAC(无损)
FLAC中文可解释为无损音频压缩编码。FLAC是一套著名的自由音频压缩编码,其特点是无损压缩。不同于其他有损压缩编码如MP3 及AAC,它不会破坏任何原有的音频资讯,所以可以还原音乐光盘音质。2012年以来它已被很多软件及硬件音频产品(如CD等)所支持.
FLAC与MP3不同,MP3是音频压缩编码,但FLAC是无损压缩,也就是说音频以FLAC编码压缩后不会丢失任何信息,将FLAC文件还原为WAV文件后,与压缩前的WAV文件内容相同。这种压缩与ZIP的方式类似,但FLAC的压缩比率大于ZIP和RAR,因为FLAC是专门针对PCM音频的特点设计的压缩方式。而且可以使用播放器直接播放FLAC压缩的文件,就象通常播放你的MP3文件一样(近几年已经有许多汽车播放器和家用音响设备支持FLAC,在FLAC的网站上你可以找到这些设备厂家的链接)。
FLAC是免费的并且支持大多数的操作系统,包括Windows,基于Unix Like内核( (Linux,BSD,Solaris,IRIX, AIX等)而开发的系统,BeOS,OS/2,Amiga。并且FLAC提供了在开发工具autotools,MSVC,Watcom C,Project Builder上的build系统。
4.音视频解封装和解码原理分析
5.像素格式
●BGRA RGBA ARGB32 RGB32 YUV420
RGB概述
:https://blog.youkuaiyun.com/adolph_lu/article/details/89706136
RGB是red,green, blue的简写,也就是红绿蓝三种颜色。他们是三原色,通过不同的比例相加,以产生多种多样的色光。
RGB格式
一般来说,RGB在计算机中的表示主要分为两大类,一种是索引形式,一种是像素形式:
(1)索引格式:
- 索引格式是计算机早期的一种格式,它的优点比较节省空间,缺点是表现的色彩有限,目前格式基本被抛弃了,不再被使用,这里只做简单介绍。
- 索引格式中的bit存储的并非是实际的R,G, B值,而是对应点的像素在调色板中的索引。
- 调色板,可以简单理解为通过编号映射到颜色的一张二维表。如01索引,表示红色。采用索引格式的RGB,红色的像素对应存储的值便是索引01。就像指针一样,存储的是值的地址,而不是真正的值。
RGB1
每个像素用1个bit表示,可表示的颜色范围为双色,即黑和白。1个bit只能表示0,1两种值。需要调色板,不过调色板只包含两种颜色。
RGB4
每个像素用4个bit表示,4个bit所能够表示的索引范围是0-15,共16个。也就是可以表示16种颜色。即调色板中包含16中颜色。
RGB8
每个像素用8个bit表示。8个bit所能够表示的索引范围是0-255,共256个。也就是可以表示256中颜色。即调色板中包含256中颜色。
(2)像素格式:
RGB像素格式中的bit存储的是每一个像素点的R,G,B值
RGB565
一个像素用16个bit = 2个字节表示 ,R=5 G=6 B=5
R = color & 0xF800; //获取高字节的5个bit
G = color & 0x07E0; //获取中间6个bit
B = color & 0x001F; //获取低字节5个bit
RGB555
一个像素用16个bit = 2个字节,但是最高位不用,R=5 G=5 B=5
R = color & 0x7C00; //获取高字节的5个bit
G = color & 0x03E0; //获取中间5个bit
B = color & 0x001F; //获取低字节5个bit
RGB24
一个像素用24个bit = 3个字节来表示,R=8 G=8 B=8
R = color & 0x0000FF00;
G = color & 0x00FF0000;
B = color & 0xFF000000;
RGB32
一个像素用32个bit = 4个字节 来表示,R=8 G=8 B=8,存储顺序为B, G, R,最后8个字节保留。
R = color & 0x0000FF00;
G = color & 0x00FF0000;
B = color & 0xFF000000;
A = color & 0x000000FF;
Android平台下的几个常用RGB格式:
Bitmap.Config.ALPHA_8
每个像素用8比特位表示,占1个字节,只有透明度,没有颜色。
Bitmap.Config.RGB_565
每个像素用16比特位表示,占2个字节,RGB分量分别使用5位、6位、5位,见上图。
Bitmap.Config.ARGB_4444
每个像素用16比特位表示,占2个字节,由4个4位组成,ARGB分量都是4位。
Bitmap.Config.ARGB_8888
每个像素用32比特位表示,占4个字节,由4个8位组成,ARGB分量都是8位。
注意:java默认使用大端字节序,c/c++默认使用小端字节序,android平台下Bitmap.config.ARGB_8888的Bitmap默认是大端字节序,当需要把这个图片内存数据给小端语言使用的时候,就需要把大端字节序转换为小端字节序。例如:java层的ARGB_565传递给jni层使用时,需要把java层的ARGB_565的内存数据转换为BGRA565。
YUV
:https://blog.youkuaiyun.com/adolph_lu/article/details/89917763
●"Y"表示明亮度,也就是灰度值
●而"U"和"V"表示的则是色度
YUV概述
YUV,是一种颜色编码方法。常使用在各个影像处理组件中。 YUV在对照片或影片编码时,考虑到人类的感知能力,允许降低色度的带宽。
YUV,分为三个分量:
- Y表示明亮度(Luminance或Luma),也就是灰度值;
- U(Cb)表示色度(Chrominance)
- V(Cr)表示浓度(Chroma)
通常UV一起描述影像色彩和饱和度,用于指定像素的颜色。
对于 YUV 图像来说,并不是每个像素点都需要包含了 Y、U、V 三个分量,根据不同的采样格式,可以每个 Y 分量都对应自己的 UV 分量,也可以几个 Y 分量共用 UV 分量。
YUV采样格式
YUV444
YUV 4:4:4 采样,意味着 Y、U、V 三个分量的采样比例相同,因此在生成的图像里,每个像素的三个分量信息完整,都是 8 bit,也就是一个字节。
图像像素数据: Y0U0V0 Y1U1V1 Y2U2V2 Y3U3V3
采样的码流: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
为什么叫4:4:4 , 意思是每4个像素里的数据有4个Y, 4个U, 4个V
Y分量的大小: w*h
U分量的大小: w*h
V分量的大小: w*h
通过YUV444采样的图像大小和RGB颜色模型的图像大小是一样的。
一张 1280 * 720 大小的图片,在 YUV 4:4:4 采样时的大小为:
(1280*720*8 + 1280*720*8 + 1280*720*8)/8/1024/1024 = 2.64 MB
YUV422
YUV 4:2:2 采样,意味着每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一个采集一个,Y 分量和 UV 分量按照 2 : 1 的比例采样。如果水平方向有8个像素点,那么就采样8 个 Y 分量,4 个 UV 分量。
-
图像像素数据: Y0U0V0 Y1U1V1 Y2U2V2 Y3U3V3
-
采样的码流: Y0 U0 Y1 V1 Y2 U2 Y3 V3
-
为什么叫4:2:2,意思是每4个像素里面有4个Y,2个U,2个V
-
Y分量的大小: w*h
-
U分量的大小: w*h/2
-
V分量的大小: w*h/2
一张 1280 * 720 大小的图片,在 YUV 4:2:2 采样时的大小为:
(1280*720*8 + (1280*720)/2*8 + (1280*720)/2*8)/8/1024/1024 = 1.76 MB
通过与YUV444采样进行比较可以算出,YUV 422 采样的图像比YUV444采样图像节省了三分之一的存储空间,在传输时占用的带宽也会减少。
YUV420
YUV 4:2:0 采样,并不是指只采样 U 分量而不采样 V 分量。而是指,其中,每采样过一个像素点,都会采样其 Y 分量,而 U、V 分量就会间隔一行按照 2 : 1 进行采样。比如,第一行扫描时,YU 按照 2 : 1 的方式采样,那么第二行扫描时,YV 分量按照 2:1 的方式采样。对于每个色度分量来说,它的水平方向和竖直方向的采样和 Y 分量相比都是 2:1 。
-
图像像素数据: [Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3]
-
[Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7] 、[Y8 U8 V8]
-
采样的码流: Y0 U0 Y1 Y2 U2 Y3
-
Y5 V5 Y6 Y7 V7 Y8
-
为什么叫4:2:0,意思是每4个像素中有4个Y,2个U,0个V,而下一行的四个像素中有4个Y,0个U,2个V
-
Y分量的大小: w*h
-
U分量的大小: w*h/4
-
V分量的大小: w*h/4
一张 1280 * 720 大小的图片,在 YUV 4:2:0 采样时的大小为:
(1280*720*8 + (1280*720)/4*8 + (1280*720)/4*8)/8/1024/1024 = 1.32 MB
可以看到 YUV 420 采样的图像比 RGB 模型图像节省了一半的存储空间,因此它也是比较主流的采样方式。
YUV存储格式
YUV存储格式有两大类:planar 和 packed
- planar,平面格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,然后是所有像素点的V;将几个分量分开存,比如YUV420中,data[0]专门存Y,data[1]专门存U,data[2]专门存V。
- packed,打包格式,每个像素点的Y,U,V是连续交错存储的,所有数据都存在data[0]中。
根据采样方式和存储格式的不同,就有了多种 YUV 格式。这些格式主要是基于 YUV 4:2:2 和 YUV 4:2:0 采样。
常见的基于 YUV 4:2:2 采样的格式如下表:
YUV422采样 |
YUYV |
UYUV |
YUV422P |
YUYV
YUYV 格式是采用打包格式进行存储的,指每个像素点都采用 Y 分量,但是每隔一个像素采样它的 UV 分量,排列顺序如下:
Y0 UO Y1 V0 Y2 U1 Y3 V1
Y0 和 Y1 公用 U0 V0 分量,Y2 和 Y3 公用 U1 V1 分量
UYVY
UYVY 格式是采用打包格式进行存储,它的顺序和 YUYV 相反,先采用 U 分量再采样 Y 分量,排列顺序如下:
U0 Y0 V0 Y1 U1 Y2 V1 Y3
YUV422P
YUV 422P 格式,又叫做 I422,采用的是平面格式进行存储,先存储所有的 Y 分量,再存储所有的 U 分量,再存储所有的 V 分量。
Y0 Y1 Y2 Y3 U0 U1 V0 V1
常见的基于 YUV 4:2:0 采样的格式如下表:
YUV420采样 | YUV420采样 | |
YUV420P | YV12 | YU12 |
YUV420SP (semi-Planar二维平面) | NV12 | NV21 |
YUV 420P 和 YUV 420SP 都是基于 Planar 平面模式 进行存储的,先存储所有的 Y 分量后, YUV420P 类型就会先存储所有的 U 分量或者 V 分量,而 YUV420SP 则是按照 UV 或者 VU 的交替顺序进行存储了,具体查看看下图:
YUV420P
YUV420SP
YV12
YV12,采用的是平面格式进行存储,先存 Y 分量,再存 V 分量,最后U分量
-
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
-
V0
-
U0
YU12
YU12,采用的是平面格式进行存储,先存 Y 分量,再存 U分量,最后V分量
-
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
-
U0
-
V0
NV12 (ios常用)
NV12,采用的是平面格式进行存储,再 UV 进行交替存储
-
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
-
U0 V0
NV21(android常用)
NV21,采用的是平面格式进行存储,再 VU 进行交替存储
-
Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
-
V0 U0
6.PCM音频
采样率(sample Rate) 44100(cd)一秒采多少次
声道数(channel)(左右声道)
量化格式(sampleFormat)
样本大小(格式) sample_size
- AV_SAMPLE_FMT_S16
- AV_SAMPLE_FMT_FLTP
ps:
假设有一路音频流,有左右两声道的数据。左声道用L表示,右声道用R表示。
存储时,如果是左右声道数据交替存储成一维数组,这种格式称为packed。格式为LRLRLR....LRLR
如果是分开存储成二维数组,这种格式称为planar。格式为LLLLLLLLLLLLLL和RRRRRRRRRRRRR
视频也是如此,但是对于YUV格式的数据,比音频多一种存储方法叫semi-planar,
也就是半planar。一共2路存储,Y一路,UV一路,其中UV交叉存储。
样本类型planar
●- AV_SAMPLE_FMT_S16在内存的格式就为:c1, c2, c1, c2, c1, c2....
●- AV_SAMPLE_FMT_S16P在内存的格式为:c1, c1, c1....c2, c2, c2....
https://blog.youkuaiyun.com/adolph_lu/article/details/89555047
7、MP4标准和h264格式的NAL的GOP分析
MP4格式分析
H.264/AVC视频编码标准:
VCL视频编码层面:(视频数据的内容) NAL网络抽象:(格式化数据并提供头信息)
GOP(解码顺序, 显示循序 DTS PTS IBP帧)
NAL单元`
因此我们平时的每帧数据就是一个NAL 单元( SPS与PPS除外)。
在实际的H264数据帧中,往往帧前面带有00 00 00 01或00 00 01分隔符,一般来说编码器编出的首帧数据为PPS与SPS ,接着为I帧.
GOP