Lai013 发表于 2022-4-30 16:42:33

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)
      

            

Lai013 发表于 2022-4-30 17:03:03

代码功能:将路径下的所有MP4,或者指定的mp4文件压缩成720P 2000K的mp4视频。
水印功能需要在代码目录下建立Font文件夹里面放入指定的字体
logo功能需要在代码目录下建立Logo文件夹里面放入logo.png图片
开启水印、logo、多音轨转码需要在最后加参数
1:单音轨压缩,2:2音轨压缩,3:加水印压缩,4:加logo压缩
参数后面追加0是20秒压缩,用来测试视频是否正常被压缩了,追加.不执行压缩,只打印代码,方便自己参看
运行后
可以接受多个路径或者多个MP4文件,最后一个参数是选择参数
需要下载ffmpge.exe放到代码录下
页: [1]
查看完整版本: python38讲交作业-调用ffmpeg视频压缩