python实现视频压缩功能


Posted in Python onDecember 18, 2020

引言

实现一个视频压缩的功能,
性能优良 压缩视频 从61M 到 11M或者80M到15M
视频看起来没有太大损伤
缺点:耗时20s (win10,CPU:intel i7 8G运存 )

python实现视频压缩功能

由于压缩运算需要占用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 ,把这个文件名替换成自己的,

D:\yasuoship 替换成要压缩的视频的文件夹的绝对路径

test.avi  压缩的视频的文件名

test1.avi  压缩后的文件名 , 和要压缩的文件在同一目录下

python实现视频压缩功能

后续我还会再走一个牺牲图像大小啊 质量啊换取速度和大小的版本

最后贴出参考:
https://blog.csdn.net/a849992683/article/details/90030326

Python 相关文章推荐
django model去掉unique_together报错的解决方案
Oct 18 Python
python中WSGI是什么,Python应用WSGI详解
Nov 24 Python
Python下调用Linux的Shell命令的方法
Jun 12 Python
Flask框架实现给视图函数增加装饰器操作示例
Jul 16 Python
python实现周期方波信号频谱图
Jul 21 Python
linux中如何使用python3获取ip地址
Jul 15 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
Dec 23 Python
简单了解Python write writelines区别
Feb 27 Python
python中怎么表示空值
Jun 19 Python
Django rest framework分页接口实现原理解析
Aug 21 Python
图解Python中深浅copy(通俗易懂)
Sep 03 Python
python 用opencv实现霍夫线变换
Nov 27 Python
MoviePy常用剪辑类及Python视频剪辑自动化
Dec 18 #Python
python 实现全球IP归属地查询工具
Dec 18 #Python
MoviePy简介及Python视频剪辑自动化
Dec 18 #Python
Python非单向递归函数如何返回全部结果
Dec 18 #Python
python复合条件下的字典排序
Dec 18 #Python
python 监控服务器是否有人远程登录(详细思路+代码)
Dec 18 #Python
细说NumPy数组的四种乘法的使用
Dec 18 #Python
You might like
PHP+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
2007/02/15 PHP
php结合飞信 免费天气预报短信
2009/05/07 PHP
让PHP以ROOT权限执行系统命令的方法
2011/02/10 PHP
PHP源代码数组统计count分析
2011/08/02 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
PHP如何使用Memcached
2016/04/05 PHP
php结合md5的加密解密算法实例
2016/09/30 PHP
关于JS字符串函数String.replace()
2013/04/07 Javascript
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
2013/06/24 Javascript
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
2014/09/26 NodeJs
Jquery promise实现一张一张加载图片
2015/11/13 Javascript
JS实现表单验证功能(验证手机号是否存在,验证码倒计时)
2016/10/11 Javascript
canvas滤镜效果实现代码
2017/02/06 Javascript
原生js仿淘宝网商品放大镜效果
2017/02/28 Javascript
JS实现获取进今年第几天是周几的方法分析
2018/06/27 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
2019/06/04 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
2019/08/08 jQuery
Vue 如何使用props、emit实现自定义双向绑定的实现
2020/06/05 Javascript
vscode 调试 node.js的方法步骤
2020/09/15 Javascript
深入理解Python 关于supper 的 用法和原理
2018/02/28 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
python搜索包的路径的实现方法
2019/07/19 Python
Python 元组拆包示例(Tuple Unpacking)
2019/12/24 Python
tensorboard实现同时显示训练曲线和测试曲线
2020/01/21 Python
Python try except else使用详解
2021/01/12 Python
Java的五个基础面试题
2016/02/26 面试题
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
高中毕业自我鉴定范文
2013/10/02 职场文书
师范教师毕业鉴定
2014/01/13 职场文书
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
物流仓管员岗位职责
2015/04/01 职场文书
2016年师德师风学习心得体会
2016/01/12 职场文书
.Net Core导入千万级数据至Mysql的步骤
2021/05/24 MySQL
nginx实现动静分离的方法示例
2021/11/07 Servers