OBS推rtmp流拥塞时丢帧策略

本文详细介绍了OBS在推rtmp流时遇到卡顿如何进行丢帧策略,包括设定buffer阀值、计算拥塞率的方法以及具体的代码实现分析。重点讲解了在拥塞情况下,如何优先丢弃不同类型的视频帧以保证流的流畅性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帝都小鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值