Python实现高性能视频压缩工具:从61M降至11M

半杯拿铁
半杯拿铁
发布时间:2026-10-15 | 5人浏览过
原创

本文介绍一个基于Python的视频压缩实现方案,通过调用FFmpeg实现从61M到11M的高压缩比转换,且视觉损伤极小。文章详细说明了代码结构、启动方式及参数配置,适用于Windows环境下对视频文件进行高效压缩处理,尽管耗时约20秒,但平衡了性能与质量。

引言

本方案旨在实现一个高效的视频压缩功能,核心优势在于性能优异:可将61M的视频压缩至11M,或将80M压缩至15M,且在视觉上几乎看不出明显损伤。主要缺点是在Windows 10系统(配置Intel i7处理器,8G内存)下,处理耗时约为20秒。


由于视频压缩运算高度依赖CPU资源,时间效率与压缩性能往往难以兼得。这是经过多次测试后个人较为满意的一个版本,特此记录分享。

接下来直接展示核心代码实现。

视频压缩模块代码


# 视频压缩第二版
import sys
import os
import zlib
import threading
import platform
from PIL import Image

class Compress_Pic_or_Video(object):
  def __init__(self,filePath,inputName,outName=""):
    self.filePath = filePath #文件地址
    self.inputName = inputName #输入的文件名字
    self.outName = outName #输出的文件名字
    self.system_ = platform.platform().split("-",1)[0]
    if self.system_ == "Windows":
      self.filePath = (self.filePath + "\\") if self.filePath.rsplit("\\",1)[-1] else self.filePath
    elif self.system_ == "Linux":
      self.filePath = (self.filePath + "/") if self.filePath.rsplit("/",1)[-1] else self.filePath
    self.fileInputPath = self.filePath + inputName
    self.fileOutPath = self.filePath + outName

  @property
  def is_video(self):
    videoSuffixSet = {"WMV","ASF","ASX","RM","RMVB","MP4","3GP","MOV","M4V","AVI","DAT","MKV","FIV","VOB"}
    suffix = self.fileInputPath.rsplit(".",1)[-1].upper()
    if suffix in videoSuffixSet:
      return True
    else:
      return False

  def SaveVideo(self):
    fpsize = os.path.getsize(self.fileInputPath) / 1024
    if fpsize >= 150.0: #大于150KB的视频需要压缩
      if self.outName:
        compress = "ffmpeg -i {} -r 10 -pix_fmt yuv420p -vcodec libx264 -preset veryslow -profile:v baseline -crf 23 -acodec aac -b:a 32k -strict -5 {}".format(self.fileInputPath,self.fileOutPath)
        isRun = os.system(compress)
      else:
        compress = "ffmpeg -i {} -r 10 -pix_fmt yuv420p -vcodec libx264 -preset veryslow -profile:v baseline -crf 23 -acodec aac -b:a 32k -strict -5 {}".format(self.fileInputPath, self.fileInputPath)
        isRun = os.system(compress)
      if isRun != 0:
        return (isRun,"没有安装ffmpeg")
      return True
    else:
      return True

  def Compress_Video(self):
    # 异步保存打开下面的代码,注释同步保存的代码
    thr = threading.Thread(target=self.SaveVideo)
    thr.start()
    #下面为同步代码
    # fpsize = os.path.getsize(self.fileInputPath) / 1024
    # if fpsize >= 150.0: # 大于150KB的视频需要压缩
    #   compress = "ffmpeg -i {} -r 10 -pix_fmt yuv420p -vcodec libx264 -preset veryslow -profile:v baseline -crf 23 -acodec aac -b:a 32k -strict -5 {}".format(
    #     self.fileInputPath, self.fileOutPath)
    #   isRun = os.system(compress)
    #   if isRun != 0:
    #     return (isRun, "没有安装ffmpeg")
    #   return True
    # else:
    #   return True

if __name__ == "__main__":
  b = sys.argv[1:]	#测试压缩
  savevideo = Compress_Pic_or_Video(b[0],b[1],b[2])
  print(savevideo.Compress_Video())
# 这一版性能优良 压缩 从61M 到 11M 视频看起来没有太大损伤 缺点:inteli7 8G运存 耗时20s

启动与运行方式

在包含上述.py文件的目录下,按住Shift键并点击鼠标右键,选择“在此处打开PowerShell窗口”或“在此处打开命令提示符”,然后运行以下命令:


python shipinyasuo-2.py D:\yasuoship test.avi test1.avi

请将示例中的文件名“shipinyasuo-2.py”替换为你实际使用的Python脚本文件名。

将“D:\yasuoship”替换为你需要压缩的视频文件所在的文件夹绝对路径。

“test.avi”指定为待压缩的源视频文件名。

“test1.avi”指定为压缩后输出的视频文件名,该文件将生成在与源文件相同的目录下。

未来计划推出另一个版本,该版本将通过牺牲图像大小和质量来换取更快的处理速度和更小的文件体积。

最后附上参考链接:https://blog.csdn.net/a849992683/article/details/90030326

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表