Многие знают что существует пакет утилит FFmpeg, которым можно воспользоваться для пережатия и конвертации видео-файлов. Чтобы сконвертировать файл из одного формата в другой достаточно указать несколько ключей, путь к исходному файлу, путь к выходному и выполнить это в командной строке. Если файлов много, они лежат в подкаталогах и т.п. то можно написать скрипт. Я покажу пример как это можно сделать на python.
Этот пример демонстрирует такие технологии:
- Использование утилиты ffmpeg.exe и ключей для выполнения конвертации в заданный формат.
- Рекурсивный поиск файлов в директории с заданным расширением.
- Выполнение внешней утилиты из python при помощи subprocess.run с передачей параметров.
- Сохранение информации в лог-файл по мере выполнения скрипта для последующего контроля.
import os import subprocess FFMPEGDIR = 'd:\\Program Files\\ffmpeg\\bin\\' # downloaded from ffmpeg.org BASEDIR = 'd:\\VIDEO\\' # Video files def process_file(srcfile : str): ''' Process the source file ''' print(srcfile) dstfile = os.path.splitext(srcfile)[0] + '.mp4' # Result file extension subprocess.run([FFMPEGDIR + 'ffmpeg.exe', '-i', srcfile, # Source video file '-map_metadata', '0:s:0', # Keep metadata '-c:v', 'libx264', '-s', '960x540', # new resolution '-crf', '27', # Video compress level. Higher - smallest bitrate '-ab', '64K' , # Audio bitrate '-y', # Rewrite if exists dstfile]) return dstfile def process_dirs(d): ''' Process all files in directory and subfolders ''' logfile = open('result.txt', 'a') # log for address, dirs, files in os.walk(d): for fname in files: if (os.path.splitext(fname)[1]).lower()=='.mov': dstfile = process_file(os.path.join(address,fname)) logfile.write(f'{dstfile} {str(os.path.getsize(dstfile)/1024/1024)}:.1fMb\n') logfile.close() # log if __name__ == '__main__': process_dirs(BASEDIR)
Командная строка для конвертации каждого файла выглядит так:
ffmpeg.exe -i srcfile.mov -map_metadata 0:s:0 -c:v libx264 -s 960x540 -crf 27 -ab 64K -y dstfile.mp4