当前位置: 首页 > news >正文

Python-从视频到gif(imageio,moviepy,ffmpeg)

降智警告:本人为编程新手,遵守面向CSDN编程原则,代码架构具有个人特色,仅供参考

 

前言:因为之前看到一个视频里的ed还挺喜欢的,所以想截取下来,做成gif,结果做出来几十M,所以本文还会涉及截取并裁剪视频帧的内容

 

内容分为五个部分:①截取视频,②视频分帧(可选),③图片裁剪(可选),④音频提取(可选),⑤gif/mp4生成

需要用到的库有moviepy,imageio,skimage(scikit-image),numpy,PIL,os

 

一.截取视频

直接使用moviepy.editor可以截取视频,还可以改变帧尺寸

import moviepy.editor as mpy

#获取视频内容
clip = mpy.VideoFileClip('ori.mp4')

#按时间划分截取(如下,截取22分25秒到23分55秒的内容)
content = clip.subclip((22,25),(23,55))

#截取视频的同时改变帧大小,改为480x360
#content = clip.subclip((22,25),(23,55)).resize((480, 360))

#将截取的视频写入到新文件保存
content.write_videofile('get.mp4')

如果提示需要ffmpeg.exe

import imageio
imageio.plugins.ffmpeg.download()

 

二.视频分帧

将截取的视频按帧生成图片,如果不需要修改帧(去字幕等),可以跳过

import imageio 
import skimage 
import numpy as np 

#视频的绝对路径 
filename = 'get.mp4'

#使用ffmpeg读取视频内容
reader = imageio.get_reader(filename, 'ffmpeg') 

for i, im in enumerate(reader) :
    #将每一帧转为np.array
    image = skimage.img_as_float(im).astype(np.float64)
    
    #将每一帧写入为新图片
    imageio.imsave(str(i) + '.jpg', image)

 

三.图片裁剪

这里需要你使用其他方式定位你要裁剪下来的图片的区域,找到该区域左上角和右下角的坐标

import os
from PIL import Image

#获取图片列表
pic = os.listdir()

for p in pic :
    
    #若不是要进行操作的图片或是之前已经操作过的图片,则跳过
    if p.split('.')[1] != 'jpg' or p.split('.')[0][-3:] == 'new':
        continue
    
    #打开图片
    img = Image.open(p)
    
    #获取图片尺寸
    width, height = img.size
    
    #图片编号,后面生成新图片要用
    num = int(p.split('.')[0])
    
    #设置自定义的裁剪位置
    if num < 1037 :
        x, y, w, h = 0, 75, 820, 75 + 570
    elif num < 1812 :
        x, y, w, h = width - 820, 75, width, 75 + 570
    else :
        x, y, w, h = 0, 75, 820, 75 + 570 
 
    # 开始截取
    region = img.crop((x, y, w, h))
    
    # 另保存为新图片
    region.save(p.split('.')[0] + "_new.jpg")
    '''
    new = img.crop((x,y,w,h))
    
            x               w
    ---------------------------------
    |       |               |       |
   y|-------A----------------       |
    |       |               |       |
    |       |               |       |
    |       |               |       |
    |       |               |       |
   h|-----------------------B       |
    |                               |
    ---------------------------------
    '''

 

四.音频提取

从截取的视频里提取出音频

下载ffmpeg.exe,这个东西可以用来处理音频视频等,功能强大,这里仅是用来提取音频

官网下载,在get the packages 里按系统选,可以直接下载exe格式的(我是windows)

跳转后按系统要求选择,点download build

下载后在bin文件夹里找到ffmpeg.exe,跟要提取的视频放在同一目录下,使用以下命令:

ffmpeg -i video.mp4(原视频) -vn audio.mp3(提取音频) -vn

然后就会生成一个audio.mp3文件,就是提取出来的音频

 

五.gif/mp4生成

gif的话很简单

1.使用图片生成gif

import os
import imageio

#获取图片列表
pic = [i for i in os.listdir() if i.split('.')[0][-3:] == 'new']

#将图片按编号排序
pic = sorted(pic, key = lambda x : int(x.split('.')[0][:-4]))

#目标gif的文件名
filename = 'fin.gif'

#获取帧列表
frames = [imageio.imread(i) for i in pic]

#将帧合成gif
imageio.mimsave(filename, frames, 'GIF', duration = 1 / 24)

 

2.根据视频生成gif(可以直接截取视频生成gif)

