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文件的md5加密方法
Apr 06 Python
Python 正则表达式的高级用法
Dec 04 Python
python 读写中文json的实例详解
Oct 29 Python
Python随机函数random()使用方法小结
Apr 29 Python
Python 修改列表中的元素方法
Jun 26 Python
详解python中Numpy的属性与创建矩阵
Sep 10 Python
在Django中URL正则表达式匹配的方法
Dec 20 Python
利用python将图片版PDF转文字版PDF
May 03 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
Aug 12 Python
Django实现前台上传并显示图片功能
May 29 Python
简单了解Django项目应用创建过程
Jul 06 Python
python 如何利用argparse解析命令行参数
Sep 11 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小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
php懒人函数 自动添加数据
2011/06/28 PHP
探讨file_get_contents与curl效率及稳定性的分析
2013/06/06 PHP
PHP循环结构实例讲解
2014/02/10 PHP
JavaScript 变量基础知识
2009/11/07 Javascript
在jquery中combobox多选的不兼容问题总结
2013/12/24 Javascript
nodejs 实现模拟form表单上传文件
2014/07/14 NodeJs
jQuery中ajax的load()方法用法实例
2014/12/26 Javascript
jQuery中 prop() attr()使用详解
2015/05/19 Javascript
JS+CSS实现自动切换的网页滑动门菜单效果代码
2015/09/14 Javascript
jQuery EasyUi实战教程之布局篇
2016/01/26 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
2016/05/05 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
详解前端自动化工具gulp自动添加版本号
2016/12/20 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
JS去掉字符串前后空格或去掉所有空格的用法
2017/03/25 Javascript
《javascript设计模式》学习笔记七:Javascript面向对象程序设计组合模式详解
2020/04/08 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
[05:42]DOTA2英雄梦之声_第10期_蝙蝠骑士
2014/06/21 DOTA
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
python中精确输出JSON浮点数的方法
2014/04/18 Python
用Python创建声明性迷你语言的教程
2015/04/13 Python
python利用装饰器进行运算的实例分析
2015/08/04 Python
一波神奇的Python语句、函数与方法的使用技巧总结
2015/12/08 Python
python3实现名片管理系统
2020/11/29 Python
Jupyter Notebook输出矢量图实例
2020/04/14 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
2020/05/15 Python
python中pathlib模块的基本用法与总结
2020/08/17 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
美国波道夫·古德曼百货官网:Bergdorf Goodman
2017/11/07 全球购物
致跳高运动员广播稿
2014/01/13 职场文书
委托书范本
2014/04/02 职场文书
全国优秀教师事迹材料
2014/08/26 职场文书
园艺专业毕业生求职信
2014/09/02 职场文书
个人授权委托书样本
2014/09/13 职场文书
spring项目中切面及AOP的使用方法
2021/06/26 Java/Android