视频播着播着就卡住了,为啥呢?教你如何查看视频帧信息

2020-10-29 00:11:06 浏览数 (1)

今天系统收到用户上传的一份视频,播着播着就卡住了,很是奇怪,大家可以播放感受下,卡顿发生在视频1分钟的时候。

卡住了的视频

文件见如下附件,现象很奇怪,突然就没有内容了,连声音都没了,但进度条一直在走,直到4分半。

卡住了.mp4.zip

这到底是为什么呢?

猜想

导致视频播放卡顿的原因有千千万万,常见的有如下:

1、网络较差,导致视频下载较慢,需要缓冲,因此卡住了;

可以下载文件到本地,用本地播放器(VLC、QQ播放器等)尝试播放,这个案例应该不是这个原因,本地播放到第1分钟之后也出现了卡住。

2、文件的音频和视频时长不一致,视频只有一分钟,音频有4分30秒;

如果是这种情况,在一分钟之后,视频可能卡住,应该还会继续有声音,不过这个可能性也不是没有,先保持怀疑态度。

视频轨太短,导致画面卡在1分钟处视频轨太短,导致画面卡在1分钟处

3、视频格式有问题,播放器播不动,可能原因是单帧过大,单帧时间过长;

这种情况下一个帧率25fps的视频,时长4分30秒的话,应该有270秒*25fps = 6750帧;

如果这个视频的最后一个帧特别大, 这个视频可能只有60秒*25fps=1500帧,而最后一帧时长为3分30秒;

异常的帧长,导致播放卡住异常的帧长,导致播放卡住

分析

再多的猜测,也只是猜测,还不如剖析下这个视频文件,看问题出在哪里?

我们知道(其实很多人不知道),一个视频文件,其实就是一堆连续的图片快速切换,当画面切换得足够快,人们就以为这玩意动起来了

假装是一个视频,其实我是个GIF假装是一个视频,其实我是个GIF

就像一本书一样,每一页就相当于一个画面,既然上述视频在一分钟卡住了,是不是可以直接定位到一分钟处以及之后的视频帧,我们看下到底是怎么了?就像翻书一样,咱们直接翻到那一页;

然而,书比较好翻,视频文件该怎么精准定位呢? 用播放器来播放,会卡住哦,根本看不到细节;

此时,需要借助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帧的大小都一样

这就很奇怪了,而恰好也解释了这个视频的播放异常现象;

结论

说明视频从一分钟之后,不是视频播放卡住了,而是画面静止不动了,由于画面静止不动,所以每一帧的大小是一样的。

卡住了视频每一帧的信息.zip
anyway,结论不重要,用ffprobe分析视频才重要anyway,结论不重要,用ffprobe分析视频才重要

0 人点赞