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

  1. 使用列表推导式来筛选视频文件,可以减少代码行数并提高效率。

  2. 使用 os.path.splitext() 方法获取文件后缀名,而不是手动遍历所有支持的视频格式。

  3. 使用 f-strings 来格式化字符串,而不是使用字符串连接符号。

  4. 将获取文件大小的代码封装成一个函数。

  5. 将获取视频信息和音频信息的代码封装成一个函数。

  6. 使用字典来存储视频信息和音频信息,而不是使用列表。

  7. 使用 try-except 来捕获可能出现的异常。

  8. 将获取帧率的代码封装成一个函数,并在其中处理可能出现的异常。

  9. 使用 enumerate() 函数来遍历列表并同时获取元素和下标。

  10. 将处理多音轨的代码封装成一个函数。

  11. 使用 format() 方法来格式化字符串,而不是使用字符串插值。

  12. 使用 if name == 'main': 来将代码封装成一个可执行的模块。

下面是优化后的代码:

import os import re import subprocess import 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', '.m2t']

VIDEO_FOLDER = '/home/115/up'

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

def get_file_size(file_path): size = os.path.getsize(file_path) if size < 1024: return f'{size} B' elif size < 1024 * 1024: return f'{size / 1024:.2f} KiB' elif size < 1024 * 1024 * 1024: return f'{size / 1024 / 1024:.2f} MiB' else: return f'{size / 1024 / 1024 / 1024:.2f} GiB'

def get_video_info(file_path): result = subprocess.run(['mediainfo', '--Inform=Video;%Format%|%Width%x%Height%|%BitRate/String%|%FrameRate%|%Duration/String3%', file_path], stdout=subprocess.PIPE) output = result.stdout.decode().strip() info = output.split('|') return {'format': info[0], 'resolution': info[1], 'bitrate': re.sub(PATTERN, r'\1\2', info[2]), 'framerate': info[3], 'duration': info[4].split('.')[0]}

def get_audio_info(file_path): result = subprocess.run(['mediainfo', '--Inform=Audio;%BitRate/String%|%SamplingRate/String%|%Language/String%', file_path], stdout=subprocess.PIPE) output = result.stdout.decode().strip() info = output.split('|') audio_info = [] for i in range(len(info) // 3): audio_info.append({'bitrate': info[i * 3], 'sampling_rate': info[i * 3 + 1], 'lang': info[i * 3 + 2]}) return audio_info

def get_framerate(video_info): try: return float(video_info['framerate']) except ValueError: return None

def process_audio(audio_info): bitrates = [] sampling_rates = [] langs = [] for i, audio in enumerate(audio_info): bitrates.append(audio['bitrate']) sampling_rates.append(audio['sampling_rate']) langs.append(audio['lang']) return '/'.join(langs), bitrates, sampling_rates

def main(): video_files = [os.path.join(root, file) for root, _, files in os.walk(VIDEO_FOLDER) for file in files if os.path.splitext(file)[1] in SUPPORTED_FORMATS] for video_file in video_files: file_name = os.path.basename(video_file) size_str = get_file_size(video_file) video_info = get_video_info(video_file) audio_info = get_audio_info(video_file) framerate = get_framerate(video_info) audio_lang, audio_bitrate, audio_sampling_rate = process_audio(audio_info) duration = video_info['duration'] h, m, s = duration.split(':') duration = '{}:{}:{:02d}'.format(h, m, int(s)) duration_minutes = int(h) * 60 + int(m) + math.ceil(float(s)) / 60 ratio = round(duration_minutes / os.path.getsize(video_file) * 1000000000, 2) print(f'{file_name}, {size_str}, {duration}, {video_info['resolution']}, {video_info['bitrate']}, {framerate}, {audio_lang}, {ratio}')

if name == 'main': main()

Python3 视频文件信息获取与优化:高效处理和分析

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

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