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中的__init__ 、__new__、__call__小结
Apr 25 Python
python开发之tkinter实现图形随鼠标移动的方法
Nov 11 Python
基于Python Shell获取hostname和fqdn释疑
Jan 25 Python
剖析Python的Twisted框架的核心特性
May 25 Python
python3.4下django集成使用xadmin后台的方法
Aug 15 Python
Python下使用Scrapy爬取网页内容的实例
May 21 Python
浅谈Python 递归算法指归
Aug 22 Python
Python 按比例获取样本数据或执行任务的实现代码
Dec 03 Python
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
Jun 07 Python
详解Python requests模块
Jun 21 Python
Python基于百度AI实现抓取表情包
Jun 27 Python
Python实战之大鱼吃小鱼游戏的实现
Apr 01 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
isset和empty的区别
2007/01/15 PHP
PHP中PDO基础教程 入门级
2011/09/04 PHP
PHP If Else(elsefi) 语句
2013/04/07 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
2016/04/07 PHP
Yii全局函数用法示例
2017/01/22 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
2020/08/07 PHP
List all the Databases on a SQL Server
2007/06/21 Javascript
JavaScript Event学习第三章 早期的事件处理程序
2010/02/07 Javascript
基于jquery的代码显示区域自动拉长效果
2011/12/07 Javascript
一个获取第n个元素节点的js函数
2014/09/02 Javascript
JavaScript设计模式之单件模式介绍
2014/12/28 Javascript
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
纯javascript实现自动发送邮件
2015/10/21 Javascript
javascript url几种编码方式详解
2016/06/06 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
小程序实现展开/收起的效果示例
2018/09/22 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
2019/07/25 Javascript
vue实现计算器功能
2020/02/22 Javascript
[02:28]DOTA2亚洲邀请赛 LGD战队巡礼
2015/02/03 DOTA
对python中return和print的一些理解
2017/08/18 Python
深入理解Django的自定义过滤器
2017/10/17 Python
Django 配置多站点多域名的实现步骤
2019/05/17 Python
python实现kNN算法识别手写体数字的示例代码
2019/08/16 Python
django框架F&Q 聚合与分组操作示例
2019/12/12 Python
简单html5代码获取地理位置
2014/03/31 HTML / CSS
L’urv官网:精品女性运动服品牌
2019/07/07 全球购物
迪拜领先运动补剂零售品牌中文站:Sporter商城
2019/08/20 全球购物
护士辞职信模板
2014/01/20 职场文书
市场部规章制度
2014/01/24 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
代领学位证书毕业证书委托书
2014/09/30 职场文书
2014基建处领导班子“四风”对照检查材料思想汇报
2014/10/04 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
python urllib库的使用详解
2021/04/13 Python
Spring中的使用@Async异步调用方法
2021/11/01 Java/Android
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS