Очередь в Python, обрабатывающая более одного видео одновременно?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Очередь в Python, обрабатывающая более одного видео одновременно?

Сообщение Anonymous »

У меня есть Raspberry Pi, на котором я обрабатываю видео, поворачиваю и ставлю 4 водяных знака, но когда я сталкиваюсь с Raspberry Pi, он использует 100% потоков 4CPUS и перезагружается. Я решил это, используя -threads 1, чтобы предотвратить использование только одного из 4 ядер ЦП, это сработало.
Я создал очередь для обработки по одному, потому что у меня 4 кнопки, которые запускают видео. Но когда я отправляю в очередь более трех видео, рашпиль все равно перезагружается, и я отслеживаю загрузку ЦП, 100% только для одного из четырех ЦП

Но если я отправлю 4 или 5 видео в папку треда, он полностью перезагружается, и самое главное неудобно, это после перезагрузки стало продолжаться все видео.

import os
import time
import subprocess
from google.cloud import storage
import shutil

QUEUE_DIR = "/home/abidu/Desktop/ApertaiRemoteClone"
ERROR_VIDEOS_DIR = "/home/abidu/Desktop/ApertaiRemoteClone/ErrorVideos"
CREDENTIALS_PATH = "/home/abidu/Desktop/keys.json"
BUCKET_NAME = "videos-283812"

def is_valid_video(file_path):
try:
result = subprocess.run(
['ffprobe', '-v', 'error', '-show_entries', 'format=duration', '-of', 'default=noprint_wrappers=1:nokey=1', file_path],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
return result.returncode == 0
except Exception as e:
print(f"Erro ao verificar o vídeo: {e}")
return False

def overlay_images_on_video(input_file, image_files, output_file, positions, image_size=(100, 100), opacity=0.7):
inputs = ['-i', input_file]
for image in image_files:
if image:
inputs += ['-i', image]
filter_complex = "[0:v]transpose=2[rotated];"
current_stream = "[rotated]"
for i, (x_offset, y_offset) in enumerate(positions):
filter_complex += f"[{i+1}:v]scale={image_size[0]}:{image_size[1]},format=rgba,colorchannelmixer=aa={opacity}[img{i}];"
filter_complex += f"{current_stream}[img{i}]overlay={x_offset}:{y_offset}"
if i < len(positions) - 1:
filter_complex += f"[tmp{i}];"
current_stream = f"[tmp{i}]"
else:
filter_complex += ""
command = ['ffmpeg', '-y', '-threads', '1'] + inputs + ['-filter_complex', filter_complex, '-threads', '1', output_file]

try:
result = subprocess.run(command, check=True)
result.check_returncode() # Verifica se o comando foi executado com sucesso
print(f"Vídeo processado com sucesso: {output_file}")
except subprocess.CalledProcessError as e:
print(f"Erro ao processar o vídeo: {e}")
if "moov atom not found" in str(e):
print("Vídeo corrompido ou sem o moov atom. Pulando o arquivo.")
raise # Relança a exceção para ser tratada no nível superior

def process_and_upload_video():
client = storage.Client.from_service_account_json(CREDENTIALS_PATH)
bucket = client.bucket(BUCKET_NAME)

while True:
# Aguarda 10 segundos antes de verificar novos vídeos
time.sleep(10)

# Verifica se há arquivos no diretório de fila
queue_files = [f for f in os.listdir(QUEUE_DIR) if f.endswith(".mp4")]

if queue_files:
video_file = os.path.join(QUEUE_DIR, queue_files[0]) # Pega o primeiro vídeo na fila

# Define o caminho de saída após o processamento com o mesmo nome do arquivo de entrada
output_file = os.path.join(QUEUE_DIR, "processed_" + os.path.basename(video_file))
if not is_valid_video(video_file):
print(f"Arquivo de vídeo inválido ou corrompido: {video_file}. Pulando.")
os.remove(video_file) # Remove arquivo corrompido
continue

# Processa o vídeo com a função overlay_images_on_video
try:
overlay_images_on_video(
video_file,
["/home/abidu/Desktop/ApertaiRemoteClone/Sponsor/image1.png",
"/home/abidu/Desktop/ApertaiRemoteClone/Sponsor/image2.png",
"/home/abidu/Desktop/ApertaiRemoteClone/Sponsor/image3.png",
"/home/abidu/Desktop/ApertaiRemoteClone/Sponsor/image4.png"],
output_file,
[(10, 10), (35, 1630), (800, 1630), (790, 15)],
image_size=(250, 250),
opacity=0.8
)

if os.path.exists(output_file):
blob = bucket.blob(os.path.basename(video_file).replace("-", "/"))
blob.upload_from_filename(output_file, content_type='application/octet-stream')
print(f"Uploaded {output_file} to {BUCKET_NAME}")
os.remove(video_file)
os.remove(output_file)
print(f"Processed and deleted {video_file} and {output_file}.")

except subprocess.CalledProcessError as e:
print(f"Erro ao processar {video_file}: {e}")

move_error_video_to_error_directory(video_file)

continue # Move para o próximo vídeo na fila após erro

def move_error_video_to_error_directory(video_file):
print(f"Movendo arquivo de vídeo com erro {video_file} para {ERROR_VIDEOS_DIR}")

if not os.path.exists(ERROR_VIDEOS_DIR):
os.makedirs(ERROR_VIDEOS_DIR)

shutil.move(video_file, ERROR_VIDEOS_DIR)

if __name__ == "__main__":
process_and_upload_video()



Подробнее здесь: https://stackoverflow.com/questions/791 ... -at-a-time
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как текущая очередь, очередь отправки и целевая очередь взаимодействуют друг с другом в GCD?
    Anonymous » » в форуме IOS
    0 Ответы
    105 Просмотры
    Последнее сообщение Anonymous
  • Функция Azure, не обрабатывающая по одному сообщению за раз
    Anonymous » » в форуме C#
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Функция Azure, не обрабатывающая по одному сообщению за раз
    Anonymous » » в форуме C#
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Приоритетная очередь не добавляет в очередь правильные данные
    Anonymous » » в форуме JAVA
    0 Ответы
    56 Просмотры
    Последнее сообщение Anonymous
  • Очередь.Очередь против. коллекции.deque
    Anonymous » » в форуме Python
    0 Ответы
    42 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»