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+Opencv识别两张相似图片
Mar 23 Python
Python3多线程操作简单示例
May 22 Python
对Python3 pyc 文件的使用详解
Feb 16 Python
50行Python代码获取高考志愿信息的实现方法
Jul 23 Python
tensorflow 报错unitialized value的解决方法
Feb 06 Python
Python接口自动化判断元素原理解析
Feb 24 Python
详解python中groupby函数通俗易懂
May 14 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
Jun 17 Python
使用Python绘制台风轨迹图的示例代码
Sep 21 Python
jupyter notebook快速入门及使用详解
Nov 13 Python
python自动化办公操作PPT的实现
Feb 05 Python
基于Python实现股票收益率分析
Apr 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
PHP计算加权平均数的方法
2015/07/16 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
2015/09/23 PHP
Yii中CGridView禁止列排序的设置方法
2016/07/12 PHP
extjs 的权限问题 要求控制的对象是 菜单,按钮,URL
2010/03/09 Javascript
jQuery Ajax提交表单查询获得数据实例代码
2012/09/19 Javascript
浅谈javascript中的闭包
2015/05/13 Javascript
js获取隐藏元素的宽高
2017/02/24 Javascript
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
浅谈node的事件机制
2017/10/09 Javascript
JavaScript设计模式之调停者模式实例详解
2018/02/03 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
Javascript var变量删除原理及实现
2020/08/26 Javascript
在Python的gevent框架下执行异步的Solr查询的教程
2015/04/16 Python
浅谈numpy库的常用基本操作方法
2018/01/09 Python
python如何通过twisted实现数据库异步插入
2018/03/20 Python
python判断输入日期为第几天的实例
2018/11/13 Python
django 配置阿里云OSS存储media文件的例子
2019/08/20 Python
Django之PopUp的具体实现方法
2019/08/31 Python
Python线程条件变量Condition原理解析
2020/01/20 Python
Django中日期时间型字段进行年月日时分秒分组统计
2020/11/27 Python
HTML5离线应用与客户端存储的实现
2018/05/03 HTML / CSS
Joie官方网上商店:购买服装和女装配饰
2018/06/05 全球购物
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
文件中有一组整数,要求排序后输出到另一个文件中
2012/01/04 面试题
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2014/01/19 面试题
中文专业毕业生自荐书范文
2014/01/04 职场文书
法律六进活动方案
2014/03/13 职场文书
幼儿园课题实施方案
2014/05/14 职场文书
公关活动策划方案
2014/05/25 职场文书
新闻学专业职业生涯规划范文:我的人生我做主
2014/09/12 职场文书
2014年团员学习十八大思想汇报
2014/09/13 职场文书
服务整改报告
2014/11/06 职场文书
圆明园纪录片观后感
2015/06/03 职场文书
导游词之沈阳植物园
2019/11/30 职场文书
一篇带你入门Java垃圾回收器
2021/06/16 Java/Android
Javascript中Microtask和Macrotask鲜为人知的知识点
2022/04/02 Javascript