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采集腾讯新闻实例
Jul 10 Python
Python中内置的日志模块logging用法详解
Jul 12 Python
python类的继承实例详解
Mar 30 Python
使用Python进行AES加密和解密的示例代码
Feb 02 Python
python3 requests中使用ip代理池随机生成ip的实例
May 07 Python
在Pycharm中项目解释器与环境变量的设置方法
Oct 29 Python
python 输入一个数n,求n个数求乘或求和的实例
Nov 13 Python
使用Python实现图像标记点的坐标输出功能
Aug 14 Python
Pycharm 2020年最新激活码(亲测有效)
Sep 18 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
Feb 07 Python
tensorflow模型转ncnn的操作方式
May 25 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
Oct 30 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
基于session_unset与session_destroy的区别详解
2013/06/03 PHP
php中time()和mktime()方法的区别
2013/09/28 PHP
PHP中使用匿名函数操作数据库的例子
2014/11/17 PHP
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
利用NodeJS的子进程(child_process)调用系统命令的方法分享
2013/06/05 NodeJs
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
js仿微博实现统计字符和本地存储功能
2015/12/22 Javascript
AngularJS HTML DOM详解及示例代码
2016/08/17 Javascript
jQuery DateTimePicker 日期和时间插件示例
2017/01/22 Javascript
canvas实现爱心和彩虹雨效果
2017/03/09 Javascript
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
2017/05/13 NodeJs
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
a标签调用js的方法总结
2019/09/05 Javascript
JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记
2020/07/15 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
2020/11/24 Javascript
python使用urllib2实现发送带cookie的请求
2015/04/28 Python
Python中使用bidict模块双向字典结构的奇技淫巧
2016/07/12 Python
Django自定义插件实现网站登录验证码功能
2017/04/19 Python
Python装饰器用法实例分析
2019/01/14 Python
Django使用redis缓存服务器的实现代码示例
2019/04/28 Python
搭建python django虚拟环境完整步骤详解
2019/07/08 Python
Django多进程滚动日志问题解决方案
2019/12/17 Python
Python CSV文件模块的使用案例分析
2019/12/21 Python
Elasticsearch py客户端库安装及使用方法解析
2020/09/14 Python
用Python进行websocket接口测试
2020/10/16 Python
C++是不是类型安全的
2014/02/18 面试题
售后服务科岗位职责范文
2013/11/13 职场文书
女大学生自我鉴定
2013/12/09 职场文书
医务工作者先进事迹材料
2014/01/26 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
客户答谢会致辞
2015/01/20 职场文书
教师见习总结范文
2015/06/23 职场文书
幼儿园托班开学寄语(2016秋季)
2015/12/03 职场文书
2016党校学习心得体会范文
2016/01/07 职场文书
九年级语文教学反思
2016/03/03 职场文书
Redis实现一个账号只能登录一个设备
2022/04/19 Redis