❶ 视频的编码方式有哪些与格式一样吗
视频格式是指视频文件的存在形式,比如AVI、RMVB、MKV等等,也可以说是封装压缩视频和音频文件的容器。
音频数字化主要有压缩与非压缩两种方式。较早出现的数字音频播放机,如CD唱机和DAT录音机,均采用线性PCM编码来存储音乐信号,为非压缩方式。在高质量要求的音频工作站和数字录像机(如DVCPRO)上,也采用非压缩的格式。
音视频编码:
我们常见的MPEG、Dolby Digital、DTS等则为压缩方式。压缩分为有损压缩和无损压缩。有损压缩的目的是提高压缩率,降低占用系统资源。可以根据实际需要选用不同的采样速率、样本分辨率(精度)和数据率。
数字卫星广播系统的信源编码技术采用MPEG-2.5第三层声音编码算法。第三层编码算法最复杂、延时最大、效率最高。因此对一定的数据速率,第三层协议得到的音质最好。当然,用户可根据需要选择8—128Kbps范围的不同速率。声音质量可达到CD音质。
❷ 音视频解码与播放
YUV定义:分为三个分量,
“Y”表示 明亮度 也就是 灰度值 ,而“U”和“V” 表示的则是 色度 和 饱和度 ,作用是描述影像色彩及饱和度,用于指定像素的颜色。
I frame :帧内编码帧 ,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是一个图像经过压缩后的产物。
自身可以通过视频解压算法解压成一张单独的完整的图片。
P frame: 前向预测编码帧 ,通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧;
需要参考其前面的一个I frame 或者P frame来生成一张完整的图片。
B frame: 双向预测内插编码帧 ,既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧;
要参考其前一个I或者P帧及其后面的一个P帧来生成一张完整的图片。
PTS:Presentation Time Stamp 。PTS主要用于度量解码后的视频帧 什么时候被显示出来
DTS:Decode Time Stamp 。DTS主要是标识读入内存中的帧数据在 什么时候开始送入解码器 中进行解码。
在没有B帧存在的情况下DTS的顺序和PTS的顺序应该是一样的。
DTS主要用于视频的解码,在解码阶段使用。PTS主要用于视频的同步和输出.在显示的时候使用。
通常所说的音频裸数据就是PCM(Pulse Codec Molation脉冲编码调制)
libavformat
用于各种音视频封装格式的生成和解析 ,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;音视频的格式解析协议,为 libavcodec 分析码流提供独立的音频或视频码流源。
libavcodec
用于各种类型声音/图像编解码 ;该库是音视频编解码核心,实现了市面上可见的绝大部分解码器的功能,libavcodec 库被其他各大解码器 ffdshow,Mplayer 等所包含或应用。
libavfilter
filter(FileIO、FPS、DrawText) 音视频滤波器的开发 ,如水印、倍速播放等。
libavutil
包含一些 公共的工具函数 的使用库,包括算数运算 字符操作。
libswresample
原始音频格式转码 。
libswscale
( 原始视频格式转换 )用于视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换,如 rgb565,rgb888 等与 yuv420 等之间转换。
❸ Android -- 音视频基础知识
帧,是视频的一个基本概念,表示一张画面,如上面的翻页动画书中的一页,就是一帧。一个视频就是由许许多多帧组成的。
帧率,即单位时间内帧的数量,单位为:帧/秒 或fps(frames per second)。一秒内包含多少张图片,图片越多,画面越顺滑,过渡越自然。 帧率的一般以下几个典型值:
24/25 fps:1秒 24/25 帧,一般的电影帧率。
30/60 fps:1秒 30/60 帧,游戏的帧率,30帧可以接受,60帧会感觉更加流畅逼真。
85 fps以上人眼基本无法察觉出来了,所以更高的帧率在视频里没有太大意义。
这里我们只讲常用到的两种色彩空间。
RGB的颜色模式应该是我们最熟悉的一种,在现在的电子设备中应用广泛。通过R G B三种基础色,可以混合出所有的颜色。
这里着重讲一下YUV,这种色彩空间并不是我们熟悉的。这是一种亮度与色度分离的色彩格式。
早期的电视都是黑白的,即只有亮度值,即Y。有了彩色电视以后,加入了UV两种色度,形成现在的YUV,也叫YCbCr。
Y:亮度,就是灰度值。除了表示亮度信号外,还含有较多的绿色通道量。
U:蓝色通道与亮度的差值。
V:红色通道与亮度的差值。
音频数据的承载方式最常用的是 脉冲编码调制 ,即 PCM 。
在自然界中,声音是连续不断的,是一种模拟信号,那怎样才能把声音保存下来呢?那就是把声音数字化,即转换为数字信号。
我们知道声音是一种波,有自己的振幅和频率,那么要保存声音,就要保存声音在各个时间点上的振幅。
而数字信号并不能连续保存所有时间点的振幅,事实上,并不需要保存连续的信号,就可以还原到人耳可接受的声音。
根据奈奎斯特采样定理:为了不失真地恢复模拟信号,采样频率应该不小于模拟信号频谱中最高频率的2倍。
根据以上分析,PCM的采集步骤分为以下步骤:
采样率,即采样的频率。
上面提到,采样率要大于原声波频率的2倍,人耳能听到的最高频率为20kHz,所以为了满足人耳的听觉要求,采样率至少为40kHz,通常为44.1kHz,更高的通常为48kHz。
采样位数,涉及到上面提到的振幅量化。波形振幅在模拟信号上也是连续的样本值,而在数字信号中,信号一般是不连续的,所以模拟信号量化以后,只能取一个近似的整数值,为了记录这些振幅值,采样器会采用一个固定的位数来记录这些振幅值,通常有8位、16位、32位。
位数越多,记录的值越准确,还原度越高。
最后就是编码了。由于数字信号是由0,1组成的,因此,需要将幅度值转换为一系列0和1进行存储,也就是编码,最后得到的数据就是数字信号:一串0和1组成的数据。
整个过程如下:
声道数,是指支持能不同发声(注意是不同声音)的音响的个数。 单声道:1个声道
双声道:2个声道
立体声道:默认为2个声道
立体声道(4声道):4个声道
码率,是指一个数据流中每秒钟能通过的信息量,单位bps(bit per second)
码率 = 采样率 * 采样位数 * 声道数
这里的编码和上面音频中提到的编码不是同个概念,而是指压缩编码。
我们知道,在计算机的世界中,一切都是0和1组成的,音频和视频数据也不例外。由于音视频的数据量庞大,如果按照裸流数据存储的话,那将需要耗费非常大的存储空间,也不利于传送。而音视频中,其实包含了大量0和1的重复数据,因此可以通过一定的算法来压缩这些0和1的数据。
特别在视频中,由于画面是逐渐过渡的,因此整个视频中,包含了大量画面/像素的重复,这正好提供了非常大的压缩空间。
因此,编码可以大大减小音视频数据的大小,让音视频更容易存储和传送。
视频编码格式有很多,比如H26x系列和MPEG系列的编码,这些编码格式都是为了适应时代发展而出现的。
其中,H26x(1/2/3/4/5)系列由ITU(International Telecommunication Union)国际电传视讯联盟主导
MPEG(1/2/3/4)系列由MPEG(Moving Picture Experts Group, ISO旗下的组织)主导。
当然,他们也有联合制定的编码标准,那就是现在主流的编码格式H264,当然还有下一代更先进的压缩编码标准H265。
H264是目前最主流的视频编码标准,所以我们后续的文章中主要以该编码格式为基准。
H264由ITU和MPEG共同定制,属于MPEG-4第十部分内容。
我们已经知道,视频是由一帧一帧画面构成的,但是在视频的数据中,并不是真正按照一帧一帧原始数据保存下来的(如果这样,压缩编码就没有意义了)。
H264会根据一段时间内,画面的变化情况,选取一帧画面作为完整编码,下一帧只记录与上一帧完整数据的差别,是一个动态压缩的过程。
在H264中,三种类型的帧数据分别为
I帧:帧内编码帧。就是一个完整帧。
P帧:前向预测编码帧。是一个非完整帧,通过参考前面的I帧或P帧生成。
B帧:双向预测内插编码帧。参考前后图像帧编码生成。B帧依赖其前最近的一个I帧或P帧及其后最近的一个P帧。
全称:Group of picture。指一组变化不大的视频帧。
GOP的第一帧成为关键帧:IDR
IDR都是I帧,可以防止一帧解码出错,导致后面所有帧解码出错的问题。当解码器在解码到IDR的时候,会将之前的参考帧清空,重新开始一个新的序列,这样,即便前面一帧解码出现重大错误,也不会蔓延到后面的数据中。
DTS全称:Decoding Time Stamp。标示读入内存中数据流在什么时候开始送入解码器中进行解码。也就是解码顺序的时间戳。
PTS全称:Presentation Time Stamp。用于标示解码后的视频帧什么时候被显示出来。
前面我们介绍了RGB和YUV两种图像色彩空间。H264采用的是YUV。
YUV存储方式分为两大类:planar 和 packed。
planar如下:
packed如下:
上面说过,由于人眼对色度敏感度低,所以可以通过省略一些色度信息,即亮度共用一些色度信息,进而节省存储空间。因此,planar又区分了以下几种格式:YUV444、 YUV422、YUV420。
YUV 4:4:4采样,每一个Y对应一组UV分量。
YUV 4:2:2采样,每两个Y共用一组UV分量。
YUV 4:2:0采样,每四个Y共用一组UV分量。
其中,最常用的就是YUV420。
YUV420属于planar存储方式,但是又分两种类型:
YUV420P:三平面存储。数据组成为YYYYYYYYUUVV(如I420)或YYYYYYYYVVUU(如YV12)。
YUV420SP:两平面存储。分为两种类型YYYYYYYYUVUV(如NV12)或YYYYYYYYVUVU(如NV21)
原始的PCM音频数据也是非常大的数据量,因此也需要对其进行压缩编码。
和视频编码一样,音频也有许多的编码格式,如:WAV、MP3、WMA、APE、FLAC等等,音乐发烧友应该对这些格式非常熟悉,特别是后两种无损压缩格式。
但是,我们今天的主角不是他们,而是另外一个叫AAC的压缩格式。
AAC是新一代的音频有损压缩技术,一种高压缩比的音频压缩算法。在MP4视频中的音频数据,大多数时候都是采用AAC压缩格式。
AAC格式主要分为两种:ADIF、ADTS。
ADIF:Audio Data Interchange Format。音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。这种格式常用在磁盘文件中。
ADTS:Audio Data Transport Stream。音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。
ADIF数据格式:
ADTS 一帧 数据格式(中间部分,左右省略号为前后数据帧):
AAC内部结构也不再赘述,可以参考AAC 文件解析及解码流程
细心的读者可能已经发现,前面我们介绍的各种音视频的编码格式,没有一种是我们平时使用到的视频格式,比如:mp4、rmvb、avi、mkv、mov...
没错,这些我们熟悉的视频格式,其实是包裹了音视频编码数据的容器,用来把以特定编码标准编码的视频流和音频流混在一起,成为一个文件。
例如:mp4支持H264、H265等视频编码和AAC、MP3等音频编码。
我们在一些播放器中会看到,有硬解码和软解码两种播放形式给我们选择,但是我们大部分时候并不能感觉出他们的区别,对于普通用户来说,只要能播放就行了。
那么他们内部究竟有什么区别呢?
在手机或者PC上,都会有CPU、GPU或者解码器等硬件。通常,我们的计算都是在CPU上进行的,也就是我们软件的执行芯片,而GPU主要负责画面的显示(是一种硬件加速)。
所谓软解码,就是指利用CPU的计算能力来解码,通常如果CPU的能力不是很强的时候,一则解码速度会比较慢,二则手机可能出现发热现象。但是,由于使用统一的算法,兼容性会很好。
硬解码,指的是利用手机上专门的解码芯片来加速解码。通常硬解码的解码速度会快很多,但是由于硬解码由各个厂家实现,质量参差不齐,非常容易出现兼容性问题。
MediaCodec 是Android 4.1(api 16)版本引入的编解码接口,是所有想在Android上开发音视频的开发人员绕不开的坑。
由于Android碎片化严重,虽然经过多年的发展,Android硬解已经有了很大改观,但实际上各个厂家实现不同, 还是会有一些意想不到的坑。
相对于FFmpeg,Android原生硬解码还是相对容易入门一些,所以接下来,我将会从MediaCodec入手,讲解如何实现视频的编解码,以及引入OpenGL实现对视频的编辑,最后才引入FFmpeg来实现软解,算是一个比较常规的音视频开发入门流程吧。
❹ 音视频编码格式认知
编码格式对应的就是音频编码和视频编码,
音频编码标准和视频编码标准,每种编码标准都对应的编码算法,其目的是通过一定编码算法实现数据的压缩、减少数据的冗余。
视频编码指的是通过特定的压缩技术,将某个视频文件格式转换为另一种视频格式文件的方式
可变码率指的是输出码流的码率是可变的,因为视频信源本身的高峰信息量是变化的,从确保视频传输质量和充分利用信息的角度来说,可变码率视频编码才是最合理的。
相关资料免费分享,领取方式见下方腾讯文档
C++音视频开发学习资料 :点击领取 音视频开发(资料文档+视频教程+面试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)
是指视频成像产品所形成的图像大小或尺寸,常见的 1080P、4K 等又代表什么呢,P 本身的含义是逐行扫描,表示视频像素的总行数,
1080P 表示总共有 1080 行的像素数,而 K 表示视频像素的总列数,4K 表示有 4000 列的像素数,
通常来说,1080P 就是指 1080 x 1920 的分辨率,4 k 指 3840 x 2160 的分辨率。
视频编码:
Xvid(旧称为XviD)
是一个开放源代码的MPEG-4影像编解码器,是由一群原OpenDivX开发者在OpenDivX于2001年7月停止开发后自行开发的。
Xvid支持量化(Quantization)、范围控制的运动侦测(Motion Search)、码率曲线分配(Curve)、动态关键帧距(I-frame interval)、心理视觉亮度修正、演职员表选项、外部自定义控制、运动向量加速(Hinted ME)编码、画面优化解码等众多编码技术,对用户来说功能十分强大。
DivX是由MPEG-4衍生出的一种视频编码(压缩)标准,也即我们通常所说的DVDrip格式,
它采用了MPEG4的压缩算法,同时又综合了MPEG-4与MP3各方面的技术,说白了就是使用DivX压缩技术对DVD盘片的视频图像进行高质量压缩,
同时用MP3或AC3对音频进行压缩,然后再将视频与音频合成,并加上相应的外挂字幕文件而形成的视频格式。其画质直逼DVD,而体积只有DVD的数分之 一。
XviD与DivX几乎相同,是开源的DivX,不收费,而使用DivX要收费。
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在具有高压缩比的同时还拥有高质量流畅的图像。
微软是在2003年9月递交VC-1编码格式的,目前已经得到了MovieBeam、Modeo等不少公司的采纳,同时也包含在HD DVD和蓝光中,包括华纳和环球等影业公司也有采用这种格式的意向。
VC-1基于微软Windows Media Video9(WMV9)格式,而WMV9格式现在已经成为VC-1标准的实际执行部分。WMV (Windows Media
Video)是微软公司的视频编解码器家族,包括WMV7、WMV8、WMV9、WPV10。这一族的编解码器可以应用在从拨号上网的窄带视频到高清晰度电视HDTV)的宽带视频。使用Windows Media Video用户还可以将视频文件刻录到CD、DVD或者其它一些设备上。它也
适用于用作媒体服务器。
WMV可以被看作是MPEG-4的一个增强版本。最新的由SMPTE(电视电影工程师协会)承认的WMV-9,也就是我们说的上面的VC-1。
同一个 AVCodecID 可能对应多个不同的编解码器 (AVCodec) MPEG-4 AVC、MPEG-4 Part 10,还是ISO/IEC 14496-10,都是指H.264。
在编码方式相同相同的情况下,.avi, .mkv, .mp4只是封装格式的区别(文件后缀格式),而封装格式是不影响画质的。
就相当于你的100块钱折一下,或者两下,或者两下后不管是放在你的口袋里,钱包里还是存钱罐里都是100块钱。
这里的100块钱就是就是视频数据,你把100块折一下,或者两下,或者两下就是编码格式,钱包,口袋,存钱罐就是封装格式。
❺ 计算机中的音频和视频的编码方式
音频信号的编码方式大致分为三大类:
(1) 波形编码,如PCM、APC、SDC、ATC
(2) 分析合成方法,如LPC
(3) 混合编码方法
常用的编码方式是PCM——脉冲调制。脉冲编码调制(PCM)是把模拟信号变换为数字信号的一种调制方式,即把连续输入的模拟信号变换为在时域和振幅上都离散的量,然后将其转化为代码形式传输或存储。
音频信号压缩编码的主要依据是人耳的听觉特性,主要有两点:
1.人的听觉系统中存在一个听觉阈值电平,低于这个电平的声音信号人耳听不到 .
2.人的听觉存在屏蔽效应。当几个强弱不同的声音同时存在时,强声使弱声难以听到,并且两者之间的关系与其相对频率的大小有关 .
3.对声音波形采样后,相邻样值之间存在着很强的相关性。
声音编码算法就是通过这些特性来去掉更多的冗余数据,来达到压缩数据的目的。
视频信号的压缩与编码
采样、量化后的信号转换成数字符号才能进行传输,这一过程称为编码。
视频压缩编码的理论基础是信息论。信息压缩就是从时间域、空间域两方面去除冗余信息,将可推知的确定信息去掉。
视频编码技术主要包括MPEG与H.261标准,编码技术主要分成帧内编码和帧间编码。前者用于去掉图像的空间冗余信息,后者用于去除图像的时间冗余信息。
呃,还好以前的课件还留着,稍稍拷了点过来。。
❻ 音视频入门——H.264编码(宏块+片+帧)浅析
(1)图像冗余信息:空间冗余、时间冗余
(2)视频编码关键点:压缩比、算法复杂度、还原度
(3)H.264的2大组成部分:视频编码层VCL和网络抽象层面NAL Network Abstract Layer,
(1)宏块 MB macroblock
(2)片 slice
(3)帧 frame
(4)I帧、B帧、P帧
(5)帧率 fps
(6)像素->宏块->片->帧->序列->码流
我们了解了什么是宏快,宏快作为压缩视频的最小的一部分,需要被组织,然后在网络之间做相互传输。
H264更深层次 —》宏块 太浅了
如果单纯的用宏快来发送数据是杂乱无章的,就好像在没有集装箱 出现之前,货物总是随意被堆放到船上。
上货(编码),下货是非常痛苦的。 当集装箱出现之后,一切都发生了改变,传输效率大大增高。
集装箱可以理解成H264编码标准,他制定了相互传输的格式,将宏快 有组织,有结构,有顺序的形成一系列的码流。这种码流既可 通过 InputStream 网络流的数据进行传输,也可以封装成一个文件进行保存
H264: H264/AVC是广泛采用的一种编码方式 。 主要作用是为了传输
组成H264码流的结构中 包含以下几部分 ,从大到小排序依次是
NAL层:(Network Abstraction Layer,视频数据网络抽象层): 它的作用是H264只要在网络上传输,在传输的过程每个包以太网是1500字节,而H264的帧往往会大于1500字节,所以要进行拆包,将一个帧拆成多个包进行传输,所有的拆包或者组包都是通过NAL层去处理的。
VCL层:(Video Coding Layer,视频数据编码层): 对视频原始数据进行压缩
H264是一种码流 类似与一种不见头,也不见尾的一条河流。如何从和流中取到自己想要的数据呢,
在H264的标砖中有这样的一个封装格式叫做"Annex-B"的字节流格式。 它是H264编码的主要字节流格式。
几乎市面上的编码器是以这种格式进行输出的。起始码0x 00 00 00 01 或者 0x 00 00 01 作为分隔符。
两个 0x 00 00 00 01之间的字节数据 是表示一个NAL Unit
切片头:包含了一组片的信息,比如片的数量,顺序等等
H264中,以16x16的宏块为编码最小单元,一个宏块可以被分成多个4x4或8x8的块
同一个宏块内,像素的相似程度会比较高,若16x16的宏块中,像素相差较大,那么就需要继续细分
当然,像素块越小,编码的复杂度也会随之增加,编码效率自然就会降低。但是这样是值得的,因为图像的压缩效率有了显着提高,也就是编码后得到的相同质量的图像,H.264的压缩比更大,占用的空间及带宽更小。
不合理的分块会出现块效应,即块与块之间色差明显
海思在3559之后有deblock的接口可以应对块效应,3519上用的很多
在I帧中,全部宏块都采用帧内预测的方式,所以解码时仅用I帧的数据就可重构完整图像,不须要参考其余画面而生成。web
H.264中规定了两种类型的I帧:普通I帧(normal Iframes)和IDR帧(InstantaneousDecoding Refresh, 即时解码刷新)。 IDR帧实质也是I帧,使用帧内预测。IDR帧的做用是当即刷新,会致使DPB(Decoded Picture Buffer参考帧列表)清空,而I帧不会。因此IDR帧承担了随机访问功能,一个新的IDR帧开始,能够从新算一个新的Gop开始编码,播放器永远能够从一个IDR帧播放,由于在它以后没有任何帧引用以前的帧。若是一个视频中没有IDR帧,这个视频是不能随机访问的。全部位于IDR帧后的B帧和P帧都不能参考IDR帧之前的帧,而普通I帧后的B帧和P帧仍然能够参考I帧以前的其余帧。IDR帧阻断了偏差的积累,而I帧并无阻断偏差的积累。算法
一个GOP序列的第一个图像叫作 IDR 图像(当即刷新图像),IDR 图像都是 I 帧图像,但I帧不必定都是IDR帧,只有GOP序列的第1个I帧是IDR帧。缓存
疑问:按照GOP、IDR帧、I帧的解释,若是一个GOP出现除去第一个IDR帧以外的I帧,是不存在的,那这样的话,就不存在非IDR的I帧了,但是为何还要说明非IDR的I帧呢。svg
解答:H264编码存在多种编码方式CBR、VBR、CVBR、ABR等等,VBR编码模式下图像内容变化差别很大时,会动态调整I帧的数量,所以GOP的概念须要修正:两个IDR帧之间的间隔为一组GOP,一组GOP中能够出现非IDR的I帧。编码
P帧:前向预测编码帧。P帧表示的是这一帧跟以前的一个关键帧(或P帧)的差异,解码时须要用以前缓存的画面叠加上本帧定义的差异,生成最终画面,P帧没有完整画面数据,只有与前一帧的画面差别的数据。P帧的压缩率20code
B帧:双向预测内插编码帧。B帧是双向差异帧,也就是B帧记录的是本帧与先后帧的差异,要解码B帧,不只要取得以前的缓存画面,还要解码以后的画面,经过先后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,约为50,可是解码时CPU会比较累。orm
通常能够输出H264帧的USB摄像头,使用的是BP-Baseline Profile,只有I帧与P帧。视频
而slice呢,也是对宏块的划分
本文简单叙述了;音视频中的H264编码中的,宏块、帧、片。音视频还有更深入的学习,知识范围很广,需要一套很详细的学习资料与路线。我推荐上面的一套入门到精通资料辅佐。
❼ 想了解下,会畅有没有和算力相关的技术它在云视频底层算法和技术的投入有哪些
会畅注重云视频底层算法和技术的投入,在云平台底层架构上采用了业界领先的SVC/HEVC(H.264/H.265)柔性音视频编解码算法,可以极高的效率压缩音视频数据,使音视频数据得以自适应网络带宽的方式在开放的互联网上传输,达到接近传统专网视频会议的流畅体验。SVC/HEVC柔性音视频编解码算法相比传统专网视频所采用的H.264的通用编解码协议,在效率上有50%-80%的提升,能在互联网中40%-50%丢包视频流畅稳定不卡顿,60%-70%丢包音视频连贯清晰,为行业带来了全新的下一代用户体验。这又使得传统专网视频通信固有的MCU(多点控制单元)得以云化,极大降低用户的采购成本和使用门槛。 同时,会畅持续投入构建下一代三维云视频平台߅在原有自主音视频算法引擎基础上,结合3D引擎,在双引擎的驱动下实现了三维化云视频技术应用,并已在2021年期间将三维云视频产品化和试商业化。另外,会畅在云平台的架构设计上,一方面考虑了面向国产化应用,积极研发适配内置于国产统一操作系统UOS的会畅超视云,支持包括龙芯、兆芯、鲲鹏、飞腾在内的主流国产芯片;另一方面也在研发支持5G大规模商用,支持4K/8K超清视频的大规模应用,在下一代音视频编解码算法H.265和AV1上亦有技术布局。
❽ 二、视频编解码基础知识
图像信息经采集后生成的原始视频数据,数据量非常大,对于某些采集后直接本地播放的应用场合,不需要考虑压缩技术。但现实中更多的应用场合,涉及视频的传输与存储,传输网络与存储设备无法容忍原始视频数据的巨大数据量,必须将原始视频数据经过编码压缩后,再进行传输与存储。
(1)未经压缩的数字视频的数据量巨大
(2)存储困难,如:一张DVD只能存储几秒钟的未压缩数字视频
(3)传输困难,如:1兆的带宽传输一秒的数字电视视频需要大约4分钟,720p RGB 15帧每秒码率计算: 1280 x 720 x 3 x 15 ≈ 41MB ≈ 331Mb
将视频数据中的冗余信息去除,寻找像素之间的相关性,还有不同时间的图像帧之间的相关性。
视频编码 是压缩和可能改变视频内容格式的过程,有时甚至将模拟源更改为数字源。在压缩方面,目标是减少占用空间。这是因为它是一个有损的过程,会抛弃与视频相关的信息。在解压缩以进行回放时,创建原始的近似值。应用的压缩越多,抛出的数据越多,近似值与原始数据相比越差。
视频编解码器是通过软件或硬件应用程序完成的视频压缩标准。编解码器,如:H.264,VP8,RV40以及其他标准或更高版本(VP9)
注:音频编解码器,如:LAME / MP3,Fraunhofer FDK AAC,FLAC等。
根据已经编码好的块信息得到一个预测值,这样只需要编码实际值与预测值之间的差异即可。
空间冗余的消除:
帧内预测:根据同一帧中相邻已编码好的块信息得到预测数据,编码差异数据
时间冗余的消除:
帧间预测:根据已编码帧中的块信息得到预测数据,编码差异数据
I 帧:仅采用帧内压缩技术,压缩效率最低,编解码无需用到其他帧的信息,是GOP的起始点。
P 帧:前向预测帧,编解码只参考前一个帧,可作为其他图像编码时的参考帧,属帧间压缩技术。
B 帧:双向预测帧,编解码既参考前一帧也可参考后一帧,压缩效率最高,复杂度高,时延较大,属帧间压缩技术。
GOP(group of pictures)一般指两个I帧之间的间隔帧数,两个I帧之间是一个图像序列,在一个图像序列中只有一个I帧。
H.264 原始码流(⼜称为 裸流),是由⼀个接⼀个的 NALU 组成的,而它的功能分为两层:视频编码层VCL 和 网络提取层NAL。
VCL负责有效表示视频数据的内容。
H264除了实现了对视频的压缩处理之外,为了方便网络传输,提供了对应的视频编码和分片策略;类似于网络数据封装成IP帧,在H264中将其称为组(gop)、片(slice)、宏块(Macroblock)这些一起组成了H264的码流分层结构;H264将其组织成为序列(GOP)、图片(pictrue)、片(Slice)、宏块(Macroblock)、子块(subblock)五个层次。
宏块:视频编码的基本单元,h264通常宏块大小为16x16个像素,所以编码器一般会对图像的宽 高有要求,需要为16的倍数。
Slice:条带,图像的划分,一帧图像可编码成一个或者多个条带,每条带包含整数个宏块。
SPS: 序列参数集,包含应用于完整视频序列的语法元素,比如图像宽,高等。
PPS: 图像参数集,包含应用于编码图像的语法元素,比如量化参数,参考帧列表大小等。
NAL定义了数据封装的格式和统一的网络接口,负责格式化VCL数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。
NAL基本单元为NALU,每一个NALU包含一个字节的头信息和其后的负载数据。
参考文档
https://zhuanlan.hu.com/p/31056455
https://blog.csdn.net/knowledgebao/article/details/86716428
重点链接:NAL/NALU详解可以查阅:
https://www.jianshu.com/p/1b3f8187b271
http://www.wendangku.net/doc/039e95757fd5360cba1adb46.html
附上几篇文章:
https://blog.csdn.net/knowledgebao/article/details/86716428
https://zhuanlan.hu.com/p/31056455
https://www.jianshu.com/p/0c296b05ef2a
Android平台市面上大部分的芯片厂商的硬编硬解都适配,例如:高通,三星Exynos,联发科,海思等;windows平台上支持Intel qsv硬编硬解。
分辨率:(矩形)图片的长度和宽带,即图片的尺寸。影响图像大小,与图像大小成正比;分辨率越高,图像越大;分辨率越低,图像越小。
分辨率是指视频画面横向和纵向被切分成多少块。
区别 1080P , 3MP ,4K
P 720P 、1080P 表示的是"视频像素的总函数" ,' P ' (Progressive的缩写)表示的是"逐行扫描"
K 2K 、4K 等是表示 "视频像素的总列数" ,4K表示的是视频有4000列的像素数,具体是3840列或4096列。
MP 代表的是像素总数,指像素的行数(P)与列数(K)相乘后的一个结果(百万像素)。
帧率 是指每秒图像的数量,一帧代表的就是一副静止的画面,连续的帧就形成了动画。影响画面流畅度,与画面流畅度成正比:帧率越大,画面越流畅;帧率越小,画面越有跳动感。帧率就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次。
码率 指编码器每秒编出的数据大小,单位是kbps 。
视频文件在单位时间内使用的数据流量,指把每秒显示的图片进行压缩后的数据量。影响体积,与体积成正比:码率越大,体积越大,码率越小,体积越小。(体积=码率X时间)
压缩前的每秒数据量 = 帧率 x 分辨率(单位是字节)
压缩比 = 压缩前的每秒数据量 / 码率(对于同一视频源并采用同一种视频编码算法,压缩比越高,画面质量越差)
清晰度
在码率一定的情况下,分辨率与清晰度成反比关系:分辨率越高,图像越不清晰,分辨率越低,图像越清晰。
在分辨率一定的情况下,码率与清晰度成正比关系,码率越高,图像越清晰;码率越低,图像越不清晰。
好文章理解分辨率、帧率和码率三者之间的关系: https://blog.csdn.net/qq_39759656/article/details/80701965
都看到这里了,点个赞呗 0.0
❾ 音视频编解码 原理
音视频同步原理[ffmpeg]
ffmpeg对视频文件进行解码的大致流程:
1. 注册所有容器格式和CODEC: av_register_all()
2. 打开文件: av_open_input_file()
3. 从文件中提取流信息: av_find_stream_info()
4. 穷举所有的流,查找其中种类为CODEC_TYPE_VIDEO
5. 查找对应的解码器: avcodec_find_decoder()
6. 打开编解码器: avcodec_open()
7. 为解码帧分配内存: avcodec_alloc_frame()
8. 不停地从码流中提取中帧数据: av_read_frame()
9. 判断帧的类型,对于视频帧调用: avcodec_decode_video()
10. 解码完后,释放解码器: avcodec_close()
11. 关闭输入文件:av_close_input_file()
❿ 音视频压缩:H264码流层次结构和NALU详解
前言:
为什么需要编码呢?比如当前屏幕是1280*720.一秒24张图片.那么我们一秒的视频数据是
1280*720(位像素)*24(张) / 8(1字节8位)(结果:B) / 1024(结果:KB) / 1024 (结果:MB) = 2.64MB
一秒的数据有2.64MB数据量。1分钟就会有100多MB。这对用户来说真心是灾难。所以现在我们需要一种压缩方式减小数据的大小.在更低 比特率(bps)的情况下依然提供清晰的视频。
H264: H264/AVC是广泛采用的一种编码方式。我们这边会带大家了解。从大到小排序依次是 序列,图像,NALU,片,宏块,亚宏块,块,像素。
问题背景:
前面在讲封装格式过程中,都有一个章节讲解如何将H.264的NALU单元如何打包到TS、FLV、RTP中,解装刚好相反,怎么从这些封装格式里面解析出一个个NALU单元。NALU即是编码器的输出数据又是解码器的输入数据,所以在封装和传输时,我们一般处理对象就是NALU,至于NALU内部到底是什么则很少关心。甚至我们在编解码时,我们只需要初始化好x264编码库,然后输入YUV数据,它就会给你经过一系列压缩算法后输出NALU,或者将NALU输入到x264解码库就会输出YUV数据。
这篇文章就初步带你看下NALU能传输那些数据,NALU的类型和结构以及H264码流的层次,最后通过分析工具分析下裸码流记性验证,你可以选择感兴趣章节阅读。
NALU结构:
H.264的基本流(elementary stream),也叫裸流(没有加格式封装),就是一系列NALU的集合,如下图所示:
用Notepad十六进制形式打开,以annexb格式存储的h264裸流文件内容:
NALU结构分为两层,包含了视频编码层(VCL)和网络适配层(NAL):
视频编码层(VCL即Video Coding Layer) :负责高效的视频内容表示,这是核心算法引擎,其中对宏块、片的处理都包含在这个层级上,它输出的数据是SODB;
网络适配层(NAL即Network Abstraction Layer) :以网络所要求的恰当方式对数据进行打包和发送,比较简单,先报VCL吐出来的数据SODB进行字节对齐,形成RBSP,最后再RBSP数据前面加上NAL头则组成一个NALU单元。
分层目的:
这样做的目的:VCL只负责视频的信号处理,包含压缩,量化等处理,NAL解决编码后数据的网络传输,这样可以将VCL和NAL的处理放到不同平台来处理,可以减少因为网络环境不同对VCL的比特流进行重构和重编码;
NLAU结构:
其实NALU的承载数据真实并不是RBSP(Raw Byte Sequence Playload)而是EBSP即(Extent Byte Sequence Payload),EBSP和RBSP的区别就是在 RBSP里面加入防伪起始码字节(0x03),因为H.264规范规定,编码器吐出来的数据需要在每个NALU添加起始码:0x00 00 01或者0x00 00 00 01,用来指示一个NALU的起始和终止位置,那么RBSP数据内部是有可能含有这种字节序列的,为了防止解析错误,所以在RBSP数据流里面碰到0x 00 00 00 01的0x01前面就会加上0x03,解码时将NALU的EBSP中的0x03去掉成为RBSP,称为脱壳操作。
原始字节序列负载 RBSP即Raw Byte Sequence Playload,因为VCL输出的 原始数据比特流 SODB即String Of Data Bits,其长度不一定是8bit的整数倍,为了凑成整数个字节,往往需要对SODB最后一个字节进行填充形成RBSP,所以从SODB到RBSP的示意图如下:
填充方式就是对VCL的输出数据进行8bit进行切分,最后一个不满8bit的字节第一bit位置1,然后后面缺省的bit置0即可
具体填充语法见下文:
原来文档中的解释:
主要的意思我的理解如下:
其中H.264规范规定,编码器吐出来的数据需要在每个NALU添加起始码:0x00 00 01或者0x00 00 00 01,用来指示一个NALU的起始和终止位置。
所以H.264编码器输出的码流中每个帧开头3-4字节的start code起始码为0x00 00 01或者0x00 00 00 01。
上面我们分析了NALU的结构以及每层输出数据的处理方法,但是对于NALU的RBSP数据二进制表示的什么含义并不清楚,下面分析下NALU的类型。
1. NALU Header
头信息协议如上图。
举例说明:
这其中NALU的RBSP除了能承载真实的视频压缩数据,还能传输编码器的配置信息,其中能传输视频压缩数据的为slice。
那么如果NLAU传输视频压缩数据时,编码器没有开启DP(数据分割)机制,则一个片就是一个NALU,一个 NALU 也就是一个片。否则,一个片由三个 NALU 组成,即DPA、DPB和DPC,对应的nal_unit_type 类型为 2、3和4。
通常情况我们看到的NLAU类型就是SPS、PPS、SEI、IDR的slice、非IDR这几种。
上面站在NALU的角度看了NALU的类型、结构、数据来源、分层处理的原因等,其中NLAU最主要的目的就是传输视频数据压缩结果。那么站在对数据本身的理解上,我们看下H.264码流的层次结构。
H.264层次结构:
其实为了理解H.264是如何看待视频数据,先要了解下视频的形成过程。其实你把多副连续的有关联图像连续播就可以形成视频,这主要利用了人视觉系统的暂留效应,当把连续的图片以每秒25张的速度播放,人眼基本就感觉是连续的视频了。动画片就是这个原理:一张图像里面相邻的区域或者一段时间内连续图像的相同位置,像素、亮度、色温差别比较小,所以视频压缩本质就是利于这种空间冗余和时间上冗余进行编码,我们可以选取一段时间第一幅图像的YUV值,后面的只需要记录和这个的完整图像的差别即可,同时即使记录一副图像的YUV值,当有镜头完全切换时,我们又选取切换后的第一张作为基本图像,后面有一篇文章回讲述下目前视频压缩的基本原理。
所以从这里面就可以引申以下几个概念:
所以视频流分析的对象可以用下面的图片描述:
如果站在数据的角度分析NALU的层次关系,如下图:
这里视频帧被划分为一个片或者多个片,其中slice数据主要就是通过NLAU进行传输,其中slice数据又是由:
一个Slice = Silce + Slice Data
一帧图片跟 NALU 的关联 :
一帧图片经过 H.264 编码器之后,就被编码为一个或多个片(slice),而装载着这些片(slice)的载体,就是 NALU 了,我们可以来看看 NALU 跟片的关系(slice)。
引用自: https://www.jianshu.com/p/9522c4a7818d
Slice片类型:
设置片的目的是限制误码的扩散和传输,也就是一帧图像中它们的编码片是互相独立的,这样假设其中一张图像的某一个片有问题导致解码花屏,但是这个影响范围就控制在这个片中,这就是我们平时看视频发现只有局部花屏和绿屏的原因。
Slice Data里面传输的是一个个宏块,宏块中的数据承载各个像素点YUV的压缩数据。一个图像通常被我们划分成宏块来研究,通常有16 16、16 8等格式。我们解码的过程也就是恢复这些像素阵列的过程,如果知道了每个像素点的亮度和色度,就能渲染出一张完整的图像,图像的快速播放即是视频。
刚才提到了宏块.那么什么是宏块呢?
宏块是视频信息的主要承载者。一个编码图像通常划分为多个宏块组成.包含着每一个像素的亮度和色度信息。视频解码最主要的工作则是提供高效的方式从码流中获得宏块中像素阵列。
一个宏块 = 一个16*16的亮度像素 + 一个8×8Cb + 一个8×8Cr彩色像素块组成。(YCbCr 是属于 YUV 家族的一员,在YCbCr 中 Y 是指亮度分量,Cb 指蓝色色度分量,而 Cr 指红色色度分量)
其中宏块MB的类型:
宏块的结构:
H.264码流示例分析:
这里我们分析一下H.264的NLAU数据,其中包括了非VCL的NALU数据和VCL的NALU。
H.264码流的NLAU单元:
4. 这里由于没有数据分割机制,所以一个NALU承载一个片,同时一个片就是一个视频帧;
4.至于NALU的非VCL数据SPS、PPS、SEI各个字段的含义具体解析放到下篇文章,这个信息对于解码器进行播放视频很重要,很多播放问题都是这个数据有问题导致的;
上面看了视频的GOP序列,视频帧信息和片的组成,下面分析片中的宏块信息;
H.264的层次结构:
总结:
本文主要讲述了平时研究和分析视频流对象的层次,然后这些视频数据通过NALU传输时,NALU的类型和层次关系,以及NALU数据在不同层次的输出。最后用视频分析工具分析了H.264裸码流验证了上述层次关系。
所以对H.264数据分析时,一定要了解你现在分析的层次和框架,因为每个层次我们关心的数据处理对象是不一样的,这个非常重要。
一般H.264的分析工具都是收费的,也有一些免费和裁剪版本供大家学习和使用。推荐几个:Elecard StreamEye、CodecVisa、VideoEye、H264Analyzer、H264Visa等,有时需要交叉使用才能完成对你关心信息的分析,这些都放到我的Git上了,大家获取使用即可。
引用原文
25fps i帧间隔50 用分析软件查看可以看出每50帧一个i帧,并发送sps、pps、sei
sps、pps、sei、I帧绑在一起发送