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读写excel的方法
Nov 18 Python
Python使用Flask框架同时上传多个文件的方法
Mar 21 Python
python3爬取淘宝信息代码分析
Feb 10 Python
使用Python通过win32 COM实现Word文档的写入与保存方法
May 08 Python
python随机数分布random均匀分布实例
Nov 27 Python
Python实现图像的垂直投影示例
Jan 17 Python
Python @property原理解析和用法实例
Feb 11 Python
Python + selenium + crontab实现每日定时自动打卡功能
Mar 31 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
May 11 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
Jun 11 Python
Python代码执行时间测量模块timeit用法解析
Jul 01 Python
Python识别花卉种类鉴定网络热门植物并自动整理分类
Apr 08 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
set_include_path在win和linux下的区别
2008/01/10 PHP
php strrpos()与strripos()函数
2013/08/31 PHP
dedecms函数分享之获取某一栏目所有子栏目
2014/05/19 PHP
php数组比较实现查找连续数的方法
2015/07/29 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
jquery一句话全选/取消全选
2011/03/01 Javascript
javascript面向对象编程代码
2011/12/19 Javascript
js实现网站首页图片滚动显示
2013/02/04 Javascript
js 通用订单代码
2013/12/23 Javascript
JavaScript通过select动态更换图片的方法
2015/03/23 Javascript
Node.js和MongoDB实现简单日志分析系统
2015/04/25 Javascript
JavaScript中用于生成随机数的Math.random()方法
2015/06/15 Javascript
javascript实现列表滚动的方法
2015/07/30 Javascript
微信小程序 radio单选框组件详解及实例代码
2017/01/10 Javascript
js实现拖拽功能
2017/03/01 Javascript
基于vue配置axios的方法步骤
2017/11/09 Javascript
vue动态设置img的src路径实例
2018/09/18 Javascript
浅谈高大上的微信小程序中渲染html内容—技术分享
2018/10/25 Javascript
[02:30]辉夜杯主赛事第二日胜者组半决赛 CDEC.Y赛后采访
2015/12/26 DOTA
[01:07:41]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
pygame播放音乐的方法
2015/05/19 Python
深入解析Python中的__builtins__内建对象
2016/06/21 Python
Django Admin中增加导出CSV功能过程解析
2019/09/04 Python
tensorflow 环境变量设置方式
2020/02/06 Python
简单介绍一下pyinstaller打包以及安全性的实现
2020/06/02 Python
纯HTML5+CSS3制作生日蛋糕(代码易懂)
2016/11/16 HTML / CSS
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
怎样声明一个匿名的内部类
2016/06/01 面试题
国际商务专业职业生涯规划书范文
2014/01/17 职场文书
5.1手机促销活动
2014/01/17 职场文书
优秀部门获奖感言
2014/02/14 职场文书
大学生职业生涯规划书汇总
2014/03/20 职场文书
学校元旦晚会开场白
2015/05/29 职场文书
周恩来的四个昼夜观后感
2015/06/03 职场文书
学校体育节班级口号
2015/12/25 职场文书
vue项目打包后路由错误的解决方法
2022/04/13 Vue.js