py 视频转码

需要你电脑本身安装的有FFmpeg,你下载的压缩包形式的话,记得把里面的bin路径加入到电脑环境变量里,不然无法识别

功能:

在视频同目录下转码成mp4文件

# 指定要搜索的目录路径
输入文件路径 = r‘E:\阿里云盘下载\Oracle合集\ORACLE视频教学’
import subprocess,os,json

def ffprobe_get_info(输入文件路径):
    """使用ffprobe获取视频文件的元数据信息"""
    try:
        probe = subprocess.run(['ffprobe', '-v', 'error', '-show_entries', 'format=duration,size:stream=width,height,avg_frame_rate', '-of', 'json', 输入文件路径], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        if probe.returncode != 0:
            print(f"ffprobe error: {probe.stderr.decode()}")
            return None
        return json.loads(probe.stdout)
    except Exception as e:
        print(f"An error occurred: {e}")
        return None

def 自动转码视频(输入文件路径, 输出文件路径):
    """使用ffprobe和ffmpeg自动转码视频"""
    video_info = ffprobe_get_info(输入文件路径)

    # 寻找第一个具有有效宽度和高度信息的流
    for stream in video_info['streams']:
        if 'width' in stream and 'height' in stream:
            width = stream['width']
            height = stream['height']
            fps = stream['avg_frame_rate'].split('/')[0]
            break
    else:
        print('未找到有效的视频流')
        return False  # 如果没有找到有效的流,则返回False

    duration = float(video_info['format']['duration'])

    # 计算视频比特率,这里假设为文件大小的85%,您可以根据需要调整
    file_size = os.path.getsize(输入文件路径)
    video_bitrate = int(0.85 * (file_size * 8 / duration))

    # 构建FFmpeg转码命令
    ffmpeg命令 = [
        'ffmpeg',
        '-err_detect', 'ignore_err',  # 添加错误容错选项
        '-i', 输入文件路径,
        '-vcodec', 'h264',
        '-acodec', 'aac',
        '-strict', 'experimental',
        '-movflags', '+faststart',
        '-b:v', f'{video_bitrate}k',
        '-vf', f"scale=-2:{height}",  # 使用height变量
        '-b:a', '128k',
        '-ac', '2',
        '-r', fps,
    ] + [输出文件路径]  # 将输出文件路径添加到命令列表中

    # 运行FFmpeg命令
    try:
        subprocess.run(ffmpeg命令, check=True)
        print('视频转码成功')
        return True
    except subprocess.CalledProcessError:
        print('视频转码失败')
        return False


# 获取指定文件夹所有非mp4文件绝对路径
def 获取所有非mp4文件路径(目录路径, 视频格式列表):
    非mp4文件列表 = []
    # 排除 'mp4' 格式
    非mp4格式列表 = [格式 for 格式 in 视频格式列表 if 格式 != 'mp4']
    # 遍历目录
    for root, dirs, files in os.walk(目录路径):
        for 文件名 in files:
            文件扩展名 = 文件名.lower().rsplit('.', 1)[-1]  # 获取文件扩展名
            if 文件扩展名 in 非mp4格式列表:
                非mp4文件列表.append(os.path.join(root, 文件名))
    return 非mp4文件列表

# 定义支持的视频格式列表
video_formats = [
    'rmvb','avi', 'mov', 'wmv', 'flv', 'mkv', 'rm',
    'asf', 'mpg', '3gp', 'vob', 'm4v', 'f4v', 'webm',
    'm2ts', 'ts', 'divx', 'xvid', 'mxf'
]

# 指定要搜索的目录路径
输入文件路径 = r'E:\阿里云盘下载\Oracle合集\ORACLE视频教学'

# 获取所有非mp4格式的视频文件路径
所有非mp4文件路径列表 = 获取所有非mp4文件路径(输入文件路径, video_formats)

# 对每个非mp4格式的视频文件执行转码操作
for 单个非mp4文件路径 in 所有非mp4文件路径列表:
    try:
        # 构造新的mp4文件路径
        输出文件路径 = os.path.splitext(单个非mp4文件路径)[0] + '.mp4'
        print(单个非mp4文件路径)
        print(输出文件路径)
        # 执行转码操作
        自动转码视频(单个非mp4文件路径, 输出文件路径)
        # 如果转码成功,删除原始文件
        # os.remove(单个非mp4文件路径)
        print(f"原始文件已转码完成: {单个非mp4文件路径}")
        # print(f"已删除原始文件: {单个非mp4文件路径}")
    except Exception as e:
        print(f"处理文件 {单个非mp4文件路径} 时发生错误: {e}")

 

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注