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中的条件判断语句
May 14 Python
Python图片裁剪实例代码(如头像裁剪)
Jun 21 Python
在python3环境下的Django中使用MySQL数据库的实例
Aug 29 Python
Python中单例模式总结
Feb 20 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
Apr 05 Python
对Python2与Python3中__bool__方法的差异详解
Nov 01 Python
解决Python selenium get页面很慢时的问题
Jan 30 Python
通过python连接Linux命令行代码实例
Feb 18 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
Mar 23 Python
简单了解python列表和元组的区别
May 14 Python
用python画城市轮播地图
May 28 Python
七个非常实用的Python工具包总结
Jun 15 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多线程抓取网页实现代码
2010/07/22 PHP
基于Discuz security.inc.php代码的深入分析
2013/06/03 PHP
PHP调用C#开发的dll类库方法
2014/07/28 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
php实现三级级联下拉框
2016/04/17 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
PHP $O00OO0=urldecode & eval 解密,记一次商业源码的去后门
2020/09/13 PHP
php中array_fill函数的实例用法
2021/03/02 PHP
在IE下:float属性会影响offsetTop的取值
2006/12/22 Javascript
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
javascript在当前窗口关闭前检测窗口是否关闭
2014/09/29 Javascript
jquery获取radio值(单选组radio)
2014/10/16 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
2016/06/27 Javascript
浅析Javascript ES6中的原生Promise
2016/08/25 Javascript
web打印小结
2017/01/11 Javascript
简单实现bootstrap导航效果
2017/02/07 Javascript
微信小程序实现随机验证码功能
2018/12/20 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
[00:30]明星选手化身超级英雄!2018DOTA2亚洲邀请赛全明星赛来临!
2018/04/06 DOTA
详解Python设计模式编程中观察者模式与策略模式的运用
2016/03/02 Python
python使用Matplotlib画条形图
2020/03/25 Python
python处理“
2019/06/10 Python
什么是Python中的顺序表
2020/06/02 Python
python中openpyxl和xlsxwriter对Excel的操作方法
2021/03/01 Python
HTML5+css3:3D旋转木马效果相册
2017/01/03 HTML / CSS
Snapfish英国:在线照片打印和个性化照片礼品
2017/01/13 全球购物
Urban Outfitters德国官网:美国跨国生活方式零售公司
2018/05/21 全球购物
鞋类设计与工艺专业销售求职信
2013/11/01 职场文书
四查四看剖析材料
2014/02/14 职场文书
机关出纳岗位职责
2014/04/03 职场文书
2014年财务工作自我评价
2014/09/23 职场文书
2015届大学生就业推荐表自我评价
2014/09/27 职场文书
企业法人代表授权委托书
2014/10/02 职场文书
2014年大学宣传部工作总结
2014/12/19 职场文书
摘录式读书笔记
2015/07/01 职场文书
小学中队委竞选稿
2015/11/20 职场文书