今天系统收到用户上传的一份视频,播着播着就卡住了,很是奇怪,大家可以播放感受下,卡顿发生在视频1分钟的时候。
文件见如下附件,现象很奇怪,突然就没有内容了,连声音都没了,但进度条一直在走,直到4分半。
这到底是为什么呢?
猜想
导致视频播放卡顿的原因有千千万万,常见的有如下:
1、网络较差,导致视频下载较慢,需要缓冲,因此卡住了;
可以下载文件到本地,用本地播放器(VLC、QQ播放器等)尝试播放,这个案例应该不是这个原因,本地播放到第1分钟之后也出现了卡住。
2、文件的音频和视频时长不一致,视频只有一分钟,音频有4分30秒;
如果是这种情况,在一分钟之后,视频可能卡住,应该还会继续有声音,不过这个可能性也不是没有,先保持怀疑态度。
3、视频格式有问题,播放器播不动,可能原因是单帧过大,单帧时间过长;
这种情况下一个帧率25fps的视频,时长4分30秒的话,应该有270秒*25fps = 6750帧;
如果这个视频的最后一个帧特别大, 这个视频可能只有60秒*25fps=1500帧,而最后一帧时长为3分30秒;
分析
再多的猜测,也只是猜测,还不如剖析下这个视频文件,看问题出在哪里?
我们知道(其实很多人不知道),一个视频文件,其实就是一堆连续的图片快速切换,当画面切换得足够快,人们就以为这玩意动起来了
就像一本书一样,每一页就相当于一个画面,既然上述视频在一分钟卡住了,是不是可以直接定位到一分钟处以及之后的视频帧,我们看下到底是怎么了?就像翻书一样,咱们直接翻到那一页;
然而,书比较好翻,视频文件该怎么精准定位呢? 用播放器来播放,会卡住哦,根本看不到细节;
此时,需要借助FFmpeg里的ffprobe工具,进一步分析;
1、查看视频信息:
这一步可以用如下指令获取
代码语言:javascript复制ffprobe -show_streams -i 卡住了.mp4 -of json
得到的json数据如下,为了方便观看,我把一些不重要字段删除了
由此,排除了上述的第二个猜想(视频较短,音频较长,导致画面停留在最后一帧)
当然,上述步骤也可以用MediaInfo工具查看,入口 http://MediaArea.net/MediaInfo 这个工具可以查看文件的视频流、音频流、字幕流、甚至章节Chapters的信息,实在是居家旅行、排忧解难、必备良药!
2、查看每一帧信息
既然音视频流的长度一致,我们试下用ffprobe定位到一分钟之后的那一帧,看有啥异样;
指令如下:
代码语言:javascript复制ffprobe -select_streams 0 -show_frames -i 卡住了.mp4 -of csv >> 0.csv #查看第一个流的每一帧
ffprobe -select_streams 1 -show_frames -i 卡住了.mp4 -of csv >> 1.csv #查看第一个流的每一帧
#附件的文件中,第一个流是视频,第二个流是音频。
得到的csv文件,用excel打开之后是没有表头的,而且csv文件的第一列固定是"frame"。
如果是视频,剔除第一列之后,表头信息如下
第1个字段media_type表示它是video视频;
第3个字段key_frame表示是否关键帧;
第10个字段pkt_duration表示该帧的时长;
第13个字段pkt_size 表示该帧的大小;
如果是音频,剔除第一列之后,表头信息如下
音频帧的字段含义类似,只是音频帧的字段数没视频帧那么多。
为了方便大家查看,我把两个csv文件转换为Excel,放在以下附件,并且高亮了pkt_duration和pkt_size两列。
接下来,即可定位到一分钟附近的帧,看是否有异常,为了更加方便看到整个文件的全貌,我把这两个字段做了图表,该视频的帧率是30fps,那么一分钟就有1800帧。
从pkt_duration的图表看是一条直线,说明每一帧的时长都差不多;
但从pkt_size曲线看,在一分钟之前的pkt_size,由于画面不断变动,每一帧的大小不尽相同;
关键帧I帧相对较大,参考帧P帧相对较小,同样是P帧,大小也不大一样。
但一分钟之后,每一个I帧的大小都一样,每一个P帧的大小都一样
这就很奇怪了,而恰好也解释了这个视频的播放异常现象;
结论
说明视频从一分钟之后,不是视频播放卡住了,而是画面静止不动了,由于画面静止不动,所以每一帧的大小是一样的。