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使用xlrd模块读写Excel文件的方法
May 06 Python
Python操作使用MySQL数据库的实例代码
May 25 Python
Python之循环结构
Jan 15 Python
python实现祝福弹窗效果
Apr 07 Python
python__name__原理及用法详解
Nov 02 Python
python定义类self用法实例解析
Jan 22 Python
python 插入日期数据到Oracle实例
Mar 02 Python
Jupyter Notebook折叠输出的内容实例
Apr 22 Python
解决Python发送Http请求时,中文乱码的问题
Apr 30 Python
python在一个范围内取随机数的简单实例
Aug 16 Python
Python3获取cookie常用三种方案
Oct 05 Python
python本地文件服务器实例教程
May 02 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/04 星际争霸
PHP输出控制功能在简繁体转换中的应用
2006/10/09 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
Codeigniter发送邮件的方法
2015/03/19 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
2016/03/18 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
jQuery学习笔记之jQuery的事件
2010/12/22 Javascript
js保留小数点后几位的写法
2014/01/03 Javascript
基于js与flash实现的网站flv视频播放插件代码
2014/10/14 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
javascript跑马灯抽奖实例讲解
2020/04/17 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
2016/08/06 Javascript
AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法
2017/01/19 Javascript
移动端利用H5实现压缩图片上传功能
2017/03/29 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
ES6 Promise对象的应用实例分析
2019/06/27 Javascript
Js参数RSA加密传输之jsencrypt.js的使用
2020/02/07 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
[01:09]DOTAPLUS——DOTA2的新时代
2018/04/04 DOTA
python打开网页和暂停实例
2014/09/30 Python
Python的多态性实例分析
2015/07/07 Python
轻松掌握python设计模式之访问者模式
2016/11/18 Python
python实现高斯判别分析算法的例子
2019/12/09 Python
python Yaml、Json、Dict之间的转化
2020/10/19 Python
苹果台湾官网:Apple台湾
2019/01/05 全球购物
error和exception有什么区别
2012/10/02 面试题
假面舞会策划方案
2014/05/29 职场文书
奉献家乡演讲稿
2014/09/13 职场文书
庆元旦演讲稿
2014/09/15 职场文书
领导班子整改方案和个人整改措施
2014/10/25 职场文书
2015年收银工作总结范文
2015/04/01 职场文书
政审证明范文
2015/06/19 职场文书
2016大学生暑期社会实践心得体会
2016/01/14 职场文书
送给自己的励志语句:要安静的优秀,悄无声息的坚强
2019/11/26 职场文书
SQL Server数据库的三种创建方法汇总
2023/05/08 MySQL