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

  1. 使用函数封装代码块

process_videoprocess_folder 函数封装起来,使代码更加模块化和易于维护。同时可以减少全局变量的使用,更好地隔离作用域。

  1. 使用列表推导式简化代码

process_folder 函数中,可以使用列表推导式来获取视频文件列表,从而避免使用循环。

  1. 使用 pathlib 模块替代 os.path

pathlib 模块提供了更加面向对象的文件路径处理方式,可以使代码更加简洁和易于阅读。

  1. 使用 f-strings 替代字符串拼接

使用 f-strings 可以使代码更加简洁易读。同时,可以在字符串中直接使用变量,避免使用繁琐的字符串拼接操作。

  1. 将常量提取为全局变量

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)
Python 视频信息提取优化:更简洁高效的代码实现

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

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