大家在做各种演示材料时,经常需要将一些录制的视频转换为几个片段,或者转换为更小的gif图,如何实现呢,一般需要安装一个商业软件工具,但这些工具大部分都需要收费,或者制作出的视频有该软件的痕迹(如logo等),另一种方法就是利用python编写工具。本文就是结合常见的python图像视频处理库,实现视频剪辑或格式转换等等。具体如下,供大家参考。
一、基于视频图像库研发视频剪辑转换工具
目前主要有三种方式:imageio、moviepy和ffmpeg。基于上述库实现视频文件的剪辑,包括剪切视频文件的几个片段,拼接成一个完整视频,或者将视频转换为gif文件。详见mp4_gif.py文件,代码如下。
# 方式1.利用imageio和skimage进行视频文件剪辑,速度慢
import imageio
from skimage.transform import resize # pip install scikit-image
def video_to_gif(video_path,gif_path):
reader = imageio.get_reader(video_path)
fps = reader.get_meta_data()['fps'] # 原视频帧率
frames = []
max_frames = int(20 * fps) # 只取前 10 秒
for i, frame in enumerate(reader):
if i >= max_frames:
break
# 等比缩到 320px 宽
frame = resize(frame, (int(frame.shape[0]*320/frame.shape[1]), 320))
frames.append((frame*255).astype('uint8'))
# 使用高级 pillow 写 GIF,调色板 256 色
imageio.mimsave(gif_path, frames, fps=20, loop=0,
palettesize=256, subrectangles=True)
video_path =r"C:\2025-07\chrome_5a3mLEINqj.mp4" # 视频文件路径
gif1_path = r"C:\2025-07\chrome_5a3mLEINqj.gif" # 输出gif文件路径
# 执行转换mp4-->gif
video_to_gif(video_path,gif1_path)
print("转换完成的GIF已保存到:", gif1_path)
# 方式2.利用moviepy进行视频文件剪辑,以及视频文件转换为gif文件,交互性和效率最高,目前的最好方式
from moviepy.editor import *
# 视频剪辑拼接和格式转换函数
def video_to_audio(video_path, audio_path,gif_path):
clip = VideoFileClip(video_path)
# 截取前 5 秒,分辨率缩到 90%,帧率 10 fps # clip.subclip(0, 5).resize(0.9).write_gif(gif1_path, fps=10) # 输出gif
# clip.subclip(0, 7).write_videofile(gif1_path, codec="libx264") # 输出mp4
# 分段拆解
clip1 = VideoFileClip(video_path).subclip(0, 7) # 截取前 0-6 秒
clip2 = VideoFileClip(video_path).subclip(12, 17) # 截取前 12-16 秒
clip3 = VideoFileClip(video_path).subclip(21, 29) # 截取前 21-28 秒
# 拼接视频
final_clip = concatenate_videoclips([clip1, clip2, clip3])
final_clip.write_videofile(audio_path) # 输出视频文件
final_clip.resize(0.3).write_gif(gif_path, fps=6,fuzz=10,loop=0) # 输出gif文件,loop=0表示无限循环
# 逐帧处理,反转视频每一帧的绿色和蓝色通道
def scroll(get_frame, t):
"""
处理每一帧图像
""" frame = get_frame(t)
frame_region = frame[:, :, [0, 2, 1]]
return frame_region
video_path =r"C:\2025-07\chrome_5a3mLEINqj.mp4" # 视频文件路径
clip_path = r"C:\2025-07\Clip_1753348732912-2.mp4" # 片段视频文件路径
gif_path = r"C:\2025-07\Gif_1753348732912-2.gif" # 输出gif文件路径
clip2_path = r"C:\2025-07\Clip_1753348732912-22.mp4" # 片段视频文件路径
# 执行转换
video_to_audio(video_path, clip_path,gif_path)
print("剪辑完成的视频已保存到:", clip_path)
# 逐帧处理视频文件
my_clip =VideoFileClip(video_path)
modifiedClip = my_clip.fl(scroll)
modifiedClip.write_videofile(clip2_path)
print("反转视频已完成,保存到:", clip2_path)
# 方式3.利用os和ffmepg进行视频文件剪辑,以及视频文件转换为gif文件
import subprocess, os
# 视频转gif
def video_to_gif(src, dst, start=0, dur=3):
"""
使用 ffmpeg命令将视频转换为 GIF 注意:-ss必须在-i参数之前,否则会出现转换时间不对
""" cmd = [
'ffmpeg', '-ss', str(start), '-t', str(dur),'-i', src,
'-vf', 'fps=10,scale=500:-1:flags=lanczos',
'-y', dst
# '-c', 'copy', dst
]
subprocess.run(cmd)
# 视频拆解为小片段
def video_to_clip(src, dst, start=0, dur=3):
"""
使用 ffmpeg命令将视频转换为 GIF 注意:-ss必须在-i之前,否则会出现转换时间不对
""" cmd = [
'ffmpeg', '-ss', str(start), '-t', str(dur),'-i', src,
# '-vf', 'fps=10,scale=500:-1:flags=lanczos',
]
subprocess.run(cmd)
# 小片段视频合并
def clip_merge(clip_filelist, dst_file):
"""
使用 ffmpeg命令将多个视频片段合并为一个视频
"""
cmd = [
'ffmpeg', '-f', 'concat', '-safe', '0', '-i', str(clip_filelist),
'-c', 'copy', dst_file
]
subprocess.run(cmd)
# 视频文件路径
video_path = r"C:\2025-07\chrome_5a3mLEINqj.mp4" # 视频文件路径
clip1_path = r"C:\2025-07\clip1.mp4" # 片段视频文件路径
clip2_path = r"C:\2025-07\clip2.mp4" # 片段视频文件路径
clip3_path = r"C:\2025-07\clip3.mp4" # 片段视频文件路径
gif_path = r"C:\2025-07\output.gif" # 输出gif文件路径
out_path = r"C:\2025-07\output_merge.mp4" # 输出gif文件路径
filelist = r"C:\2025-07\filelist.txt"
# 执行转换
# video_to_gif(video_path, gif_path,start=0,dur=7) # 原始视频文件的前7秒转换为gif文件
video_to_clip(video_path, clip1_path,start=0,dur=7) # clip1.mp4:前7秒的视频文件
video_to_clip(video_path, clip2_path,start=12,dur=4) # clip2.mp4:12-16的视频文件
video_to_clip(video_path, clip3_path,start=21,dur=6) # clip3.mp4:21-27的视频文件
print("转换完成的GIF已保存到:", gif_path)
# 命令行:ffmpeg -f concat -safe 0 -i filelist.txt -c copy output_merge.mp4
# 拼接方式如下
clip_merge(filelist, out_path) # 将三个片段视频文件合并为一个视频文件
print("视频拼接完成:", out_path)
二、商业化的视频剪辑软件工具分析推荐
剪映,畅片,快剪影,AE,iMovie,DaVinci Resolve等等。主要优缺点如下。对于一般用户来说,推荐用剪映,对于高级玩家,推荐用AE,Mac电脑用户推荐用iMovie。
优点
1.插件比较丰富,支持自动字幕,音频降噪等
2.支持剪辑/调色和特效等
3.上手快,傻瓜化,支持模板/字幕和音乐一键合成
缺点
1.大部分都要收费
2.电脑配置要求高
3.模板可定制化的深度有限