Бот не закрывает состояние редакции фото ffmpeg и не может удалить фото

Задача бота делать с обыкновенного видео, видео кружек в телеграм, почему то бот не коректно закрывает ffmpeg не пойму в чем причина, возможно кто-то уже работал с ffmpeg и вы решили такую трудность, буду признателен если поможете)

import logging
import asyncio
import shutil
import ffmpeg
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
import cv2
import os
import time
import psutil
import subprocess
from moviepy.video.fx.resize import resize
import math
import numpy as np
from moviepy.editor import *
import tempfile
from moviepy.editor import VideoFileClip, ImageSequenceClip
API_TOKEN = 'токен'
bot = Bot(token=API_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)

# Налаштування журналювання
logging.basicConfig(level=logging.INFO)



folder_path = 'C:/Кружки'

# Создание папки, если она не существует
if not os.path.exists(folder_path):
    os.makedirs(folder_path)

temp_folder = os.path.join(folder_path, "temp")
MAX_FILE_SIZE = 8 * 1024 * 1024  # Максимальный размер файла в байтах
ASPECT_RATIO_THRESHOLD = 1.1  # Максимальное разрешенное соотношение сторон (ширина / высота)

ffmpeg_executable = r'C:\Users\Asus\PycharmProjects\ркрк\venv\Lib\site-packages\imageio_ffmpeg\binaries\ffmpeg-win64-v4.2.2.exe'


@dp.message_handler(content_types=['video'])
async def video_handler(message):
    video = message.video
    if video.file_size > MAX_FILE_SIZE:
        await bot.send_message(message.chat.id, "Размер видео превышает допустимый предел (8 МБ). Пожалуйста, выберите видео меньшего размера.")
        return
    if not os.path.exists(temp_folder):
        os.makedirs(temp_folder)
    with tempfile.NamedTemporaryFile(suffix='.mp4', delete=False, dir=temp_folder) as temp_file:
        temp_file_path = temp_file.name
        await bot.download_file_by_id(video.file_id, temp_file_path)
        video_clip = VideoFileClip(temp_file_path)
        aspect_ratio = video_clip.size[0] / video_clip.size[1]
        if math.isclose(aspect_ratio, 1.0, rel_tol=1e-3):
            processed_video_path = await process_video(temp_file_path)
            with open('processed_video_note.mp4', 'rb') as video_note_file:
                await bot.send_video_note(message.chat.id, video_note=video_note_file)
            os.remove(temp_file_path)
            await asyncio.sleep(1)  # Пауза перед удалением файла
            os.remove(processed_video_path)
        else:
            compressed_video_path = os.path.join(temp_folder, 'compressed_video.mp4')
            ffmpeg.input(temp_file_path, executable=ffmpeg_executable).filter('scale', 'min(640,iw)', 'min(640,ih)').output(compressed_video_path, crf=23).run()
            with open(compressed_video_path, 'rb') as compressed_video_file:
                await bot.send_video(message.chat.id, video=compressed_video_file)
                print(shutil.which('ffmpeg'))
            os.remove(temp_file_path)
            await asyncio.sleep(1)  # Пауза перед удалением файла
            os.remove(compressed_video_path)
    shutil.rmtree(temp_folder, ignore_errors=True)


async def process_video(video_path):
    if not video_path:
        raise ValueError("Invalid video path")
    with VideoFileClip(video_path) as video_clip:
        width, height = video_clip.size
        mask = np.zeros((height, width, 3), dtype=np.uint8)
        center_x = width // 2
        center_y = height // 2
        radius = min(center_x, center_y)
        cv2.circle(mask, (center_x, center_y), radius, (255, 255, 255), -1)
        processed_frames = []
        for frame in video_clip.iter_frames():
            processed_frame = cv2.bitwise_and(frame, mask)
            processed_frames.append(processed_frame)
        processed_video_path = os.path.join(temp_folder, 'processed_video.mp4')
        with ImageSequenceClip(processed_frames, fps=video_clip.fps) as processed_clip:
            processed_clip.write_videofile(processed_video_path, codec='libx264', audio=False)
            video_note_path = os.path.join(temp_folder, 'processed_video_note.mp4')
            video_clip.write_videofile(video_note_path, codec='libx264', audio=False)
            processed_clip.close()
        await asyncio.sleep(2)
        for proc in psutil.process_iter():
            try:
                if proc.name() == 'ffmpeg' or 'ffmpeg' in proc.cmdline():
                    proc.kill()
            except psutil.AccessDenied:
                pass

        # Ожидание завершения процесса ffmpeg
        subprocess.run([ffmpeg_executable, '-version'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
        time.sleep(2)
        with open(video_path, "rb") as file:
            # Закрытие файловых дескрипторов
            file.close()

        # Удаление временного файла
        try:
            os.remove(video_path)
        except OSError as e:
            print(f"Ошибка при удалении файла: {e}")

        return video_note_path
if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)```

ошибки:

ERROR:asyncio:Task exception was never retrieved
future: <Task finished name='Task-10' coro=<Dispatcher._process_polling_updates() done, defined at C:\Users\Asus\PycharmProjects\ркрк\venv\Lib\site-packages\aiogram\dispatcher\dispatcher.py:407> exception=FileNotFoundError(2, 'No such file or directory')>
Traceback (most recent call last):
  File "C:\Users\Asus\PycharmProjects\ркрк\venv\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 415, in _process_polling_updates
    for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)):
                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Asus\PycharmProjects\ркрк\venv\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 235, in process_updates
    return await asyncio.gather(*tasks)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Asus\PycharmProjects\ркрк\venv\Lib\site-packages\aiogram\dispatcher\handler.py", line 117, in notify
    response = await handler_obj.handler(*args, **partial_data)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Asus\PycharmProjects\ркрк\venv\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 256, in process_update
    return await self.message_handlers.notify(update.message)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Asus\PycharmProjects\ркрк\venv\Lib\site-packages\aiogram\dispatcher\handler.py", line 117, in notify
    response = await handler_obj.handler(*args, **partial_data)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Asus\PycharmProjects\ркрк\main.py", line 58, in video_handler
    with open('processed_video_note.mp4', 'rb') as video_note_file:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'processed_video_note.mp4'

Ошибка при удалении файла:

[WinError 32] Процесс не может получить доступ к файлу, так как этот файл занят другим процессом: 'C:\Кружки\temp\tmpilardhdt.mp4'


Ответы (0 шт):