前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >视频播着播着就卡住了,为啥呢?教你如何查看视频帧信息

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

原创
作者头像
bellchen
修改2020-10-29 00:11:06
10.3K0
修改2020-10-29 00:11:06
举报

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

卡住了的视频

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

这到底是为什么呢?

猜想

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

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帧的大小都一样

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

结论

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

anyway,结论不重要,用ffprobe分析视频才重要
anyway,结论不重要,用ffprobe分析视频才重要

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 猜想
  • 分析
  • 结论
相关产品与服务
云点播
面向音视频、图片等媒体,提供制作上传、存储、转码、媒体处理、媒体 AI、加速分发播放、版权保护等一体化的高品质媒体服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档