Python 视频信息提取优化:更简洁高效的代码实现
以下是对代码的优化建议:
- 使用函数封装代码块
将 process_video 和 process_folder 函数封装起来,使代码更加模块化和易于维护。同时可以减少全局变量的使用,更好地隔离作用域。
- 使用列表推导式简化代码
在 process_folder 函数中,可以使用列表推导式来获取视频文件列表,从而避免使用循环。
- 使用
pathlib模块替代os.path
pathlib 模块提供了更加面向对象的文件路径处理方式,可以使代码更加简洁和易于阅读。
- 使用 f-strings 替代字符串拼接
使用 f-strings 可以使代码更加简洁易读。同时,可以在字符串中直接使用变量,避免使用繁琐的字符串拼接操作。
- 将常量提取为全局变量
将 supported_formats 常量提取为全局变量,避免在函数中多次定义,提高代码的可读性和可维护性。
综上所述,以下是对代码的优化实现:
import subprocess
import re
import math
from pathlib import Path
import openpyxl
# 视频格式
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 process_video(video_file):
# 获取文件名
file_name = video_file.name
# 获取文件大小
size_str = convert_size(video_file.stat().st_size)
# 使用mediainfo获取视频信息 / 音频信息
with subprocess.Popen(['mediainfo',
'--Inform=Video;%Format%|%Width%x%Height%|%BitRate/String%|%FrameRate%|%Duration/String3%',
str(video_file)],
stdout=subprocess.PIPE) as video_proc, \
subprocess.Popen(['mediainfo',
'--Inform=Audio;%BitRate/String%|%SamplingRate/String%|%Language/String%',
str(video_file)],
stdout=subprocess.PIPE) as audio_proc:
video_output = video_proc.communicate()[0].decode().strip()
audio_output = audio_proc.communicate()[0].decode().strip()
# 解析输出结果
video_info = video_output.split('|')
audio_info = audio_output.split('|')
# 处理多音轨情况
audio_bitrate, audio_sampling_rate, audio_lang = zip(*[(audio_info[i*3],
audio_info[i*3+1], audio_info[i*3+2]) for i in range(len(audio_info)//3)])
# 时长取整
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 / video_file.stat().st_size * 1000000000, 2)
# 使用正则表达式替换码率数据中第1、2数字之间的空格
bitrate = re.sub(PATTERN, r'\1\2', video_info[2])
# 将帧率转换为数字
frame_rate = float(video_info[3])
print(f'{file_name}, {size_str}, {duration}, {video_info[1]}, {bitrate}, {video_info[3]}, {' / '.join(audio_lang)}, {ratio}')
def process_folder(video_folder):
# 获取视频文件递归
video_files = [f for f in Path(video_folder).rglob('*') if f.suffix in SUPPORTED_FORMATS]
total_count = len(video_files)
if total_count == 0:
print('无视频文件或路径为空')
else:
for video_file in video_files:
process_video(video_file)
def convert_size(size):
# 单位转换
units = ['B', 'KiB', 'MiB', 'GiB']
i = 0
while size >= 1024 and i < len(units)-1:
size /= 1024
i += 1
return f'{size:.2f} {units[i]}'
# 文件路径
path = input('请输入文件路径:')
if Path(path).is_file():
# 1个文件 total_count += 1
process_video(Path(path))
elif Path(path).is_dir():
process_folder(path)
原文地址: https://www.cveoy.top/t/topic/mHhY 著作权归作者所有。请勿转载和采集!