降智警告:本人为编程新手,遵守面向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