python ffmpeg任意提取视频帧的方法


Posted in Python onFebruary 21, 2020

 环境准备

1、安装 FFmpeg

2、安装 ffmpeg-python

pip3 install ffmpeg-python

3、【可选】安装 opencv-python

pip3 install opencv-python

4、【可选】安装 numpy

pip3 install numpy

视频帧提取

准备视频素材

抖音视频素材下载:https://anoyi.com/dy/top

基于视频帧数提取任意一帧

import ffmpeg
import numpy
import cv2
import sys
import random


def read_frame_as_jpeg(in_file, frame_num):
  """
  指定帧数读取任意帧
  """
  out, err = (
    ffmpeg.input(in_file)
       .filter('select', 'gte(n,{})'.format(frame_num))
       .output('pipe:', vframes=1, format='image2', vcodec='mjpeg')
       .run(capture_stdout=True)
  )
  return out


def get_video_info(in_file):
  """
  获取视频基本信息
  """
  try:
    probe = ffmpeg.probe(in_file)
    video_stream = next((stream for stream in probe['streams'] if stream['codec_type'] == 'video'), None)
    if video_stream is None:
      print('No video stream found', file=sys.stderr)
      sys.exit(1)
    return video_stream
  except ffmpeg.Error as err:
    print(str(err.stderr, encoding='utf8'))
    sys.exit(1)


if __name__ == '__main__':
  file_path = '/Users/admin/Downloads/拜无忧.mp4'
  video_info = get_video_info(file_path)
  total_frames = int(video_info['nb_frames'])
  print('总帧数:' + str(total_frames))
  random_frame = random.randint(1, total_frames)
  print('随机帧:' + str(random_frame))
  out = read_frame_as_jpeg(file_path, random_frame)
  image_array = numpy.asarray(bytearray(out), dtype="uint8")
  image = cv2.imdecode(image_array, cv2.IMREAD_COLOR)
  cv2.imshow('frame', image)
  cv2.waitKey()

基于时间提取任意一帧

import ffmpeg
import numpy
import cv2
import sys
import random


def read_frame_by_time(in_file, time):
  """
  指定时间节点读取任意帧
  """
  out, err = (
    ffmpeg.input(in_file, ss=time)
       .output('pipe:', vframes=1, format='image2', vcodec='mjpeg')
       .run(capture_stdout=True)
  )
  return out


def get_video_info(in_file):
  """
  获取视频基本信息
  """
  try:
    probe = ffmpeg.probe(in_file)
    video_stream = next((stream for stream in probe['streams'] if stream['codec_type'] == 'video'), None)
    if video_stream is None:
      print('No video stream found', file=sys.stderr)
      sys.exit(1)
    return video_stream
  except ffmpeg.Error as err:
    print(str(err.stderr, encoding='utf8'))
    sys.exit(1)

if __name__ == '__main__':
  file_path = '/Users/admin/Downloads/拜无忧.mp4'
  video_info = get_video_info(file_path)
  total_duration = video_info['duration']
  print('总时间:' + total_duration + 's')
  random_time = random.randint(1, int(float(total_duration)) - 1) + random.random()
  print('随机时间:' + str(random_time) + 's')
  out = read_frame_by_time(file_path, random_time)
  image_array = numpy.asarray(bytearray(out), dtype="uint8")
  image = cv2.imdecode(image_array, cv2.IMREAD_COLOR)
  cv2.imshow('frame', image)
  cv2.waitKey()

相关资料
https://github.com/kkroening/ffmpeg-python/tree/master/examples

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 中 Meta Classes详解
Feb 13 Python
Python入门之后再看点什么好?
Mar 05 Python
python里 super类的工作原理详解
Jun 19 Python
Django ImageFiled上传照片并显示的方法
Jul 28 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
Aug 06 Python
python 函数的缺省参数使用注意事项分析
Sep 17 Python
Django 自定义分页器的实现代码
Nov 24 Python
Python SSL证书验证问题解决方案
Jan 13 Python
PyTorch中的C++扩展实现
Apr 02 Python
解决python Jupyter不能导入外部包问题
Apr 15 Python
Python基于wordcloud及jieba实现中国地图词云图
Jun 09 Python
Python包资源下载路径报404解决方案
Nov 05 Python
Python实现自动访问网页的例子
Feb 21 #Python
解决Python pip 自动更新升级失败的问题
Feb 21 #Python
python利用百度云接口实现车牌识别的示例
Feb 21 #Python
在python3中实现更新界面
Feb 21 #Python
Python要如何实现列表排序的几种方法
Feb 21 #Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
Feb 21 #Python
使用Python打造一款间谍程序的流程分析
Feb 21 #Python
You might like
VML绘图板②脚本--VMLgraph.js、XMLtool.js
2006/10/09 PHP
解析php做推送服务端实现ios消息推送
2013/07/01 PHP
PHP获取本周第一天和最后一天示例代码
2014/02/24 PHP
PHP往XML中添加节点的方法
2015/03/12 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
PHP用FTP类上传文件视频等的简单实现方法
2016/09/23 PHP
php+mysql开发中的经验与常识小结
2019/03/25 PHP
JavaScript的Module模式编程深入分析
2013/08/13 Javascript
javascript打印输出json实例
2013/11/11 Javascript
在javascript中执行任意html代码的方法示例解读
2013/12/25 Javascript
jQuery中val()方法用法实例
2014/12/25 Javascript
JavaScript中的立即执行函数表达式介绍
2015/03/15 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
jQuery实现的模拟弹出窗口功能示例
2016/11/24 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
2017/07/19 jQuery
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
linux系统使用python获取cpu信息脚本分享
2014/01/15 Python
Perl中著名的Schwartzian转换问题解决实现
2015/06/02 Python
使用Python来编写HTTP服务器的超级指南
2016/02/18 Python
Python字符串拼接、截取及替换方法总结分析
2016/04/13 Python
使用python实现个性化词云的方法
2017/06/16 Python
Python尾递归优化实现代码及原理详解
2020/10/09 Python
python模拟点击玩游戏的实例讲解
2020/11/26 Python
一款超酷的js+css3实现的3D标签云特效兼容ie7/8/9
2013/11/18 HTML / CSS
CSS3 animation实现逐帧动画效果
2016/06/02 HTML / CSS
SmartBuyGlasses丹麦:网上购买名牌太阳镜、眼镜和隐形眼镜
2016/10/01 全球购物
应届生会计电算化求职信
2013/10/03 职场文书
学期自我评价
2014/01/27 职场文书
《临死前的严监生》教学反思
2014/02/13 职场文书
学校门卫岗位职责
2014/03/16 职场文书
幼儿园大班评语大全
2014/04/17 职场文书
建筑管理专业求职信
2014/07/28 职场文书
2014年度个人工作总结
2014/11/07 职场文书
优秀党员申报材料
2014/12/18 职场文书
公司年会主持词范文!
2019/05/07 职场文书