python38讲交作业-调用ffmpeg视频压缩
"""调用ffmpeg实现转码
ffmpeg 开源地址
https://github.com/FFmpeg/FFmpeg
作者:法布里斯贝拉(FabriceBellard)
GDH
"""
import re
import os
# 列表化输入输出路径
def listmp4list(paths):
input_mp4 = []
output_mp4 = []
pattern = re.compile("mp4$",re.I)#查找mp4的正则表达式,不区分大小写
for path in paths:
#判断输入是否为文件
if os.path.isfile(path):
if pattern.search(path) != None:
input_mp4.append(path)
output_mp4.append(path)
#判断输入是否为目录
if os.path.isdir(path):
file_path = list(os.walk(path))#文件路径列表化
for root, dirs, files in file_path:
for mp4 in files:
if pattern.search(mp4) != None:#判断文件是否是MP4文件
input_mp4.append(os.path.join(root,mp4))#输入路径合并
output_mp4.append(os.path.join(path,mp4))#输出路径合并
return list(zip(input_mp4,output_mp4))#返回输入输出
# 带anscode_v参数的转码
def tanscode(mp4,code):
flow = " -map 0:0 -map 0:1 -map 0:2"#流通道
time = " -ss 100 -t 20"#时间参数-开始时间,持续时间
video = " -vcodec h264_nvenc -b:v 2000k -r 30 -s 1280x720"#视频参数
audio = " -acodec aac -b:a 128k -r:a 48000 -ac 2"#音频参数
wm = " -vf drawtext=fontfile=.//font//msyh.ttc:fontsize=100:fontcolor=yellow@0.5:text=水印:alpha=0.3"#水印-字体,大小,颜色,内容,透明度
lg = " -vf movie=.//logo//logo.png,scale=-1:50,lut=c3=val*0.7;overlay="#logo,logo尺寸大小,透明度,叠加
static = ":x=if(eq(mod(n\,100)\,0)\,rand(0\,(W-tw))\,x):y=if(eq(mod(n\,100)\,0)\,rand(0\,(H-th))\,y)"#固定间隔随机位置
move = ":x=abs(sin(n/500))*(W):y=abs(sin(n/50))*(H)"#正弦连续位置
#合并代码
def out_codes(mp4,code_v,code):
out_code = []#输出列表
for each in mp4:
out_code.append(".\\ffmpeg" + " -i \"" +each + "\" " + code_v + " \"" + each[:-4] + "_"+ code + ".mp4" + "\"")
return out_code
# 判断是否开启测试
if code[-1] == "0":
video = video + time
if code == "1":
code_v = video + audio
elif code == "2":
code_v = flow + video + audio
elif code == "3":
code_v = video + audio + wm + static
elif code == "4":
code_v = video + audio + lg + move
return out_codes(mp4, code_v, code)
if __name__ == "__main__":
paths = input("请输入视频文件夹:").split()#列表化用户输入
# 判断用户输入是否带有转码参数
if len(paths[-1]) <= 2:# 用户输入最后带参数
tanscode_v = paths.pop()# 路径列表弹出参数
else:
tanscode_v = "2" # 用户输入不带参数则赋值默认值2
mp4 = listmp4list(paths)
code = tanscode(mp4, tanscode_v)
for mp4 in code:
print(mp4)
if tanscode_v[-1]!=".":
os.system(mp4)
代码功能:将路径下的所有MP4,或者指定的mp4文件压缩成720P 2000K的mp4视频。
水印功能需要在代码目录下建立Font文件夹里面放入指定的字体
logo功能需要在代码目录下建立Logo文件夹里面放入logo.png图片
开启水印、logo、多音轨转码需要在最后加参数
1:单音轨压缩,2:2音轨压缩,3:加水印压缩,4:加logo压缩
参数后面追加0是20秒压缩,用来测试视频是否正常被压缩了,追加.不执行压缩,只打印代码,方便自己参看
运行后
可以接受多个路径或者多个MP4文件,最后一个参数是选择参数
需要下载ffmpge.exe放到代码录下
页:
[1]