From 0ad60b5b947f1799e1ebe5d088f1f063cb2e8f2e Mon Sep 17 00:00:00 2001 From: OleSTEEP Date: Fri, 26 Apr 2024 01:33:51 +0300 Subject: [PATCH] FFMpeg-Compressor: Switch to other ffmpeg lib, add CRF parameter for video --- FFMpeg-Compressor/README.md | 1 + FFMpeg-Compressor/ffmpeg-comp.toml | 3 ++- FFMpeg-Compressor/modules/compressor.py | 26 +++++++++++++------------ FFMpeg-Compressor/modules/printer.py | 2 +- FFMpeg-Compressor/requirements.txt | 2 +- 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/FFMpeg-Compressor/README.md b/FFMpeg-Compressor/README.md index 4d04f2f..496d47c 100644 --- a/FFMpeg-Compressor/README.md +++ b/FFMpeg-Compressor/README.md @@ -27,6 +27,7 @@ Python utility uses ffmpeg to compress Visual Novel Resources * Quality - Quality level of images. Values range: `0-100` (100 - best quality, 0 - worst quality) #### VIDEO section +* CRF ("Constant Quality") - Video quality parameter for ffmpeg. The CRF value can be from 0 to 63. Lower values mean better quality. Recommended values range from 15 to 35, with 31 being recommended for 1080p HD video. (default: `27`) * SkipVideo - Skip processing all video files. (default: `false`) * Extension - Required image file extension. It supports: `.3gp`, `.amv`, `.avi`, `.gif`, `.m2l`, `.m4v`, `.mkv`, `.mov`, `.mp4`, `.m4v`, `.mpeg`, `.mpv`, `.webm`, `.ogv` * Codec - (Maybe optional in future) Required video codec. (See official ffmpeg documentation for supported codecs) diff --git a/FFMpeg-Compressor/ffmpeg-comp.toml b/FFMpeg-Compressor/ffmpeg-comp.toml index fbbe2d0..7005024 100644 --- a/FFMpeg-Compressor/ffmpeg-comp.toml +++ b/FFMpeg-Compressor/ffmpeg-comp.toml @@ -17,6 +17,7 @@ Lossless = true Quality = 100 [VIDEO] -SkipVideo = true +CRF = 27 +SkipVideo = false Extension = "webm" Codec = "libvpx-vp9" \ No newline at end of file diff --git a/FFMpeg-Compressor/modules/compressor.py b/FFMpeg-Compressor/modules/compressor.py index 769a85e..8c3b737 100644 --- a/FFMpeg-Compressor/modules/compressor.py +++ b/FFMpeg-Compressor/modules/compressor.py @@ -3,7 +3,7 @@ from modules import printer from modules import utils from PIL import Image import pillow_avif -import ffmpeg +from ffmpeg import FFmpeg, FFmpegError import os @@ -28,13 +28,13 @@ def compress_audio(folder, file, target_folder, extension): printer.files(file, os.path.splitext(file)[0], extension, f"{bitrate}") try: - (ffmpeg + (FFmpeg() .input(f'{folder}/{file}') .output(utils.check_duplicates(f'{target_folder}/{os.path.splitext(file)[0]}.{extension}'), - audio_bitrate=bitrate) - .run(quiet=True) + {"b:a": bitrate}) + .execute() ) - except ffmpeg._run.Error as e: + except FFmpegError as e: utils.add_unprocessed_file(f'{folder}/{file}', f'{target_folder}/{file}') utils.errors_count += 1 if not configloader.config['FFMPEG']['HideErrors']: @@ -45,15 +45,17 @@ def compress_audio(folder, file, target_folder, extension): def compress_video(folder, file, target_folder, extension): if not configloader.config['VIDEO']['SkipVideo']: codec = configloader.config['VIDEO']['Codec'] + crf = configloader.config['VIDEO']['CRF'] printer.files(file, os.path.splitext(file)[0], extension, codec) try: - (ffmpeg + (FFmpeg() .input(f'{folder}/{file}') - .output(utils.check_duplicates(f'{target_folder}/{os.path.splitext(file)[0]}.{extension}'), vcodec=codec) - .run(quiet=True) + .output(utils.check_duplicates(f'{target_folder}/{os.path.splitext(file)[0]}.{extension}'), + {"codec:v": codec, "v:b": 0}, crf=crf) + .execute() ) - except ffmpeg._run.Error as e: + except FFmpegError as e: utils.add_unprocessed_file(f'{folder}/{file}', f'{target_folder}/{file}') utils.errors_count += 1 if not configloader.config['FFMPEG']['HideErrors']: @@ -97,12 +99,12 @@ def compress(folder, file, target_folder): if configloader.config["FFMPEG"]["ForceCompress"]: printer.unknown_file(file) try: - (ffmpeg + (FFmpeg() .input(f'{folder}/{file}') .output(f'{target_folder}/{file}') - .run(quiet=True) + .execute() ) - except ffmpeg._run.Error as e: + except FFmpegError as e: utils.add_unprocessed_file(f'{folder}/{file}', f'{target_folder}/{file}') utils.errors_count += 1 if not configloader.config['FFMPEG']['HideErrors']: diff --git a/FFMpeg-Compressor/modules/printer.py b/FFMpeg-Compressor/modules/printer.py index 4c99ced..5b63a56 100644 --- a/FFMpeg-Compressor/modules/printer.py +++ b/FFMpeg-Compressor/modules/printer.py @@ -38,7 +38,7 @@ def files(source, dest, dest_ext, comment): def unknown_file(file): - print(clean_str(f"\r* \033[0;33m{file}\033[0m (File will be force compressed wia ffmpeg)")) + print(clean_str(f"\r* \033[0;33m{file}\033[0m (File will be force compressed via ffmpeg)")) bar.next() diff --git a/FFMpeg-Compressor/requirements.txt b/FFMpeg-Compressor/requirements.txt index 88b8dd7..5201a85 100644 --- a/FFMpeg-Compressor/requirements.txt +++ b/FFMpeg-Compressor/requirements.txt @@ -1,5 +1,5 @@ Pillow==9.5.0 pillow-avif-plugin==1.4.1 -ffmpeg-python==0.2.0 +python-ffmpeg==2.0.12 progress==1.6 colorama==0.4.6 \ No newline at end of file