python 视频抽帧_FFmpeg视频抽帧那些事_weixin_39593523的博客-程序员秘密

技术标签: python 视频抽帧  

视频文件是多媒体数据中比较常见的一种,也是入门门槛比较高的一个领域。视频数据相关的领域任务包括视频物体检测、视频物体追踪、视频分类、视频检索和视频摘要抽取等。

视频数据与图像数据非常类似,都是由像素点组成的数据。在视频数据在非音频部分基本上可以视为多帧(张)图像数据的拼接,即三维图像的组合。由于视频数据与图像数据的相似性,在上述列举的视频领域任务中大都可以借助图像方法来完成。

文本将讲解视频抽帧的几种方法,具体包括以下几种抽帧方式:抽取视频关键帧(IPB帧)

抽取视频场景转换帧

按照时间进行均匀抽帧

抽取制定时间的视频帧

在进行讲解具体的抽帧方式之前,我不得不介绍下FFmpeg。FFmpeg是一套可以用来编码、解码、合成和转换音频和视频数据的开源软件,提供了非常全面的音视频处理功能。如果你的工作内容是视频相关,那么ffmpeg是必须要掌握的软件了。FFmpeg提供了常见音视频和编解码方式,能够对众多的音视频格式进行读取,基本上所有的软件都会借助FFmpeg来完成音视频的读取操作。

FFmpeg的学习资料可以参考:

# 查看视频信息

> ffmpeg -i 666051400.mp4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '666051400.mp4':

Metadata:

major_brand : isom

minor_version : 512

compatible_brands: isomiso2avc1mp41

encoder : Lavf57.56.100

Duration: 00:17:02.00, start: 0.000000, bitrate: 374 kb/s

Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p,

Metadata:

handler_name : VideoHandler

Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz

Metadata:

handler_name : SoundHandler

At least one output file must be specified

1. 抽取视频关键帧(IPB帧)

视频关键帧(Video Keyframes)是用于视频压缩和视频编解码的帧,视频关键帧是包含了完整信息的帧,其他的非关键帧将会使用与关键帧的差值进行压缩。视频帧具体可以分为IPB帧三种:I帧表示关键帧,是最完整的帧画面,一般视频封面都选择I帧;

P帧单预测帧,利用之前的I帧或P帧,采用运动预测的方式进行帧间预测编码;

B帧双向预测帧,利用双向帧进行预测编码;

一般情况下关键帧`I帧`是信息最多的帧,也是用途最多的帧。在视频检索和视频分类任务中一般都借助`I帧`来完成,在一个时长60s的视频中,可以抽取得到16个I帧、84个P帧和184个B,I帧数量少包含的信息却是最多的。使用ffprobe提取出IPB帧的时间:

ffprobe -i 666051400.mp4 -v quiet -select_streams v -show_entries frame=pkt_pts_time,pict_type抽取IPB帧到jpg图片:

# 抽取I帧

ffmpeg -i 666051400.mp4 -vf "select=eq(pict_type\,I)" -vsync vfr -qscale:v 2 -f image2 ./%08d.jpg

# 抽取P帧

ffmpeg -i 666051400.mp4 -vf "select=eq(pict_type\,P)" -vsync vfr -qscale:v 2 -f image2 ./%08d.jpg

# 抽取B帧

ffmpeg -i 666051400.mp4 -vf "select=eq(pict_type\,B)" -vsync vfr -qscale:v 2 -f image2 ./%08d.jpg

由于ffmpeg抽取帧并无法按照时间戳来命名,需要手动将ffprobe提取出来的帧时间与抽取帧的图片进行对应重命名。关键帧具体的定义和用途可以参考:https://en.wikipedia.org/wiki/Key_frame

2. 抽取视频场景转换帧

在视频中可以按照视频的镜头切换可以将视频分为不同的场景(scene boundaries),为了直观感受可以观看下面一个视频。http://www.scikit-video.org/stable/_static/scene_cuts.mp4​www.scikit-video.org

视频场景抽取算法一般是使用帧间的相似差异程度来衡量,如果视频帧大于某一个阈值则认为是一个新的场景,否则不是一个新的场景。在scikit-video中提供了颜色相似度和边缘相似度两种度量方式,思路非常简单:

但是在我自己试验的过程中发现scikit-video中的场景检测非常慢,一个视频需要几分钟才能计算得到结果。后来在阅读ffmpeg文档过程中发现,ffmpeg早就有场景检测的命令,而且速度飞快。

# https://ffmpeg.org/ffmpeg-filters.html#select_002c-aselect

# 其中0.1表示帧为新场景的概率

ffmpeg -i 666051400.mp4 -filter:v "select='gt(scene,0.1)',showinfo" -f null - 2>&1

scikit-video的场景检测速度慢是以下原因:scikit-video中场景检测的实现方式是读取所有的视频帧,这个步骤非常耗时;而ffmpeg能够根据视频帧的压缩情况来选择性读取帧,速度就非常快了。但是scikit-video库还是很直观的,我也从库源代码学习到了很多。如果ffmpeg有对应的功能命令,优先使用ffmpeg来完成。

3. 均匀抽帧

# -r 指定抽取的帧率,即从视频中每秒钟抽取图片的数量。1代表每秒抽取一帧。

ffmpeg -i 666051400.mp4 -r 1 -q:v 2 -f image2 ./%08d.000000.jpg

4. 抽取制定时间的帧

# 耗时0.07s

ffmpeg -ss 00:00:30 -i 666051400.mp4 -vframes 1 0.jpg

# 耗时0.68s

ffmpeg -i 666051400.mp4 -ss 00:00:30 -vframes 1 0.jpg

