如何实现视频剪辑转换工作

发布于:2025-08-04 ⋅ 阅读:(16) ⋅ 点赞:(0)

      大家在做各种演示材料时,经常需要将一些录制的视频转换为几个片段,或者转换为更小的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.模板可定制化的深度有限


网站公告

今日签到

点亮在社区的每一天
去签到