鱼C论坛

 找回密码
 立即注册
查看: 1281|回复: 1

[原创] python38讲交作业-调用ffmpeg视频压缩

[复制链接]
发表于 2022-4-30 16:42:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
"""
调用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[logo];[in][logo]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[0] + "\" " + code_v + " \"" + each[1][:-4] + "_"+ code + ".mp4" + "\"")
        return out_code
    # 判断是否开启测试
    if code[-1] == "0":
        video = video + time
    if code[0] == "1":
        code_v = video + audio
    elif code[0] == "2":
        code_v = flow + video + audio
    elif code[0] == "3":
        code_v = video + audio + wm + static
    elif code[0] == "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)
        

            
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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放到代码录下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 09:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表