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发送form-data请求及拼接form-data内容的方法
Mar 05 Python
完美解决python遍历删除字典里值为空的元素报错问题
Sep 11 Python
Python实现的双色球生成功能示例
Dec 18 Python
PyTorch线性回归和逻辑回归实战示例
May 22 Python
Django使用详解:ORM 的反向查找(related_name)
May 30 Python
Django contenttypes 框架详解(小结)
Aug 13 Python
python远程连接MySQL数据库
Apr 19 Python
Pandas库之DataFrame使用的学习笔记
Jun 21 Python
python实现将视频按帧读取到自定义目录
Dec 10 Python
Python进程Multiprocessing模块原理解析
Feb 28 Python
使用Python和百度语音识别生成视频字幕的实现
Apr 09 Python
python解决OpenCV在读取显示图片的时候闪退的问题
Feb 23 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
利用discuz自带通行证整合dedecms的方法以及文件下载
2007/03/06 PHP
PHP实现PDO的mysql数据库操作类
2014/12/12 PHP
php微信高级接口群发 多客服
2016/06/23 PHP
javascript jQuery插件练习
2008/12/24 Javascript
input+select(multiple) 实现下拉框输入值
2009/05/21 Javascript
jQuery 动画弹出窗体支持多种展现方式
2010/04/29 Javascript
jquery无缝向上滚动实现代码
2013/03/29 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
js H5 canvas投篮小游戏
2016/08/18 Javascript
angularjs路由传值$routeParams详解
2020/09/05 Javascript
vue写一个组件
2018/04/09 Javascript
js Element Traversal规范中的元素遍历方法
2018/04/19 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
python开启多个子进程并行运行的方法
2015/04/18 Python
浅谈插入排序算法在Python程序中的实现及简单改进
2016/05/04 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
完美解决在oj中Python的循环输入问题
2018/06/25 Python
Python实现的多叉树寻找最短路径算法示例
2018/07/30 Python
flask中过滤器的使用详解
2018/08/01 Python
django做form表单的数据验证过程详解
2019/07/26 Python
Python 实现国产SM3加密算法的示例代码
2020/09/21 Python
Python字典取键、值对的方法步骤
2020/09/30 Python
size?丹麦官网:英国伦敦的球鞋精品店
2019/04/15 全球购物
华硕新加坡官方网上商店:ASUS Singapore
2020/07/09 全球购物
HR喜欢的自荐信格式
2013/10/08 职场文书
大一自我鉴定范文
2013/12/27 职场文书
大一新生检讨书
2014/10/29 职场文书
党的群众路线教育实践活动个人整改措施范文
2014/11/04 职场文书
汇报材料怎么写
2014/12/30 职场文书
不同意离婚答辩状
2015/05/22 职场文书
健康教育主题班会
2015/08/14 职场文书
MySQL 1130异常,无法远程登录解决方案详解
2021/08/23 MySQL
如何通过cmd 连接阿里云服务器
2022/04/18 Servers