采样率、比特率、帧率
- 采样率:每秒钟的采样次数,声音/画面越高越连贯,单位为Hz
- 比特率:在视频领域又称码率,每秒传送的bit数,越高则传的数据越多且画质越清晰,单位为bps(bit per second),
MediaFormat.KEY_BIT_RATE
- 码流率/码率/采样率:单位时间使用的数据流量,单位kb/s。该值越大,则精度越高,画面质量越高,体积越大
- 帧率/帧速率:每秒钟刷新的图片帧数,单位fps(frame per second)。该值越高,动画越流畅,越逼真。
MediaFormat.KEY_FRAME_RATE
帧
- 视频播放是一帧一帧的画面按照时间顺序呈现出来的
- 为保证传输,会对视频进行压缩,所以,每一帧并不都完整
- 视频帧分为:I帧、P帧、B帧
I帧
:帧内编码帧,不依赖前后帧
P帧
:帧间预测编码帧,需参考前面的I帧才能进行编码。表示当前帧与前一个I帧或者P帧的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。
B帧
:双向预测编码帧,记录的是本帧与前后帧的差别。解码时不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面与本帧数据的叠加取得最终画面。
I帧只考虑本帧;P帧记录与前一帧(前一个I帧或者P帧)的差别;B帧记录的是前一帧及后一帧的差别
问题
1. B帧或P帧提前到达,必然会导致视频无法解码,如何解决?
2. 三种帧之间的解码依赖关系如何?
3.三种帧解码顺序如何?解码顺序和显示顺序有何关联?
说明
采集阶段:
假定摄像头采集帧顺序为a b c d e。
最终编码结果是:a编码成I帧,b、c、d编码成B帧,e编码成P帧。
编码阶段:
1 先编码a,编成I帧
2 b、c、d编码成B帧,先缓存并记录采集时间点,后续作为PTS基准
3 编码e,编成P帧 (注意:e虽先编码,DTS相对b、c、d靠前,但采集时间晚,因此PTS大于b、c、d)
4 编码b、c、d,编成B帧
存储阶段:
编码后立即经过mux写文件,所以存储顺序和编码顺序是一致的,编码顺序(DTS)为:
a(I) e(P) b(B) c(B) d(B)
解码阶段:
a为I帧,e为P帧需要以a为基准才能解码,b、c、d为B帧需要以a和e为基准才能解码,所以最后解码顺序为:
a e b c d
显示阶段:
帧的解码顺序由DTS决定,但帧的显示顺序由PTS决定,该顺序即为采集顺序,因此,显示顺序为:
a b c d e
DTS、PTS
- DTS(Decoding Time Stamp):解码时间戳,用于告诉播放器该在什么时候解码这一帧的数据。
- PTS(Presentation Time Stamp):显示时间戳,用于告诉播放器该在什么时候显示这一帧的数据。
- 当视频流中无B帧时,通常DTS和PTS的顺序是一致的
- 音频中无B帧,所以音频的DTS和PTS顺序是一致的
音视频同步,通常需要选择一个参考时钟,参考时钟上的时间是线性递增的,编码音视频流时依据参考时钟上的时间给每一帧数据打上时间戳。播放时,读取数据帧上的时间戳,同时参考当前参考时钟上的时间来安排播放。