前言

视音频的一些概念,不定期添加,以备遗忘快速回忆。

0x01总体

借用雷神的图片,分为协议层(rtmp,rtsp等),封装层(mp4,avi等),编解码层(aac,mp3,h264等),原始数据层(yuv420p,pcm等)

Android MediaRecorder 比特率怎么设置 mp4音频比特率_时间戳

0x02 码率/比特率

码率就是比特率,是数据传输时单位时间传送的数据位数,一般我们用的单位是Kbps,意为“千位每秒”。如1000Kbps,一秒传输1000*1024bit的数据。
码率涉及一个计算公式 文件大小=码率*播放时间,封装的码率为音视频码率之和
734 *1024/8*60=5637120bit/1024/1024=5.3MB


Android MediaRecorder 比特率怎么设置 mp4音频比特率_时间戳_02

0x03 音频码率

Pcm音频码率=采样率*采样大小值*声道数bps

这是一个60s的采样率为8000,16位采样,单声道的pcm文件

码率=8000*16=128000bps

文件大小=128000*60/8/1024=937kb

Android MediaRecorder 比特率怎么设置 mp4音频比特率_数据_03

0x04 视频码率

视频码率 = 分辨率 x 帧率
码率=352*288*30=3041280bps,已知大小可以计算出视频长度为2分钟


Android MediaRecorder 比特率怎么设置 mp4音频比特率_码率_04

0x05 常说的高清,普清


Android MediaRecorder 比特率怎么设置 mp4音频比特率_数据_05

0x06 帧率

所谓帧率就是每秒显示帧数(简称:FPS),大于24帧,图像就为连贯的。

0x07 分辨率

分辨率决定了位图像素的精细程度,分辨率越高,所包含的像素越多,越清晰。

0x08 视频图像压缩的I,B,P帧

I 帧(Intra coded frames):I 帧图像采用帧内编码方式,是解码的基准帧。
P 帧(Predicted frames):P 帧和 B 帧图像采用帧间编码方式,利用了空间和时间上的相关性。P 帧图像只采用前向时间预测,可以提高压缩效率和图像质量。
B 帧(Bi-directional predicted frames):B 帧图像采用双向时间预测,可以大大提高压缩倍数。
一个 I 帧可以不依赖其他帧就解码出一幅完整的图像,而 P 帧、B 帧不行。P 帧需要依赖视频流中排在它前面的帧才能解码出图像。B 帧则需要依赖视频流中排在它前面或后面的帧才能解码出图像。

0x09 DTS

当视频流中没有 B 帧时,通常解码顺序和播放顺序是一致的。但如果有 B 帧时,就需要PTS和DTS标记每个画面播放的顺序。
DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。

0x10 PTS

PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。
需要注意的是,DTS和PTS都是从0开始,它的单位不是时间单位,而是时间基,
time_base * dts(pts) 才是解码(显示时间戳)的时间

0x11 时间基Time_base

time_base={1,25} 代表一个时间基有1/25秒。
在ffmpeg中。av_q2d(time_base)=每个刻度是多少秒
不同的封装格式,timebase是不一样的。另外,整个转码过程,不同的数据状态对应的时间基也不一致。比如一些原始数据 时间基为1/25,进行压缩后,时间基变为1/90000
因为数据状态不同,时间基不一样,所以我们必须转换,在1/25时间刻度下占10格,在1/90000下是占多少格。这就是pts的转换。

0x12 duration

duration和pts单位一样,duration表示当前帧的持续时间占多少格。或者理解是两帧的间隔时间是占多少格。

关于音频pts的计算:
音频sample_rate:samples per second,即采样率,表示每秒采集多少采样点。
比如44100HZ,就是一秒采集44100个sample.
即每个sample的时间是1/44100秒

一个音频帧的AVFrame有nb_samples个sample,所以
标准时间下duration_s=nb_samples*(1/44100)秒,
转换成AVStream时间基下
duration=duration_s / av_q2d(st->time_base)
基于st->time_base的num值一般等于采样率,所以duration=nb_samples.
pts=n*duration=n*nb_samples


Android MediaRecorder 比特率怎么设置 mp4音频比特率_数据_06

比如aac的一帧为1024个sample,pts+=1024

0x13 GOP(画面组)

GOP是一段时间内变化不大的图像集。GOP结构一般有两个数字,如M=3,N=12。M指定I帧和P帧之间的距离,N指定两个I帧之间的距离。上面的M=3,N=12,GOP结构为:IBBPBBPBBPBBI。在一个GOP内I frame解码不依赖任何的其它帧,p frame解码则依赖前面的I frame或P frame,B frame解码依赖前最近的一个I frame或P frame 及其后最近的一个P frame。

0x14 IDR帧(关键帧)

在编码解码中为了方便,将GOP中首个I帧要和其他I帧区别开,把第一个I帧叫IDR,这样方便控制编码和解码流程,所以IDR帧一定是I帧,但I帧不一定是IDR帧;IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始算新的序列开始编码。I帧有被跨帧参考的可能,IDR不会。