async def compress_and_crop_video_ffmpeg(input_file_path, output_file_path):
probe_command = [
'ffprobe',
'-i', input_file_path,
'-hide_banner',
'-select_streams', 'v:0',
'-show_entries', 'stream=width,height',
'-of', 'csv=p=0',
'-v', 'error'
]
result = subprocess.run(probe_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if result.stderr:
logging.error(f"FFprobe error: {result.stderr.decode()}")
if result.returncode != 0 or not result.stdout.strip():
logging.error("Не удалось получить размеры видео.")
raise Exception("Ошибка при получении размеров видео.")
try:
width, height = map(int, result.stdout.decode().strip().split(','))
except ValueError as e:
logging.error(f"Ошибка при преобразовании размеров видео: {e}")
raise
aspect_ratio = float(width) / float(height)
if width > height:
new_w = int(config.CIRCLE_SIZE * aspect_ratio)
new_h = config.CIRCLE_SIZE
else:
new_w = config.CIRCLE_SIZE
new_h = int(config.CIRCLE_SIZE / aspect_ratio)
ffmpeg_command = [
'ffmpeg',
'-i', input_file_path,
'-vf', f'scale={new_w}:{new_h},crop={config.CIRCLE_SIZE}:{config.CIRCLE_SIZE}:(iw-{config.CIRCLE_SIZE})/2:(ih-{config.CIRCLE_SIZE})/2',
'-c:v', 'libx264', # Кодек видео
'-preset', 'fast', # Быстрый режим кодирования
'-crf', '10', # Константа для качества
'-c:a', 'aac', # Кодек аудио
output_file_path
]
process = subprocess.run(ffmpeg_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if process.returncode != 0:
logging.error(f"FFmpeg error: {process.stderr.decode()}")
raise Exception("Ошибка при обработке видео с помощью FFmpeg")