为什么上述两个命令时间差距这么大呢,也就是-i与-ss的位置换了一下。区别就是如果-ss在前面,则会使用关键帧信息来进行索引,则会非常快。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39593523/article/details/110774418

智能推荐

改变CALayer的anchorPoint使视图缩放时其中一边固定不动_weixin_33873846的博客-程序员秘密

最近遇到个需求,需要当手指向上划动时视图向上移动显示出隐藏在屏幕下方的菜单,这时整个视图的bounds需要大于屏幕大小,隐藏菜单才能接收到Touch事件,但是发现无论在loadView里初始化view的bounds为多大,最后它会自动变为屏幕大小。于是只能在swipe操作中处理了。但是如果直接self.view.bounds = aBounds的话,会看到视图是以中心点进行伸缩的,...

参考文档一:性能测试---测试方案_**星空**的博客-程序员秘密

性能测试详细测试方案前言平台XX项目系统已经成功发布,依据项目的规划,未来势必会出现业务系统中信息大量增长的态势。随着业务系统在生产状态下日趋稳定、成熟,系统的性能问题也逐步成为了我们关注的焦点:每天大数据量的“冲击”,系统能稳定在什么样的性能水平,面临行业公司业务增加时,系统能否经受住“考验”,这些问题需要通过一个完整的性能测试来给出答案。 1第一章XXX系统性能测试概述1.1 被测系统定义XX...

前景大好的年轻人,必须具备这三种品质!!_Java面试官老王的博客-程序员秘密

如何判断一个员工是否有潜力?给大家讲一个35岁程序员面试被某企业老板拒的故事,给我的触动太大了。这位老板已经拿到了D轮融资,公司做得很大。但即便现在公司已经招了第600号员工,他还是坚持参加每个面试者的最终面,亲自把关每一个面试者。他说自己创业这么多年,早就已经面过了超过3000位面试者。他面试前500位面试者时,他亲自做了一个巨大的Excel表格,记录、分析每一个面试者。如果这个面试者被录用了,他还会要求HR和业务部门对照这个员工和他的判断是不...

关于sqlite3与python的基本操作及问题处理_python sqlite3 男跟女_Miakura的博客-程序员秘密

以下文章基于用navicat显示sqlite3的方法,用python进行简单的数据库操作,并对出现的问题进行一个解答

开源分享 一(StickerCamera + 仿微信多图选择)_贴纸相机 开源_aicpzl的博客-程序员秘密

开源分享 一由于项目需要,后期会在项目中加入给图片贴图或者打标签的功能,无意在网上发现一个类似的开源项目,便在此分享,与大家分享学习。除了该项目外,也同时分享一个仿微信实现多图选择的例子,下面做简单介绍。一、StickerCamera 介绍:一款集成了相机,图片裁剪,给图片贴图,打标签的APP。所需要的编译是 java 8。运行效果展示:使用说明:实现相机功能实现对图片进行

1009: [HNOI2008]GT考试 AC自动机+矩阵乘法优化DP_200815147的博客-程序员秘密

Description   阿申准备报名参加GT考试,准考证号为N位数X1X2….Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字。 他的不吉利数学A1A2…Am(0<=Ai<=9)有M位,不出现是指X1X2…Xn中没有恰好一段等于A1A2…Am. A1和X1可以为0题解:这题挺简单、挺套路的啊,把不吉利数字的AC自动机建出来,答案就相当于走完n...

随便推点

【手写数字识别】基于matlab GUI知识库手写数字识别(写字板+图片)【含Matlab源码 1227期】_手写数字识别系统_海神之光的博客-程序员秘密

1 案例背景手写体数字识别是图像识别学科下的一个分支,是图像处理和模式识别研究领域的重要应用之一,并且具有很强的通用性。由于手写体数字的随意性很大,如笔画粗细、字体大小、倾斜角度等因素都有可能直接影响到字符的识别准确率,所以手写体数字识别是一个很有挑战性的课题。在过去的数十年中,研究者们提出了许多识别方法,并取得了一定的成果。手写体数字识别的实用性很强,在大规模数据统计如例行年检、人口普查、财务、税务、邮件分拣等应用领域都有广阔的应用前景"。

python file_Python File文件_weixin_39936086的博客-程序员秘密

一、 python文件访问1, 在python中要访问文件,首先要打开文件,也就是open()这个函数其中三个常用的参数为(1,要操作的文件路径2,访问的方式3,encodeing=字符编码)有很多种访问方式(1), r: 只读(2), w: 只写,文件已存在则清空,不存在则创建(3), a: 追加,写在文件末尾,如果文件存在,则在文件最后去追加,文件不存在则创建(4),...

IEnumerable和IEnumerator_weixin_30381317的博客-程序员秘密

概述IEnumerable和IEnumerator接口存在的意义:用来实现迭代的功能! public interface IEnumerable { IEnumerator GetEnumerator(); } public interface IEnumerator { object Current...

js时间延迟执行函数_博智诚信的博客-程序员秘密

setTimeout('yourFunction()',5000);   5秒后执行yourFunction(),只执行一次     setInterval('yourFunction()',5000);   每隔5秒执行一次u         如果在yourFunction()中再次调用了setTimeout('yourFunction()',5000),可以完成类似于    

Eclipse maven 项目红叉 编译不报错问题处理_weixin_33946605的博客-程序员秘密

项目右键-> Maven -> Update Maven Project选中 :Force update 复选框转载于:https://www.cnblogs.com/ericyi/p/9674996.html

BGP 13条选路原则_weixin_33928137的博客-程序员秘密

If the next hop is unreachable, do not consider it.如果下一跳不可达,是不会参加选举的!1. weightPrefer the path that has the largest weight.思科的专有属性。2. Local PreferenceIf the routes have the sa...

推荐文章

热门文章

相关标签