前期准备
最近要压缩视频,然后发现一些压缩视频的工具要是收费,要么有水印,完全不符合要求啊。正当我发愁的时候突然想到,去年的时候接触过 ffmpeg ,可以用python ffmpeg 来压缩视频啊,想到就干。最后还给我整成功啦,唯一麻烦点的地方就是 ffmpeg 的安装,其他的都是简简单单。(代码去年就写好了,这次只是整理更新一下下,自然简单)
- python 3
- 需要准备的库:sys、os、platform
- 需要下载的工具:ffmpeg
ffmpeg 是什么
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。
下载地址:http://ffmpeg.org/download.html#build-windows
python 代码展示
# 2020年11月29日12:15:16
# @miss
# 视频压缩程序
# 只为更快更好的压缩视频 不作为商业用途仅供学习参考 miss
# 视频压缩第二版
import sys
import os
import zlib
import threading
import platform
from PIL import Image
# python press.py ./ 12.mp4 23.mp4
# python 文件名 路径 要压缩的文件 压缩之后的文件名
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())
几十行代码轻轻松松压缩视频,还有就是视频名字不能出现中文,要不然会出现 “没有安装ffmpeg的错误” 给大家看一下效果图:
8代 i3
这是压缩时的效果,视频大小是2G,压缩时间有点长
出现上面的图片就是结束啦,看看最后的效果吧
压缩前后对比:
整体来讲,压缩的有点狠,但是对于这种录屏的视频来说,最后的感觉都差不多
这是压缩前的视频效果
这是压缩后的视频效果:
简而言之,这个压缩效果杠杠的,还没有水印。用来压缩视频,是一个很不错的选择,Python yyds!!就分享到这里啦,有需要的朋友赶紧行动起来吧。