
Recherche avancée
Autres articles (101)
-
HTML5 audio and video support
13 avril 2011, parMediaSPIP uses HTML5 video and audio tags to play multimedia files, taking advantage of the latest W3C innovations supported by modern browsers.
The MediaSPIP player used has been created specifically for MediaSPIP and can be easily adapted to fit in with a specific theme.
For older browsers the Flowplayer flash fallback is used.
MediaSPIP allows for media playback on major mobile platforms with the above (...) -
Contribute to translation
13 avril 2011You can help us to improve the language used in the software interface to make MediaSPIP more accessible and user-friendly. You can also translate the interface into any language that allows it to spread to new linguistic communities.
To do this, we use the translation interface of SPIP where the all the language modules of MediaSPIP are available. Just subscribe to the mailing list and request further informantion on translation.
MediaSPIP is currently available in French and English (...) -
Prérequis à l’installation
31 janvier 2010, parPréambule
Cet article n’a pas pour but de détailler les installations de ces logiciels mais plutôt de donner des informations sur leur configuration spécifique.
Avant toute chose SPIPMotion tout comme MediaSPIP est fait pour tourner sur des distributions Linux de type Debian ou dérivées (Ubuntu...). Les documentations de ce site se réfèrent donc à ces distributions. Il est également possible de l’utiliser sur d’autres distributions Linux mais aucune garantie de bon fonctionnement n’est possible.
Il (...)
Sur d’autres sites (7304)
-
Queue in Python processing more than one video at a time ? [closed]
12 novembre 2024, par Mateus CoelhoI have an raspberry pi, that i proccess videos, rotate and put 4 water marks, but, when i run into the raspberry pi, it uses 100% of 4CPUS threads and it reboots. I solved this using -threads 1, to prevent the usage of just one of the 4 CPUS cores, it worked.


I made a Queue to procces one at a time, because i have 4 buttons that trigger the videos. But, when i send more then 3 videos to the Queue, the rasp still reboots, and im monitoring the CPU usage, is 100% for only one of the four CPUS



But, if i send 4 or 5 videos to the thread folder, it completly reboots, and the most awkward, its after the reboot, it made its way to proceed all the videos.



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()




-
Anomalie #4598 (Fermé) : PHP 8 : Resource vs GdImage object problem.
4 novembre 2020GD ne retourne plus une "resource", mais une instance de GdImage.
Ça fait planter une partie des filtres images dans SPIP.
Notamment s’il y a des tests avecis_resource()
Exemple :
Warning : Trying to access array offset on value of type bool in [...]ecrire/inc/filtres_images_lib_mini.php on line 1607 à 1610
Qui provient de grosso modo :
[(#CHEMINun_fichier.png|image_applatirico)]Docs¶
- https://php.watch/versions/8.0/gdimage
- La correction chez WP : https://core.trac.wordpress.org/ticket/50833Avec la solution proposée :
Note that in PHP 7.2 and older, instanceOf operator requires an object. If you need to make your code function across PHP versions older than 7.3 through PHP 8.0, you will need an additional is_object() check :
- if (is_resource($image))
+ if (is_resource($image) || (is_object($image) && $image instanceOf \GdImage)) -
Evolution #4739 (Nouveau) : Styles des boîtes et messages du privé
19 avril 2021Dans la foulée des styles des formulaires, je pense qu’il serait bien d’accorder ça avec les styles des boîtes
#BOITE_OUVRIR
.
Mais avant d’y aller, je prends la température.Si une alpha est prévue pour le 1er mai ça va être un peu sport. Cela dit, c’est moins compliqué que les formulaires puisqu’il ne s’agit que de l’emballage extérieur, et il s’agit de reprendre une partie des styles des formulaires. Bref ça pourrait.
Par contre ça repose sur une partie des évolutions de la PR 157, donc travail à entamer qu’après celle-ci intégrée.
Boîtes¶
Dans l’immédiat je ne souhaite pas revenir sur toutes les variantes de boîtes (info, raccourcis, inverse, etc.), qui devraient rester pareil dans les grandes lignes.
Par contre il faudrait alléger les variantes notice, erreur et info. Sur la page de maintenance c’est festif actuellement :)La direction que je veux prendre, c’est de mettre juste une bordure de couleur, et éventuellement déplacer l’icône en haut.
Cf. image boite_notice_1.png en pièce-jointe.Messages¶
Par contre un truc un peu problématique, c’est que ces boîtes font un peu double emploi : parfois elles ne sont pas utilisées en tant que boîte à proprement parler, mais en tant que message d’alerte (notice, success, error).
Je pense qu’il faudrait éviter de les utiliser comme ça, ce sont 2 besoins différents, et ça devrait être 2 composants différents avec des styles propres.Dans ce cas, il s’agit de l’équivalent des alertes de Bootstrap par exemple : https://getbootstrap.com/docs/5.0/components/alerts/
Exemple : sur la page maintenance, le bloc « htaccess inopérant » ça devrait être un simple message d’alerte.
Et tout bas, le bloc « effacer les statistiques » c’est logique qu’il s’agisse d’une boîte.Alors ce composant « alerte » existe à peu près, mais un peu par contingence je crois : il y a des classes .notice, error et .info qu’on peut appliquer à un div, et ça semble faire le job.
Mais il faudrait rendre ça plus sûr : une classe .alerte et ces déclinaisons .alerte_notice, .alerte_error et .alerte_info
Pour officialiser ça pourrait pourquoi pas être complété par une balise#ALERTE{titre, variante, …}
.Là au niveau des styles, ça serait en mode flat, sans ombre portée, et avec un fond de couleur (proche voir identique aux messages de retour des formulaires).
Cf. image message_notice_1.png en pièce-jointe.