以下是对代码的优化建议:

  1. 使用列表解析式代替循环添加视频文件到列表的方式。这样可以更加简洁地实现功能。

  2. 使用内置的humanize库代替手动实现文件大小单位换算。这样可以减少代码量,并且避免错误。

  3. 将mediainfo命令的参数字符串提取出来,避免重复代码。这样可以更加清晰地实现功能。

  4. 使用str.format()方法代替f-string格式化字符串。这样可以提高代码的可读性。

  5. 将程序的主要逻辑封装在一个函数中,避免全局变量的使用。

下面是优化后的代码:

import os import re import subprocess import math from humanize import naturalsize

视频格式

supported_formats = [ '.mp4', '.avi', '.mkv', '.wmv', '.mov', '.flv', '.m2ts', '.ts', '.rm', '.rmvb', '.vob', '.3gp', '.webm', '.hdmov', '.mp4v', '.mpv4', '.divx', '.xvid', '.f4v', '.mpeg', '.asf', '.asx', '.m2t' ]

正则表达式匹配码率数据中的空格

pattern = re.compile(r'(\d+)\s+(\d+)')

def get_video_info(video_file): # 获取文件名 file_name = os.path.basename(video_file)

# 获取文件大小并进行单位换算
size_str = naturalsize(os.path.getsize(video_file))

# 使用mediainfo获取视频信息 / 音频信息
video_params = '--Inform=Video;%Format%|%Width%x%Height%|%BitRate/String%|%FrameRate%|%Duration/String3%'
video_result = subprocess.run(['mediainfo', video_params, video_file], stdout=subprocess.PIPE)
video_info = video_result.stdout.decode().strip().split('|')

audio_params = '--Inform=Audio;%BitRate/String%|%SamplingRate/String%|%Language/String%'
audio_result = subprocess.run(['mediainfo', audio_params, video_file], stdout=subprocess.PIPE)
audio_info = audio_result.stdout.decode().strip().split('|')

# 解析输出结果
# 处理多音轨情况
audio_bitrate = []
audio_sampling_rate = []
audio_lang = []
for i in range(len(audio_info) // 3):
    audio_bitrate.append(audio_info[i * 3])
    audio_sampling_rate.append(audio_info[i * 3 + 1])
    audio_lang.append(audio_info[i * 3 + 2])

# 时长取整
duration = video_info[4].split('.')[0]
h, m, s = duration.split(':')
duration = f'{h}:{m}:{str(s).zfill(2)}'

# 以分钟计算的时长
duration_minutes = int(h) * 60 + int(m) + math.ceil(float(s)) / 60

# 计算压缩比率
ratio = round(duration_minutes / os.path.getsize(video_file) * 1000000000, 2)

# 使用正则表达式替换码率数据中第一个数字和第二个数字之间的空格
bitrate = re.sub(pattern, r'\1\2', video_info[2])

# 返回视频信息
return {
    'file_name': file_name,
    'size_str': size_str,
    'duration': duration,
    'video_resolution': video_info[1],
    'video_bitrate': bitrate,
    'video_framerate': video_info[3],
    'audio_lang': "/".join(audio_lang),
    'ratio': ratio
}

def main(): # 视频文件夹 video_folder = '/home/115/up'

# 获取视频文件列表(包括子目录)
video_files = [os.path.join(root, file) for root, dirs, files in os.walk(video_folder) for file in files 
               if any(file.endswith(format) for format in supported_formats)]

# 遍历所有视频文件
for video_file in video_files:
    video_info = get_video_info(video_file)
    # 打印文件信息
    print("{file_name}, {size_str}, {duration}, {video_resolution}, {video_bitrate}, {video_framerate}, {audio_lang}, {ratio}".format(**video_info))

if name == 'main': main()

对下面的python3代码进行优化import osimport reimport subprocessimport math# 视频格式supported_formats = mp4 avi mkv wmv mov flv m2ts ts rm rmvb vob 3gp webm hdmov mp4v mpv4 divx xvid f4v mpeg asf asx

原文地址: https://www.cveoy.top/t/topic/bfUg 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录