以下是对代码进行的优化:/n/n1. 使用列表推导式来获取视频文件列表,避免使用循环和条件语句。同时使用os.path.splitext函数来获取文件名和扩展名,避免使用循环判断文件格式。/n/n2. 使用f字符串的格式化来简化文件大小的单位换算。/n/n3. 将mediainfo命令的参数放在列表中,并使用subprocess.PIPE来捕获输出,避免使用shell=True和字符串拼接的方式。/n/n4. 将视频信息的键值对存储在字典中,避免使用列表索引来获取信息。/n/n5. 使用try-except语句来处理无法转换为浮点数的帧率信息。/n/n6. 将多音轨信息的处理放在一个函数中,并使用列表推导式来简化代码。/n/n7. 将时长转换为分钟的计算放在一个函数中。/n/n8. 将压缩比率的计算放在一个函数中,并使用科学计数法来表示。/n/n9. 使用re.sub函数来替换码率数据中的空格,避免使用正则表达式的编译和匹配。/n/n10. 将文件信息的打印放在一个函数中,并使用可变参数来简化代码。/n/n优化后的代码如下:/n/n/nimport os/nimport re/nimport subprocess/nimport math/n/n# 视频格式/nsupported_formats = ['.mp4', '.avi', '.mkv', '.wmv', '.mov', '.flv', '.m2ts', '.ts', '.rm', '.rmvb',/n '.vob', '.3gp', '.webm', '.hdmov', '.mp4v', '.mpv4', '.divx', '.xvid', '.f4v',/n '.mpeg', '.asf', '.asx', '.m2t']/n# 视频文件夹/nvideo_folder = '/home/115/up'/n# 正则表达式匹配码率数据中的空格/npattern = re.compile(r'(/d+)/s+(/d+)')/n/ndef get_video_files(folder):/n return [os.path.join(root, file) for root, dirs, files in os.walk(folder) for file in files if os.path.splitext(file)[1] in supported_formats]/n/ndef format_size(size):/n units = ['B', 'KiB', 'MiB', 'GiB']/n idx = 0/n while size >= 1024 and idx < len(units)-1:/n size /= 1024/n idx += 1/n return f'{size:.2f} {units[idx]}'/n/ndef get_video_info(video_file):/n cmd = ['mediainfo', '--Inform=Video;%Format%|%Width%x%Height%|%BitRate/String%|%FrameRate%|%Duration/String3%', video_file]/n result = subprocess.run(cmd, stdout=subprocess.PIPE)/n output = result.stdout.decode().strip()/n info = {}/n for line in output.split('/n'):/n key, value = line.split('|')/n info[key] = value/n cmd = ['mediainfo', '--Inform=Audio;%BitRate/String%|%SamplingRate/String%|%Language/String%', video_file]/n result = subprocess.run(cmd, stdout=subprocess.PIPE)/n output = result.stdout.decode().strip()/n info['audio'] = get_audio_info(output)/n return info/n/ndef get_audio_info(output):/n info = []/n for line in output.split('/n'):/n bitrate, sampling_rate, lang = line.split('|')/n info.append({'bitrate': bitrate, 'sampling_rate': sampling_rate, 'lang': lang})/n return info/n/ndef format_duration(duration):/n h, m, s = duration.split(':')/n duration = f'{h}:{m}:{str(s).zfill(2)}'/n return duration/n/ndef convert_to_minutes(duration):/n h, m, s = map(int, duration.split(':'))/n return h * 60 + m + math.ceil(s) / 60/n/ndef calculate_ratio(duration, size):/n minutes = convert_to_minutes(duration)/n ratio = round(minutes / size * 1000000000, 2)/n return f'{ratio:.2e}'/n/ndef format_file_info(file_name, size, duration, width_height, bitrate, framerate, *audio_lang):/n print(f'{file_name}, {format_size(size)}, {format_duration(duration)}, {width_height}, {bitrate}, {framerate}, {' / '.join(audio_lang)}, {calculate_ratio(duration, size)}')/n/n# 获取视频文件列表(包括子目录)/nvideo_files = get_video_files(video_folder)/n/n# 遍历所有视频文件并输出信息/nfor video_file in video_files:/n info = get_video_info(video_file)/n format_file_info(os.path.basename(video_file), os.path.getsize(video_file), info['Duration'], info['Width'] + 'x' + info['Height'], re.sub(pattern, r'/1/2', info['BitRate']), info.get('FrameRate'), *[audio['lang'] for audio in info['audio']])/n

Python 视频文件信息提取优化:提高效率和可读性

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

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