Riproduzione di sezioni casuali da più video che cambiano ogni 5 minuti


9

Sto allestendo l'A / V per una festa di questo fine settimana e ho un'idea che non sono sicuro di come implementare.

Ho un sacco di film natalizi (Vacanze di Natale, Una storia di Natale, È una vita meravigliosa, ecc.) Che mi piacerebbe correre continuamente alla festa. L'installazione è un MacBook collegato a un proiettore. Voglio che questa sia una cosa di atmosfera di fondo, quindi funzionerà silenziosamente.

Poiché tutti i film sono compresi nell'intervallo di 1 ora, invece di riprodurli dall'inizio alla fine, mi piacerebbe mostrare piccoli campioni in modo casuale e continuo. Idealmente il modo in cui funzionerebbe è che ogni cinque minuti sceglierebbe un campione casuale di 5 minuti da un film casuale nella playlist / directory e lo visualizzerebbe. Una volta che la clip è finita, dovrebbe scegliere un'altra clip ed eseguire una sorta di dissolvenza / cancellazione sulla clip scelta.

Non sono sicuro da dove cominciare, a partire da quale giocatore dovrei usare. VLC può fare qualcosa del genere? MPlayer? Se esiste un lettore con un linguaggio di scripting esteso (supporto per rand (), rilevamento della lunghezza del video, accesso al video casuale). In tal caso, probabilmente sarò in grado di RTFM e farlo funzionare; è solo che non ho tempo di tornare indietro dai vicoli ciechi, quindi vorrei iniziare sulla strada giusta. Eventuali suggerimenti?

Risposte:


11

Dopo non aver ricevuto una risposta in tempo (avrebbe dovuto pubblicare questo una settimana prima), ho finito per immergermi nell'automazione di VLC. Ho trovato questo gioiello di un post sul blog sul controllo di VLC tramite socket UNIX. L'essenziale è che se si configura VLC correttamente, è possibile inviare comandi tramite la sintassi della riga di comando:

echo [VLC Command] | nc -U /Users/vlc.sock

dove [Comando VLC] è qualsiasi comando supportato da VLC (è possibile trovare un elenco di comandi inviando il comando " longhelp ").

Ho finito per scrivere uno script Python per caricare automaticamente una directory piena di film e quindi scegliere casualmente i clip da mostrare. Lo script prima mette tutti gli avis in una playlist VLC. Quindi sceglie un file casuale dalla playlist e sceglie un punto di partenza casuale in quel video da riprodurre. Lo script attende quindi il periodo di tempo specificato e ripete il processo. Eccolo, non per i deboli di cuore:

import subprocess
import random
import time
import os
import sys

## Just seed if you want to get the same sequence after restarting the script
## random.seed()

SocketLocation = "/Users/vlc.sock"

## You can enter a directory as a command line argument; otherwise it will use the default
if(len(sys.argv) >= 2):
    MoviesDir = sys.argv[1]
else:
    MoviesDir = "/Users/Movies/Xmas"

## You can enter the interval in seconds as the second command line argument as well
if(len(sys.argv) >= 3):
    IntervalInSeconds = int(sys.argv[2])
else:
    IntervalInSeconds = 240 

## Sends an arbitrary command to VLC
def RunVLCCommand(cmd):
    p = subprocess.Popen("echo " + cmd + " | nc -U " + SocketLocation, shell = True, stdout = subprocess.PIPE)
    errcode = p.wait()
    retval = p.stdout.read()
    print "returning: " + retval
    return retval 

## Clear the playlist
RunVLCCommand("clear")

RawMovieFiles = os.listdir(MoviesDir)
MovieFiles = []
FileLengths = []

## Loop through the directory listing and add each avi or divx file to the playlist
for MovieFile in RawMovieFiles:
    if(MovieFile.endswith(".avi") or MovieFile.endswith(".divx")):
        MovieFiles.append(MovieFile)
        RunVLCCommand("add \"" + MoviesDir + "/" + MovieFile + "\"")

PlayListItemNum = 0

## Loop forever
while 1==1:
    ## Choose a random movie from the playlist
    PlayListItemNum = random.randint(1, len(MovieFiles))
    RunVLCCommand("goto " + str(PlayListItemNum))

    FileLength = "notadigit"
    tries = 0

    ## Sometimes get_length doesn't work right away so retry 50 times
    while tries < 50 and FileLength .strip().isdigit() == False or FileLength.strip() == "0":
        tries+=1
        FileLength = RunVLCCommand("get_length")    

    ## If get_length fails 50 times in a row, just choose another movie
    if tries < 50:
        ## Choose a random start time 
        StartTimeCode = random.randint(30, int(FileLength) - IntervalInSeconds);


        RunVLCCommand("seek " + str(StartTimeCode))

        ## Turn on fullscreen
        RunVLCCommand("f on")

        ## Wait until the interval expires
        time.sleep(IntervalInSeconds)   
        ## Stop the movie
        RunVLCCommand("stop")   
        tries = 0
        ## Wait until the video stops playing or 50 tries, whichever comes first
        while tries < 50 and RunVLCCommand("is_playing").strip() == "1":    
            time.sleep(1) 
            tries+=1

Oh, e come nota a margine, abbiamo fatto funzionare questo su un proiettore ed è stato il successo della festa. Tutti amavano scherzare con i valori dei secondi e scegliere nuovi video da aggiungere. Non mi ha fatto scopare , ma quasi!

EDIT: ho rimosso la linea che apre VLC perché c'erano problemi di temporizzazione in cui VLC sarebbe stato caricato a metà solo quando lo script ha iniziato ad aggiungere file alla playlist. Ora apro manualmente VLC e aspetto che termini il caricamento prima di iniziare lo script.


Wow, questa è una soluzione davvero brillante. Complimenti per averlo eseguito esattamente come previsto in tempo reale.
fideli,

1
Sto pensando di estendere quell'idea a un piccolo util media, che presenta: ordine specifico, ritagli preferiti, fusione di filtri, salvataggio di una configurazione / lettura da un file e riproduzione di contenuti basata su eventi. Qualcuno è anche interessato a un tale progetto?
Joecks

4

Preferirei commentare questo, piuttosto che pubblicare una mezza risposta, ma non ho abbastanza reputazione. Forse qualcun altro può basarsi su questo.

Suggerirei prima di creare l'intero video. Scrivi uno script bash per usare mencoder per generare una clip usando un comando come il seguente:

mencoder -ss START -endpos 300 MOVIE.AVI -oac copy \
-ovc copy -o MOVIE-CLIP-##.avi

In quel comando, START sarebbe un punto di partenza casuale, MOVIE.AVI è un filmato casuale e MOVIE-CLIP - ##. Avi è una clip generata. Le opzioni -oac e -ovc specificano che i codec di output devono essere gli stessi della sorgente. L'opzione -endpos specifica la lunghezza della clip, impostata su 300 s. Nota che questo non ha la scoperta della lunghezza del video, che considero un problema che può essere facilmente risolto manualmente per ogni film (dato che ne hai solo una manciata). Il tuo script potrebbe eseguire il ciclo attraverso quel comando per generare un numero di clip.

Per unire le clip, puoi usare un comando come:

mencoder -oac copy -ovc copy -idx -o MOVIE-CLIPS.AVI \
MOVIE-CLIP-01.AVI MOVIE-CLIP-02.AVI ... MOVIE-CLIP-NN.AVI

Qui è dove suggerirei qualcuno con più esperienza. Non sono sicuro se in mencoder esiste un modo per aggiungere transizioni di dissolvenza / dissolvenza tra le clip.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.