内容来自网络的各个角落!
视频(Video)泛指将一系列静态影像以电信号的方式加以捕捉、纪录、处理、储存、传送与重现的各种技术。连续的图像变化每秒超过24帧(frame)画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面;看上去是平滑连续的视觉效果,这样连续的画面叫做视频。
音频是个专业术语,人类能够听到的所有声音都称之为音频,它可能包括噪音等。
1. 视频播放器原理流程图
2. 常见的播放器
- 跨平台系列(非DirectShow框架) -- VLC 、Mplayer 、ffplay ...
- Windows系列(DirectShow框架)-- 完美解码 、 终极解码 、 暴风影音 、QQ影音...
1. 视频编码数据,是一种码流,不能直接在显示器上显示。需要进行解码。音频也类似。2. 视频编码的作用:将视频像素数据(RGB 、 YUV 等)压缩成视频码流,从而降低视频的数据量
2. 封装的概念
封装 : 就是捆绑打包, 将画面视频文件和音轨文件打包在一起, 并按照一定规则建立排序和索引, 便 于播放器或播放软件来索引播放.包括AVI \ PS(Program Stream)\ TS(Transport Stream)\ MKV(Matroska)等.
2. 常见的封装格式
3. 封装码流
(在MPEG-2系统中,由视频, 音频的ES流和辅助数据复接生成的用于实际传输的标准信息流称为MPEG-2传送流)
4. 帧1. 帧字的来历帧 zhēn,〔装~〕指书画、书刊的装潢设计。量词,用于字画等, 一幅字画叫一帧,一~油画,如曼殊堂工塑极精妙,外壁有泥金帧,不空自西域赍来者。A、画幅。 B、张开画幅。 C、量词。用于书画作品,"今人以一幅为帧" --《正字通》2. 帧、报文、报文段、分组、包、数据报的概念区别
- 分组、包,packet,信息在互联网当中传输的单元,网络层实现分组交付。用抓包工具抓到的一条条记录就是包。
- 帧,frame,数据链路层的协议数据单元。我们将链路层分组称为帧。
- 数据报,Datagram,通过网络传输的数据的基本单元,包含一个报头(header)和数据本身,其中报头描述了数据的目的地以及和其它数据之间的关系。可以理解为传输数据的分组。我们将通过网络传输的数据的基本单元称为数据报。
- 报文段,segment,组成报文的每个分组。我们将运输层分组称为报文段。
- 报文,message,一般指完整的信息,传输层实现报文交付。我们将位于应用层的信息分组称为报文。
由此可见,抓包抓到的是传输层的包,所以packet,frame,Datagram,segment是存在于同条记录中的,而frame,Datagram,segment是基于所在协议层不同而取了不同的名字。3. 帧 -- 就是影像动画中最小单位的单幅影像画面。5. 视频帧率
视频帧率(Frame rate)是用于测量显示帧数的量度。所谓的测量单位为每秒显示帧数(Frames per Second,简:FPS)或“赫兹”(Hz)。此词多用于影视制作和电子游戏。由于人类眼睛的特殊生理结构,如果所看画面之帧率高于16的时候,就会认为是连贯的,此现象称之为视觉停留。这也就是为什么电影胶片是一格一格拍摄出来,然后快速播放的。而对游戏,一般来说,第一人称射击游戏比较注重FPS的高低,如果FPS<30的话,游戏会显得不连贯。所以有一句有趣的话:“FPS(指FPS游戏)重在FPS(指帧率)。每秒的帧数(fps)或者说帧率表示图形处理器处理场时每秒钟能够更新的次数。高的帧率可以得到更流畅、更逼真的动画。一般来说30fps就是可以接受的,但是将性能提升至60fps则可以明显提升交互感和逼真感,但是一般来说超过75fps一般就不容易察觉到有明显的流畅度提升了。如果帧率超过屏幕刷新率只会浪费图形处理的能力,因为监视器不能以这么快的速度更新,这样超过刷新率的帧率就浪费掉了
6. 视频压缩中IPB帧概念
7. I、P、B帧特点分析视频压缩中,每帧代表一幅静止的图像。而在实际压缩时,会采取各种算法减少数据的容量,其中IPB就是最常见的。
I frame :帧内编码帧 又称intra picture,表示关键帧,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是一个图像经过压缩后的产物。你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)
P frame : 前向预测编码帧 又称predictive-frame,通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧;表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面(I帧)叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
B frame : 双向预测内插编码帧(双向差别帧、双向预测帧) 又称bi-directional interpolated prediction frame,既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像;也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累~。
GOP : 简单的理解GOP就是两个I帧之间的间隔
I帧是完整的视频帧,换句话说,客户端只有在获得I帧后才会有完整的视频。如果直接发送,不等I帧,客户端得到的画面会残缺,但是延迟较低。如果等I帧,客户端缓冲时间较长,得到画面会完整,但是延迟至少是一个gop。
I 帧特点:
- 它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;
- 解码时仅用I帧的数据就可重构完整图像;
- I帧描述了图像背景和运动主体的详情;
- I帧不需要参考其他画面而生成;
- I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
- I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
- I帧不需要考虑运动矢量;
- I帧所占数据的信息量比较大。
P帧特点:
- P帧是I帧后面相隔1~2帧的编码帧;
- P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差);
- 解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;
- P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧;
- P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧;
- 由于P帧是参考帧,它可能造成解码错误的扩散;
- 由于是差值传送,P帧的压缩比较高。
B帧特点
- B帧是由前面的I或P帧和后面的P帧来进行预测的;
- B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;
- B帧是双向预测编码帧;
- B帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确;
- B帧不是参考帧,不会造成解码错误的扩散。
四、音频编码数据8. H*264分析工具I帧体积最大,P帧在I和B之间,B帧最小。比如,新闻联播,主持人后面的背景,几乎是静止且不动的,如果是I帧,会把整个静止图像编码存储,如果是P帧,会检查I帧,进行比较,发现画面是一样的,就不进行复杂编码,只是输出不同的内容部分的码流。B帧类似于P帧。
1. 音频编码作用:将音频采样数据(PCM等)压缩成为音频码流,从而降低音频的数据量
2. 常见的音频封装格式:
3. 音频的采样频率采样频率就是采用一段音频,做为样本,因为wav使用的是数码信号,它是用一堆数字来描述原来的模拟信号,所以它要对原来的模拟信号进行分析,我们知道所有的声音都有其波形,数码信号就是在原有的模拟信号波形上每隔一段时间进行一次“取点”,赋予每一个点以一个数值,这就是“采样”,然后把所有的“点”连起来就可以描述模拟信号了,很明显,在一定时间内取的点越多,描述出来的波形就越精确,这个尺度我们就称为“采样频率”。我们最常用的采样频率是44.1kHz,它的意思是每秒取样44100次。之所以使用这个数值是因为经过了反复实验(实际上是那个时代才是视频27/1.0001时钟做CD刻录遗留问题),人们发现这个采样频率最合适,低于这个值就会有较明显的损失,而高于这个值人的耳朵已经很难分辨,而且增大了数字音频所占用的空间。一般为了达到“万分精确”,我们还会使用48kHz甚至96kHz的采样频率,实际上,96kHz采样频率和44.1kHz采样频率的区别绝对不会象44.1kHz和22kHz那样区别如此之大,我们所使用的CD的采样标准就是44.1kHz,目前44.1kHz还是一个最通行的标准,有些人认为96kHz将是未来录音界的趋势。采样频率提高应该是一件好事,但我们真的能听出96kHz采样频率制作的音乐与44.1kHz采样频率制作的音乐的区别吗?不过随着高端音响设备的大众化,我们也许就会在Party时听到更高质量的音乐了。
为不使原波形产生“半波损失”,采样率至少应为信号最高频率的两倍,这就是著名的奈奎斯特采样定理。
五、视频像素数据
4. 音频的比特率比特率是大家常听说的一个名词,数码录音一般使用16比特、20比特或24比特制作音乐。什么是“比特”?我们知道声音有轻有响,影响声音响度的物理要素是振幅,作为数码录音,必须也要能精确表示乐曲的轻响,所以一定要对波形的振幅有一个精确的描述。“比特(bit)”就是这样一个单位,16比特就是指把波形的振幅划为2^16即65536个等级,根据模拟信号的轻响把它划分到某个等级中去,就可以用数字来表示了。和采样频率一样,比特率越高,越能细致地反映乐曲的轻响变化。20比特就可以产生1048576个等级,表现交响乐这类动态十分大的音乐已经没有什么问题了。刚才提到了一个名词“动态”,它其实指的是一首乐曲最响和最轻的对比能达到多少,我们也常说“动态范围”,单位是dB,而动态范围和我们录音时采用的比特率是紧密结合在一起的,如果我们使用了一个很低的比特率,那么就只有很少的等级可以用来描述音响的强弱,当然就不能听到大幅度的强弱对比了。动态范围和比特率的关系是;比特率每增加1比特,动态范围就增加6dB。所以假如我们使用1比特录音,那么我们的动态范围就只有6dB,这样的音乐是不可能听的。16比特时,动态范围是96dB。这可以满足一般的需求了。20比特时,动态范围是120dB,对比再强烈的交响乐都可以应付自如了,表现音乐的强弱是绰绰有余了。发烧级的录音师还使用24比特,但是和采样精度一样,它不会比20比特有很明显的变化,理论上24比特可以做到144 dB的动态范围,但实际上是很难达到的,因为任何设备都不可避免会产生噪音,至少在现阶段24比特很难达到其预期效果。
1. 视频像素数据的作用:保存了屏幕上每个像素点的像素值 , 从屏幕左上角开始,往右,一个点一个点的数据存储,一行存储完跳转到下一行。2. 格式:常见的像素数据格式有RGB24,RGB32, YUV420P , YUV422P , YUV444P等。压缩编码中一般使用的是YUV格式的像素数据,最为常见的格式为YUV420P。3. 特点:视频像素数据体积很大,一般情况下1小时高清视频的RGB24格式的数据体积为:3600 * 25 * 1920 * 1080 * 3 = 559.9GByteps:这里假定帧率为25Hz ,取样精度为8bit
1. 音频采样数据的作用 : 保存了音频中每个采样点的值。
2. 特点:
音频采样数据体积很大,一般情况下一首4分钟的PCM格式的歌曲体积为:
4 * 60 * 44100 * 2 * 2 = 42.3MByte
ps:这里假定采样率为44100Hz,采样精度为16bit
1. 首先来举一个生活中的例子。假设你和你的一个朋友约好了今天18:00在沪上广场见面,然后一起吃饭,再去打 游戏。实际上,这个18:00就是你和你朋友保持同步的一个时间点。结果你17:50就到了沪上广场,那么你必须等你的朋友。10分钟过后,你的朋友还没有到,这 时他打来电话说有事耽搁了,要晚一点才能到。你没办法,因为你已经在旁边的餐厅预订了位置,如果不马上赶过去,预订就会被取消,于是你告诉你的朋友直接 到餐厅碰头吧,要他加快点。于是在餐厅将来的某个时间点就成为你和你朋友的又一个同步点。虽然具体时间不定(要看你朋友赶过来的速度),但这样努力的方 向是对的,你和你朋友肯定能在餐厅见到面。结果呢?你朋友终于在18:30赶过来了,你们最终“同步”了。吃完饭19:30了,你临时有事要处理一下,于是跟你 朋友再约好了20:00在附近的一家游戏厅碰头。你们又不同步了,但在游戏厅将来的某个时间点你们还是会再次同步的。 悟出什么道理了没有?其实,同步是一个动态的过程,是一个有人等待、有人追赶的过程。同步只是暂时的,而不同步才是常态。人们总是在同步的水平线上 振荡波动,但不会偏离这条基线太远。
2. 音视频同步(播放)原理
一帧音频或视频都有一个持续时间:duration:
采样频率是指将模拟声音波形进行数字化时,每秒钟抽取声波幅度样本的次数。
。正常人听觉的频率范围大约在20Hz~20kHz之间,根据奈奎斯特采样理论,为了保证声音不失真,采样频率应该在40kHz左右。常用的音频采样频率有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz等,如果采用更高的采样频率,还可以达到DVD的音质
对采样率为44.1kHz的AAC音频进行解码时,一帧的解码时间须控制在23.22毫秒内。
背景知识:
(一个AAC原始帧包含一段时间内1024个采样及相关数据)
分析:
1) AAC
音频帧的播放时间=一个AAC帧对应的采样样本的个数/采样频率(单位为s)
一帧 1024个 sample。采样率 Samplerate 44100Hz,每秒44100个sample, 所以根据公式 音频帧的播放时间=一个AAC帧对应的采样样本的个数/采样频率
当前AAC一帧的播放时间是= 1024*1000000/44100= 22.32ms(单位为ms)
2) MP3
mp3 每帧均为1152个字节, 则:
frame_duration = 1152 * 1000000 / sample_rate
例如:sample_rate = 44100HZ时,计算出的时长为26.122ms,这就是经常听到的mp3每帧播放时间固定为26ms的由来。
3)H264
视频的播放时间跟帧率有关 frame_duration = 1000/fps
例如:fps = 25.00 ,计算出来的时常为40ms,这就是同行所说的40ms一帧视频数据。理论上的音视频(播放)同步是这样的:
由此得到了每一帧数据的持续时间,音视频交叉存储在容器中:一个时间轴:
时间轴 :0 22.32 40 44.62 66.96 80 89.16 111.48 120 ................
音 频 :0 22.32 44.62 66.96 89.16 111.48 ................
视 频 :0 40 80 120 ................
即视频的持续时间相加 和 音频的持续时间相加作比较,谁小写入哪个。
但实际情况(播放)是不成立的
1:首先解决一个问题
为什么不 音频播音频的 视频播视频的 即上面的 到 第22.32ms播一帧音频 ,到40ms播一帧视频。
因为这个22.32ms 或40ms是算不准的或者说和声卡播的时间是不一样的。这里就需要知道声卡播一帧/或者说播放一个buf音频需要多长时间。
2:声卡每次播一个采样点 而不是一帧。声音当一个采样点丢失了都可以听出来,视频则不然。
3:音视频同步方式:1----回调方式
假设声卡有两块缓存都是存放要播放的声音pcm的 一直在播放"B"buf 首先确定几点
(1)buf大小是固定的这样播放一个buf的时间就是固定的,假设30ms;
(2)当buf“B”播放完毕即buf用完,再播放buf“A",保证音频pcm一直都连续
(3)当一个buf播放完毕,那说明系统(声卡)过了30ms, 这时候有可能真正的时间过了40ms(这里不用关心),这里则通过回调得到一次时间30ms;
(4)再去用视频对应音频的30ms,这时候的时间就是准确的:
时间轴:0 30 60 90 120 ................
音 频 :0 22.32 44.62 66.96 89.16 111.48 ................
视 频 :0 40 80 120 ................(5)这里有个问题就是 视频中 30ms 到40ms 这中间的10ms是怎么算出来的,这个是不用关心的,因为人的眼睛10ms是看不出来的,
即当音频的30ms一次回调时,就可以播放第二帧视频,如上图
第一次回调(30ms)---播(40ms)视频,
第一次回调(60ms)---播(80ms)视频,
第一次回调(90ms)---不播视频,
第一次回调(120ms)---播(120ms)视频。
4:音视频同步方式:1----阻塞方式
还是看上面的图
(1)buf"B"一直在播放,传入buf"A"的外部buf把数据给buf"A"后 不立即返回,等到buf"B"播放完成再返回,
这时从传入到经过阻塞出来就是一个buf的时间例如上面的30ms。
(2)然后buf"A"一直在播放,传入buf"B"的外部buf把数据给buf"B"后 不立即返回,等到buf"A"播放完成再返回,
这时从传入到经过阻塞出来就是一个buf的时间例如上面的30ms。
(3)循环上面(1)(2),即得到了如回调方式同样的那个30ms时间。下面和回调方式一样,见回调方式(4)(5)。