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 ORM框架SQLAlchemy学习笔记之安装和简单查询实例
Jun 10 Python
浅谈Python中带_的变量或函数命名
Dec 04 Python
Python中关键字global和nonlocal的区别详解
Sep 03 Python
Python操作mongodb数据库的方法详解
Dec 08 Python
Python生成器的使用方法和示例代码
Mar 04 Python
django ManyToManyField多对多关系的实例详解
Aug 09 Python
Django中的FBV和CBV用法详解
Sep 15 Python
python通过链接抓取网站详解
Nov 20 Python
python列表推导式操作解析
Nov 26 Python
python绘制彩虹图
Dec 16 Python
详解在Python中使用Torchmoji将文本转换为表情符号
Jul 27 Python
python判断一个变量是否已经设置的方法
Aug 13 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
PHP面向对象概念
2011/11/06 PHP
采用memcache在web集群中实现session的同步会话
2014/07/05 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
最新最全PHP生成制作验证码代码详解(推荐)
2016/06/12 PHP
微信 开发生成带参数的二维码的实例
2016/11/23 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
2019/03/01 PHP
基于laravel Request的所有方法详解
2019/09/29 PHP
IE8中使用javascript动态加载CSS的解决方法
2014/06/17 Javascript
详解AngularJS中的依赖注入机制
2015/06/17 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
Javascript中arguments对象的详解与使用方法
2016/10/04 Javascript
5分钟打造简易高效的webpack常用配置
2017/07/04 Javascript
Bootstrap滚动监听组件scrollspy.js使用方法详解
2017/07/20 Javascript
详解vue-cli快速构建vue应用并实现webpack打包
2017/12/13 Javascript
javascriptvoid(0)含义以及与"#"的区别讲解
2019/01/19 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
2019/03/04 Javascript
win10系统中安装scrapy-1.1
2016/07/03 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
对python字典元素的添加与修改方法详解
2018/07/06 Python
python使用KNN算法识别手写数字
2019/04/25 Python
Python读取excel文件中带公式的值的实现
2020/04/17 Python
PyTorch-GPU加速实例
2020/06/23 Python
香港礼品网站:GiftU eshop
2017/09/01 全球购物
经典c++面试题二
2015/08/14 面试题
目标责任书范文
2014/04/14 职场文书
团结就是力量演讲稿
2014/05/21 职场文书
学校2014重阳节活动策划方案
2014/09/16 职场文书
三严三实对照检查材料思想汇报
2014/09/28 职场文书
县委党的群众路线教育实践活动工作情况报告
2014/10/25 职场文书
2014年校务公开工作总结
2014/12/18 职场文书
求职自我评价怎么写
2015/03/09 职场文书
社区义诊通知
2015/04/24 职场文书
2016特色励志班级口号
2015/12/24 职场文书
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python
React中的Context应用场景分析
2021/06/11 Javascript