obs推rtmp流卡顿丢帧策略
1.检测队列buffer的长度,p帧超过900ms,b帧超过700毫秒开始丢帧。
2.丢帧策略新建一个circlebuf,音频不丢,视频按照优先级丢弃(i帧优先级为3,p帧优先级为2,b帧优先级为1),b帧超过700毫秒全部求其,p帧超过900毫秒全部丢弃。
3.触发丢帧后新来的帧,必须大于最小优先级。(解释:由于参考关系,比如p帧依赖i帧,所以p帧丢了后,要将后面p帧全部丢除,直到下一个I帧;而B帧也类似要直到下一个p帧);
buffer阀值的设置
obs_data_set_default_int(defaults, OPT_DROP_THRESHOLD, 700);
obs_data_set_default_int(defaults, OPT_PFRAME_DROP_THRESHOLD, 900);
拥塞率congestion的计算
超过buffer设置的阀值,为100%,否则为buffer缓存时长和缓存阀值的百分比
static float rtmp_stream_congestion(void *data)
{
struct rtmp_stream *stream = data;
return stream->min_priority > 0 ? 1.0f : stream->congestion;
}
具体代码分析
static bool add_video_packet(struct rtmp_stream *stream,
struct encoder_packet *packet)
{
//丢B帧
check_to_drop_frames(stream, false);
//丢P帧
check_to_drop_frames(stream, true);
/* if currently dropping frames, drop packets until it reaches the
* desired priority */
//如果P帧就一直丢到下一个I帧,如果丢B帧就丢到下一个P帧
if (packet->drop_priority < stream