Recherche avancée

Médias (1)

Mot : - Tags -/musée

Autres articles (100)

  • Personnaliser en ajoutant son logo, sa bannière ou son image de fond

    5 septembre 2013, par

    Certains thèmes prennent en compte trois éléments de personnalisation : l’ajout d’un logo ; l’ajout d’une bannière l’ajout d’une image de fond ;

  • Ecrire une actualité

    21 juin 2013, par

    Présentez les changements dans votre MédiaSPIP ou les actualités de vos projets sur votre MédiaSPIP grâce à la rubrique actualités.
    Dans le thème par défaut spipeo de MédiaSPIP, les actualités sont affichées en bas de la page principale sous les éditoriaux.
    Vous pouvez personnaliser le formulaire de création d’une actualité.
    Formulaire de création d’une actualité Dans le cas d’un document de type actualité, les champs proposés par défaut sont : Date de publication ( personnaliser la date de publication ) (...)

  • Publier sur MédiaSpip

    13 juin 2013

    Puis-je poster des contenus à partir d’une tablette Ipad ?
    Oui, si votre Médiaspip installé est à la version 0.2 ou supérieure. Contacter au besoin l’administrateur de votre MédiaSpip pour le savoir

Sur d’autres sites (14127)

  • Queue in Python processing more than one video at a time ? [closed]

    12 novembre 2024, par Mateus Coelho

    I 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
enter image description here

    


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



    


  • How to extract frames in sequence as PNG images from ffmpeg stream ?

    7 janvier, par JamesJGoodwin

    I'm trying to create a program that would capture my screen (a game to be precise) using ffmpeg and stream frames to NodeJS for live processing. So, if the game runs at 60 fps then I expect ffmpeg to send 60 images per second down to stdout. I've written a code for that

    


        import { spawn as spawnChildProcess } from 'child_process';

    const videoRecordingProcess = spawnChildProcess(
      ffmpegPath,
      [
        '-init_hw_device',
        'd3d11va',
        '-filter_complex',
        'ddagrab=0,hwdownload,format=bgra',
        '-c:v',
        'png',
        '-f',
        'image2pipe',
        '-loglevel',
        'error',
        '-hide_banner',
        'pipe:',
      ],
      {
        stdio: 'pipe',
      },
    );

    videoRecordingProcess.stderr.on('data', (data) => console.error(data.toString()));

    videoRecordingProcess.stdout.on('data', (data) => {
      fs.promises.writeFile(`/home/goodwin/genshin-repertoire-autoplay/imgs/${Date.now()}.bmp`, data);
    });


    


    Currently I'm streaming those images onto disk for debugging and it's almost working except that the image is cropped. Here's what's going on. I get 4 images saved on disk :

    


      

    1. Valid image that is 2560x1440, but only 1/4 or even 1/5 of the screen is present at the top, the remaining part of the image is empty (transparent)
    2. 


    3. Broken image that won't open
    4. 


    5. Broken image that won't open
    6. 


    7. Broken image that won't open
    8. 


    


    This pattern is nearly consistent. Sometimes it's 3, sometimes 4 or 5 images between valid images. What did I do wrong and how do I fix it ? My guess is that ffmpeg is streaming images in chunks, each chunk represents a part of the frame that was already processed by progressive scan. Though I'm not entirely sure if I should try and process it manually. There's gotta be a way to get fully rendered frames in one piece sequentially.

    


  • iOS video streaming to server using websockets

    6 septembre 2013, par user1516711

    Is it any way possible to stream video frames live from iOS SDK using AVCaptureSession to a remote server using WebSocket like SocketRocket ? What are pros and cons if it is possible ?