Бот не закрывает состояние редакции фото 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'