У меня есть 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
Очередь в Python, обрабатывающая более одного видео одновременно? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как текущая очередь, очередь отправки и целевая очередь взаимодействуют друг с другом в GCD?
Anonymous » » в форуме IOS - 0 Ответы
- 105 Просмотры
-
Последнее сообщение Anonymous
-