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 相关文章推荐
Python3读取zip文件信息的方法
May 22 Python
Python中的字符串操作和编码Unicode详解
Jan 18 Python
python入门:这篇文章带你直接学会python
Sep 14 Python
linux安装Python3.4.2的操作方法
Sep 28 Python
Python计算时间间隔(精确到微妙)的代码实例
Feb 26 Python
python实战串口助手_解决8串口多个发送的问题
Jun 12 Python
基于python实现把图片转换成素描
Nov 13 Python
Python的形参和实参使用方式
Dec 24 Python
python使用配置文件过程详解
Dec 28 Python
Python 实现递归法解决迷宫问题的示例代码
Jan 12 Python
Django使用list对单个或者多个字段求values值实例
Mar 31 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
Nov 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
Windows IIS PHP 5.2 安装与配置方法
2009/06/08 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
PHP独立Session数据库存储操作类分享
2014/06/11 PHP
PHP两种实现无级递归分类的方法
2017/03/02 PHP
django中的ajax组件教程详解
2018/10/18 PHP
js 替换功能函数,用正则表达式解决,js的全部替换
2010/12/08 Javascript
jQuery中append、insertBefore、after与insertAfter的简单用法与注意事项
2020/04/04 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
JS Loading功能的简单实现
2013/11/29 Javascript
JS判断文本框内容改变事件的简单实例
2014/03/07 Javascript
extjs简介_动力节点Java学院整理
2017/07/17 Javascript
基于jQuery解决ios10以上版本缩放问题
2017/11/03 jQuery
详解Koa中更方便简单发送响应的方式
2018/07/20 Javascript
使用JS实现导航切换时高亮显示的示例讲解
2018/08/22 Javascript
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
前端Vue项目详解--初始化及导航栏
2019/06/24 Javascript
vue与iframe之间的信息交互的实现
2020/04/08 Javascript
处理JavaScript值为undefined的7个小技巧
2020/07/28 Javascript
Python操作json数据的一个简单例子
2014/04/17 Python
Python的Tornado框架异步编程入门实例
2015/04/24 Python
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
python 剪切移动文件的实现代码
2018/08/02 Python
Python引用计数操作示例
2018/08/23 Python
Python3实现的反转单链表算法示例
2019/03/08 Python
python中eval与int的区别浅析
2019/08/11 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
2020/06/27 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
2020/10/15 Python
软件测试工程师面试问题精选
2016/10/28 面试题
python+selenium小米商城红米K40手机自动抢购的示例代码
2021/03/24 Python
高中生校园生活自我评价
2013/09/19 职场文书
大学新生军训方案
2014/05/03 职场文书
2016年乡镇综治宣传月活动总结
2016/03/16 职场文书
送给教师们,到底该如何写好教学反思?
2019/07/02 职场文书
农村房屋租赁合同(范本)
2019/07/23 职场文书
Python基于百度API识别并提取图片中文字
2021/06/27 Python