GOP说白了就是两个I帧之间的间隔.比较说GOP为120,如果是720p60的话,那就是2s一次I帧.
IDR帧是I帧,但I帧不一定是IDR帧,比如在编码的时候设置GOP为30,那么就是说30帧图像有一个I帧,这样60帧就有2个I帧,但是60帧只有1个IDR帧。
一个NAL单元就是一个Slice(片),而一帧不一定就是一个NAL单元,一帧里面可能会有多个NAL单元(多个片)。
所以视频流分析的对象可以用下面的图片描述:
将图像分割成若干个16*16个像素(不一定, 可能是 16 * 8, 可能是 8 * 8)的块, 每个块就叫做宏块
帧预测(2 , 2 , 2 , 7 , 2 , 2 , 2 , 2 , 2 , 13. 我们也可以用下面的方式来表示:prediction = 2;Difference = { (5, 3), (11, 9) };(都是2, 低三个和第9个不同, 差值是5和11)
宏块越大, 最终压缩后生成的视频就越小(h.265的宏块比h.264的宏块大, 但是画面细腻的地方, 宏块更小).
视频的播放本质就是宏块的运动 (宏块运动的方向形成了运动矢量). 视频播放时候(下一帧会删除重复的宏块, 用运动矢量代替, 差异信息用宏块编码)
h.264编码: 当与I帧的相似程度 > 95%, 编码成B帧, 相似程度 > 70%, 编码成P帧,
第四帧图像相似程度 > 70%, 编码成P帧.
此时, 在码流中, 第一帧是画面1, 第二帧是画面4, 第三帧是画面2, 第四帧是画面3.(第一帧一定是I帧, 第二帧一定是P帧, 一定是先编码I帧, 然后编码P这帧, 然后根据I帧和P帧, 编码B帧, DTS(解码顺序) : 画面1, 画面4, 画面2, 画面3, PTS:(播放顺序), 画面1, 画面2, 画面3, 画面4)
其实NALU的承载数据真实并不是RBSP而是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,称为脱壳操作。
case LFLiveVideoQuality_Low1:{
configuration.sessionPreset = LFCaptureSessionPreset360x640;
configuration.videoFrameRate = 15;
configuration.videoMaxFrameRate = 15;
configuration.videoMinFrameRate = 10;
configuration.videoBitRate = 500 * 1000;
configuration.videoMaxBitRate = 600 * 1000;
configuration.videoMinBitRate = 400 * 1000;
configuration.videoSize = CGSizeMake(360, 640);
}
break;
case LFLiveVideoQuality_Low2:{
configuration.sessionPreset = LFCaptureSessionPreset360x640;
configuration.videoFrameRate = 24;
configuration.videoMaxFrameRate = 24;
configuration.videoMinFrameRate = 12;
configuration.videoBitRate = 600 * 1000;
configuration.videoMaxBitRate = 720 * 1000;
configuration.videoMinBitRate = 500 * 1000;
configuration.videoSize = CGSizeMake(360, 640);
}
break;
case LFLiveVideoQuality_Low3: {
configuration.sessionPreset = LFCaptureSessionPreset360x640;
configuration.videoFrameRate = 30;
configuration.videoMaxFrameRate = 30;
configuration.videoMinFrameRate = 15;
configuration.videoBitRate = 800 * 1000;
configuration.videoMaxBitRate = 960 * 1000;
configuration.videoMinBitRate = 600 * 1000;
configuration.videoSize = CGSizeMake(360, 640);
}
break;
case LFLiveVideoQuality_Medium1:{
configuration.sessionPreset = LFCaptureSessionPreset540x960;
configuration.videoFrameRate = 15;
configuration.videoMaxFrameRate = 15;
configuration.videoMinFrameRate = 10;
configuration.videoBitRate = 800 * 1000;
configuration.videoMaxBitRate = 960 * 1000;
configuration.videoMinBitRate = 500 * 1000;
configuration.videoSize = CGSizeMake(540, 960);
}
break;
case LFLiveVideoQuality_Medium2:{
configuration.sessionPreset = LFCaptureSessionPreset540x960;
configuration.videoFrameRate = 24;
configuration.videoMaxFrameRate = 24;
configuration.videoMinFrameRate = 12;
configuration.videoBitRate = 800 * 1000;
configuration.videoMaxBitRate = 960 * 1000;
configuration.videoMinBitRate = 500 * 1000;
configuration.videoSize = CGSizeMake(540, 960);
}
break;
case LFLiveVideoQuality_Medium3:{
configuration.sessionPreset = LFCaptureSessionPreset540x960;
configuration.videoFrameRate = 30;
configuration.videoMaxFrameRate = 30;
configuration.videoMinFrameRate = 15;
configuration.videoBitRate = 1000 * 1000;
configuration.videoMaxBitRate = 1200 * 1000;
configuration.videoMinBitRate = 500 * 1000;
configuration.videoSize = CGSizeMake(540, 960);
}
break;
case LFLiveVideoQuality_High1:{
configuration.sessionPreset = LFCaptureSessionPreset720x1280;
configuration.videoFrameRate = 15;
configuration.videoMaxFrameRate = 15;
configuration.videoMinFrameRate = 10;
configuration.videoBitRate = 1000 * 1000;
configuration.videoMaxBitRate = 1200 * 1000;
configuration.videoMinBitRate = 500 * 1000;
configuration.videoSize = CGSizeMake(720, 1280);
}
break;
case LFLiveVideoQuality_High2:{
configuration.sessionPreset = LFCaptureSessionPreset720x1280;
configuration.videoFrameRate = 24;
configuration.videoMaxFrameRate = 24;
configuration.videoMinFrameRate = 12;
configuration.videoBitRate = 1200 * 1000;
configuration.videoMaxBitRate = 1440 * 1000;
configuration.videoMinBitRate = 800 * 1000;
configuration.videoSize = CGSizeMake(720, 1280);
}
break;
case LFLiveVideoQuality_High3:{
configuration.sessionPreset = LFCaptureSessionPreset720x1280;
configuration.videoFrameRate = 30;
configuration.videoMaxFrameRate = 30;
configuration.videoMinFrameRate = 15;
configuration.videoBitRate = 1200 * 1000;
configuration.videoMaxBitRate = 1440 * 1000;
configuration.videoMinBitRate = 500 * 1000;
configuration.videoSize = CGSizeMake(720, 1280);
}
case LFLiveAudioQuality_Low: {
audioConfig.audioBitrate = audioConfig.numberOfChannels == 1 ? LFLiveAudioBitRate_32Kbps : LFLiveAudioBitRate_64Kbps;
audioConfig.audioSampleRate = LFLiveAudioSampleRate_16000Hz;
}
break;
case LFLiveAudioQuality_Medium: {
audioConfig.audioBitrate = LFLiveAudioBitRate_96Kbps;
audioConfig.audioSampleRate = LFLiveAudioSampleRate_44100Hz;
}
break;
case LFLiveAudioQuality_High: {
audioConfig.audioBitrate = LFLiveAudioBitRate_128Kbps;
audioConfig.audioSampleRate = LFLiveAudioSampleRate_44100Hz;
}
break;
case LFLiveAudioQuality_VeryHigh: {
audioConfig.audioBitrate = LFLiveAudioBitRate_128Kbps;
audioConfig.audioSampleRate = LFLiveAudioSampleRate_48000Hz;
}