Програмування

Стиснення відео в папці за допомогою скрипта Python і конвертера FFmpeg

Багато хто знає про пакет утиліт 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

Залишити коментар

Вашу електронну адресу не буде оприлюднено. Обов’язкові поля позначено *