看完这篇文章,你起码对分析视频卡顿有点思路了
熟话说,授人以鱼不如授人以渔,这里记录的是在实际项目上,我遇到问题时是如何进行排查解决的,给大家提供个思路参考~
一、遇到的问题
本地调试,用的uvc摄像头,插入uvc摄像头,后台需要实时的查看到当前摄像头画面。然后在pc端通过pc后台软件查看手机端实时视频,出现先出现一帧画面,然后会画面卡住,过个几秒钟后,画面才流畅。这种问题,大家在做直播,或者实时流相关的开发的时候,可能都会遇到,不知道大家都是怎么解决的呢,这篇文章,针对我自己遇到的情况,将会一步步的和大家分析下,我是如何解决这个问题的,希望能帮助到大家。
二、分析问题
1)这个问题,我们首先需要排查下是手机端还是pc端的问题,不然直接丢给pc端同事排查,人家搞半天,最后发现是手机端的问题,那就尴尬了;
2)下面我们来看下如果排查是哪端出现的问题?
其实思路也很简单,我们需要本地保存一份yuv和h264流文件,然后借助软件查看,本地的流文件是否正常。如果有问题,那就是手机端的问题,否则,就可以让pc端的同事一起排查了。
i.如下面代码块所示,我在流推送给后台之前,把yuv流数据保存到本地文件里面;

ii、如下面代码块所示,把编码后的h264流保存下来

private void saveStreamFile(byte[] buffer, String encodeFormat, int width, int height) {
String dirString = "/sdcard/videoStream/";
File dirFile = new File(dirString);
if (!dirFile.exists()) {
dirFile.mkdirs();
}
File saveFile = new File(dirString + width + "_" + height + "Stream.yuv");
try {
FileOutputStream fileOutputStream = new FileOutputStream(saveFile, true);
fileOutputStream.write(buffer);
fileOutputStream.flush();
fileOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
iii、流文件保存下来了,就是怎么查看的问题了。
我使用的是ElecardStreamEyeTools工具,应该也有其它软件可以查看,大家选择自己合适的就好。我用的这个工具可以播放yuv文件和h264流,不过后缀都需要修改成.yuv才能查看。
如下图所示,yuv流文件是选择Elecard YUV Viewer 来查看,h264流文件是选择Elecard StreamEye来查看。



3)上面一波操作后,是时候有个基本结论了。播放本地保存下来的yuv和h264流文件,发现都是流畅的,没有卡顿现象。而且发现h264流文件里面,是有够多的i帧的,这时候可以让pc端的同事一起排查了。
附:
ElecardStreamEyeTools工具 下载地址:
https://download.csdn.net/download/Mr_ZJC/14947142
三、问题排查及解决方法
上面的例子,只是我遇到的问题,实际开发过程中,会遇到各种各样的问题,大家可以从下面几个方面进行排查,相信总能解决问题的。
下面我来一起看下,一般卡顿有哪些原因,然后应该如何去解决。
卡顿的原因一般包括两个:电脑配置问题、网络环境。因为使用电脑直播,需要带动高清摄像头,对电脑配置也就有一定的要求,否则会出现延迟,卡顿的问题,通常电脑i5以上的配置就可以,i7更好。网络环境,建议直播时,没有其他设备共享网络,使用50兆以上可以支撑,当然想要更流畅,建议用100兆,专线专用,同时网线质量也有一定的影响,高清视频往往会给硬件带来解码压力,由于解码造成的卡顿尤为明显,同时如果PC端Flash Player或移动端播放软件版本过低,可能也会造成解码问题导致播放卡顿情况。
1. 设备
高清视频往往会给硬件带来解码压力,由于解码造成的卡顿尤为明显。同时如果PC端Flash Player或移动端播放软件版本过低,可能也会造成解码问题导致播放卡顿情况。如果是这个原因,解决方法有以下几点:升级硬件、软件设备,提高兼容性和容错率;使用硬编硬解方案,充分利用GPU 加速;降低视频码率,选择流畅或者标清画质进行视频播放;增大播放器缓冲区,缓解因网络或解码不稳定引起的卡顿。
2. 视频流
2.1 音视频时间戳不同步
在直播中,当音视频时间戳不同时,会影响画面渲染,导致画面解析时出现问题,造成一卡一卡的现象,如下图所示,音视频时间戳非单调递增会导致播放器在解析画面时出现错乱的情况,前后画面衔接会出现不连续甚至花屏的现象。

△ 音画不同步
针对此类问题,我们需要对推流器的源码进行研究,把读取到的每一针音频、视频的时间戳进行查阅、分析,然后通过程序干涉推流器或者流媒体服务器,矫正逻辑值,从而使音画同步。
2.2 视频流参数配置问题
如果视频的帧率设置过低(帧率即每秒的画面张数),根据人眼的视觉暂留原理,每秒的画面张数必须达到一定的数值,人眼观看才是连续有效的。导致视频流的编码方式与传输服务器有不兼容的情况,部分音视频数据出现了解析错误甚至无法解析的情况,也会出现视频流播放卡顿的问题。如果是这个原因,解决方法有:设置合理的码率,帧率,分辨率,关键帧间隔,音视频编码格式等参数;尽量遵循标准的视频编码方案,流媒体传输协议,对视频流进行采集,编码,解码,播放等操作。
3. 网络
直播网络目前存在三种情况:无线、有线、4G。无线网络:WIFI 连接的直播受距离、环境等使用因素的影响,需要让设备尽量靠近 WIFI 信号源,避免穿墙或金属物遮挡,保持信号强度,带宽6M以上,同时避免其他设备接入 WIFI 信号源抢占信号;有线网络:直播场地有专门的网口使用,最好是专线网络,上下行带宽不少于4M;4G网络:手机网络受到周围的环境影响大,需要在手机信号良好的地方,并且防止网络波动,在直播时最好选择4G卡。
------------------------------------------------
本人从事Android Camera相关开发已有5年
目前在深圳上班
欢迎大家关注我的微信公众号“小驰笔记”
大家一起学习交流

-------- 2021.02.26 深圳 15:17