import moviepy.editor as mpy

#获取视频内容
clip = mpy.VideoFileClip('ori.mp4')

#按时间划分截取(如下,截取22分25秒到23分55秒的内容)
content = clip.subclip((22,25),(23,55))

#截取视频的同时改变帧大小,改为480x360
#content = clip.subclip((22,25),(23,55)).resize((480, 360))

#生成gif
content.write_gif('get.gif')

使用图片跟音频生成视频(图片命名格式:编号_new.jpg)

import os
import imageio

from moviepy.editor import *

#获取图片列表
pic = [i for i in os.listdir() if i.split('.')[0][-3:] == 'new']

#将图片按编号排序
pic = sorted(pic, key = lambda x : int(x.split('.')[0][:-4]))

#将图片按帧率(fps)划分,fps可调
clip = ImageSequenceClip(pic, fps = 24)

#使用音频与帧表合成视频
clip.write_videofile('new.mp4', audio = "audio.mp3")

 

总结:使用imageio和moviepy基本可以满足视频操作的需要,特殊需求可以使用ffmpeg作为辅助。PIL可以对图片进行操作,两者相结合就可以自定义的生成动态文件了。

 

参考:

gif制作 : https://blog.csdn.net/Spade_/article/details/79516322

图片切割:https://blog.csdn.net/t8116189520/article/details/80271661

音频提取:https://blog.csdn.net/cjs68/article/details/49993473

相关文章:

  • python-二分法插入排序(Binary Insert Sort)
  • 本地仓库关联Github仓库
  • macos可以升级到指定版本吗_iPhone 越狱后还可以保资料升级系统吗?
  • 2 shell 锂基脂_内蒙古锂基脂润滑油供应商
  • python编程中的不等于符号_python不等于符号怎么写
  • nacos 负载策略_Ribbon负载均衡
  • python文件传输模块_Python爱好者 socket模块传输文件 -
  • 红曲面怎么做_曲面屏是华为手机一大败笔?确实缺点很多,但华为为何钟爱呢?...
  • 高德地图 python面试_【高德地图面试|面试题】-看准网
  • tablayout 滚动模式_scrollview+tablayout实现联动
  • cboard企业版源码_数据可视化BI平台——CBoard的部署与使用(笔记整理)
  • 生活中的算法的实际举例_生活中的算法
  • pyecharts 绘制三维散点图_pyecharts
  • toolbar文本在最右侧_Toolbar中Menu的背景颜色、位置、同时显示文字等设置(亲测)...
  • linux 使用imageio.read 读图片出来为null_经典Linux面试题
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • download使用浅析
  • es6要点
  • FastReport在线报表设计器工作原理
  • Nodejs和JavaWeb协助开发
  • Octave 入门
  • React-生命周期杂记
  • Vue 重置组件到初始状态
  • webpack入门学习手记(二)
  • 基于webpack 的 vue 多页架构
  • 今年的LC3大会没了?
  • 实现菜单下拉伸展折叠效果demo
  • 怎么将电脑中的声音录制成WAV格式
  • Python 之网络式编程
  • zabbix3.2监控linux磁盘IO
  • #if 1...#endif
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (12)Linux 常见的三种进程状态
  • (2020)Java后端开发----(面试题和笔试题)
  • (3)nginx 配置(nginx.conf)
  • (day 12)JavaScript学习笔记(数组3)
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (译)2019年前端性能优化清单 — 下篇
  • (转)Oracle 9i 数据库设计指引全集(1)
  • .NET CORE 第一节 创建基本的 asp.net core
  • .Net core 6.0 升8.0
  • .net wcf memory gates checking failed
  • .net打印*三角形
  • 。Net下Windows服务程序开发疑惑
  • [ IO.File ] FileSystemWatcher
  • [C# 开发技巧]实现属于自己的截图工具
  • [c++] C++多态(虚函数和虚继承)
  • [C++数据结构](31)哈夫曼树,哈夫曼编码与解码
  • [CISCN 2019华东南]Web11
  • [CQOI 2011]动态逆序对
  • [Django ]Django 的数据库操作
  • [Flutter]设置应用包名、名称、版本号、最低支持版本、Icon、启动页以及环境判断、平台判断和打包
  • [IE编程] 打开/关闭IE8的光标浏览模式(Caret Browsing)
  • [Loadrunner参数化]一个文件输两列参数的取值
  • [NOI2005]月下柠檬树[计算几何(simpson)]