花屏卡顿问题整理

本文探讨了视频播放卡顿的原因,包括帧率不足、机器性能不够、编码器输出码率过高以及网络丢包等,并提出了相应的解决策略,如提高帧率、利用GPU加速处理、码率控制和缓存处理。此外,还分析了花屏问题,如帧不完整、YUV格式错误和Stride问题,并给出了对应的解决办法,确保视频流畅播放。

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

卡顿问题

两帧之间的播放时间间隔超过了200ms,就可以看出明显的卡顿了。一般导致卡顿问题的场景如下:

帧率不够

如果实际采集到的帧率或者设置的帧率本身只有5fps,即便是正常播放也会卡顿。

解决办法:那就要提高帧率处理了。

机器性能不够,导致前处理或者编码耗时太长

如果本身性能不足,画面分辨率有很高。可能会导致前处理一帧或者编码器编码一帧的耗时很高。这种情况下,即便采集的帧率很高,但是前处理和编码操作的机器处理不过来,从而导致两帧被发送出去的间隔很高。

解决办法:在高分辨率的时候尽量使用GPU做前处理,并使用硬件编码或者将软件编码设置为快速档加快处理速度。

编码器输出码率超过实际网络带宽

网络突然变差,从而网络预估出来的带宽很小,但是实际播放画面很复杂,且需要的码率比较高,这时候就会容易出现发送码率大于实际带宽的问题。

解决办法:对码率严格控制,放置超过预估带宽。使用CBR的码控算法,从而保证输出码率能够比较好的贴合带宽

  • CBR:设置多少码率,编码器的输出码率就会接近于目标码率。
  • VBR:输出的码率会随着画面的复杂程度变化

复杂帧编码后过大或者I帧比较大

尽管使用CBR码控使得码率尽量贴合预估带宽,但当编码画面变化很大的帧或者需要编码IDR帧的时候,还是会使得编码后这一帧的大小会比较大。如果一次性将这种大帧打包出来的数据直接发送到网络中,则会在瞬间加剧网络负担,引起丢包,引发卡顿问题。

解决办法:在编码打包之后、发送之前,加一个缓存处理来平滑的发送视频包

网络本身就有一定的丢包率

解决办法:丢包重传

如果重传的包又丢失了

解决办法:通知发送方,立刻编码一个IDR帧,同时清空缓存的帧,使用最新的IDR参考帧。

花屏问题

以下是几种比较常见的花屏原因

帧不完整

帧不完整就送去解码或者参考帧不完整的情况 解决办法:首先找到第一个slice,slice也是完整的。如果第一个slice的第一个包到帧的最后一个slice都收到了,并且slice完整,就代表帧完整了。

  • slice完整性判断:slice header的first_mb_in_slice值为0,就代表了当前slice的第一个宏块是一帧的第一个宏块,也就是说当前slice是一帧的第一个slice。如果该字段不为0则代表当前slice不是一帧的第一个slice,直到找到下一个字段为0的slice,说明前一个slice是前一帧最后一个slice。

yuv格式错误

解决办法:使用正确的格式

stride问题

解码后渲染前一定要处理好stride,不要和宽度弄混

  • stride:是字节对齐后所占用像素的空间。

文章来自多方面的学习积累,请各位大佬指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值