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实现的去除win下文本文件头部BOM的代码
Feb 10 Python
python实现图片批量剪切示例
Mar 25 Python
一步步教你用Python实现2048小游戏
Jan 19 Python
Python制作刷网页流量工具
Apr 23 Python
Python基于pycrypto实现的AES加密和解密算法示例
Apr 10 Python
Python numpy 点数组去重的实例
Apr 18 Python
Python3实现腾讯云OCR识别
Nov 27 Python
Python Flask框架扩展操作示例
May 03 Python
使用虚拟环境打包python为exe 文件的方法
Aug 29 Python
python可视化实现KNN算法
Oct 16 Python
python-web根据元素属性进行定位的方法
Dec 13 Python
Django choices下拉列表绑定实例
Mar 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
合作指挥官:孟斯克
2020/03/16 星际争霸
PHP syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
php中http_build_query 的一个问题
2012/03/25 PHP
PHP获取数组长度或某个值出现次数的方法
2015/02/11 PHP
PHP使用mysqldump命令导出数据库
2015/04/14 PHP
javascript延时重复执行函数 lLoopRun.js
2007/06/29 Javascript
收藏Javascript中常用的55个经典技巧
2007/08/12 Javascript
form表单中去掉默认的enter键提交并绑定js方法实现代码
2013/04/01 Javascript
Javascript中对象继承的实现小例
2014/05/12 Javascript
Firefox下无法正常显示年份的解决方法
2014/09/04 Javascript
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
2016/08/05 Javascript
在js中做数字字符串补0(js补零)
2017/03/25 Javascript
用js屏蔽被http劫持的浮动广告实现方法
2017/08/10 Javascript
pace.js和NProgress.js两个加载进度插件的一点小总结
2018/01/31 Javascript
Auto.js自动收取自己和好友蚂蚁森林能量脚本
2018/06/28 Javascript
微信小程序实现点击页面出现文字
2020/09/21 Javascript
vue+element实现动态加载表单
2020/12/13 Vue.js
Python不规范的日期字符串处理类
2014/06/10 Python
Python迭代器和生成器介绍
2015/03/06 Python
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
python daemon守护进程实现
2016/08/27 Python
python2.7安装图文教程
2018/03/13 Python
python中返回矩阵的行列方法
2018/04/04 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
K最近邻算法(KNN)---sklearn+python实现方式
2020/02/24 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
用C#语言写出与SQLSERVER访问时的具体过程
2013/04/16 面试题
车间组长岗位职责
2013/12/20 职场文书
2015年办公室工作总结范文
2015/03/31 职场文书
课题研究阶段性总结
2015/08/13 职场文书
2015年幼儿园师德师风建设工作总结
2015/10/23 职场文书
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS
浅谈克隆 JavaScript
2021/11/02 Javascript