Wiedergabe eines zufälligen Abschnitts aus mehreren Videos, die alle 5 Minuten wechseln

9

Ich richte dieses Wochenende die Klimaanlage für eine Weihnachtsfeier ein und habe eine Idee, bei der ich nicht sicher bin, wie ich sie umsetzen soll.

Ich habe eine Reihe von Weihnachtsfilmen (Weihnachtsferien, Eine Weihnachtsgeschichte, Es ist ein wundervolles Leben usw.), die ich gerne ununterbrochen auf der Party laufen lassen würde. Das Setup ist ein MacBook, das an einen Projektor angeschlossen ist. Ich möchte, dass dies ein Hintergrund-Ambiente ist, damit es lautlos läuft.

Da sich alle Filme im Bereich von +1 Stunden befinden, möchte ich kleine Samples zufällig und kontinuierlich zeigen, anstatt sie alle von Anfang bis Ende durchzuspielen. Im Idealfall würde es so funktionieren, dass alle fünf Minuten ein zufälliges 5-Minuten-Sample aus einem zufälligen Film in der Wiedergabeliste / im Verzeichnis ausgewählt und angezeigt wird. Sobald dieser Clip beendet ist, sollte er einen anderen Clip auswählen und den ausgewählten Clip ausblenden / löschen.

Ich bin mir nicht sicher, wo ich damit anfangen soll, beginnend mit dem Spieler, den ich verwenden soll. Kann VLC so etwas tun? MPlayer? Wenn es einen Player mit einer umfangreichen Skriptsprache gibt (Unterstützung für rand (), Erkennung der Videolänge, zufälliger Videozugriff). Wenn ja, werde ich wahrscheinlich in der Lage sein, RTFM und es zum Laufen zu bringen; Es ist nur so, dass ich keine Zeit habe, mich von Sackgassen zurückzuziehen, also möchte ich auf dem richtigen Weg beginnen. Irgendwelche Vorschläge?

Brian
quelle

Antworten:

11

Nachdem ich nicht rechtzeitig eine Antwort erhalten hatte (hätte dies eine Woche früher veröffentlichen sollen), tauchte ich schließlich in die Automatisierung von VLC ein. Ich habe dieses Juwel eines Blogposts über die Steuerung von VLC mithilfe von UNIX-Sockets gefunden. Das Wesentliche dabei ist, dass Sie, wenn Sie VLC richtig konfigurieren, Befehle über die Befehlszeilensyntax an ihn senden können:

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

Dabei ist [VLC-Befehl] ein beliebiger Befehl, den VLC unterstützt (eine Liste der Befehle finden Sie, indem Sie den Befehl " longhelp " senden ).

Am Ende habe ich ein Python-Skript geschrieben, um automatisch ein Verzeichnis voller Filme zu laden und dann zufällig Clips zum Anzeigen auszuwählen. Das Skript fügt zunächst alle avis in eine VLC-Wiedergabeliste ein. Anschließend wird eine zufällige Datei aus der Wiedergabeliste ausgewählt und ein zufälliger Startpunkt in dem abzuspielenden Video ausgewählt. Das Skript wartet dann auf die angegebene Zeit und wiederholt den Vorgang. Hier ist es nicht für schwache Nerven:

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 und als Randnotiz, wir hatten dies auf einem Projektor laufen und es war der Hit der Party. Jeder liebte es, mit den Sekundenwerten herumzuspielen und neue Videos zum Hinzufügen auszuwählen. Hat mich nicht gelegt , aber fast!

BEARBEITEN: Ich habe die Zeile zum Öffnen von VLC entfernt, da es Zeitprobleme gab, bei denen VLC nur zur Hälfte geladen wurde, als das Skript anfing, Dateien zur Wiedergabeliste hinzuzufügen. Jetzt öffne ich VLC einfach manuell und warte, bis der Ladevorgang abgeschlossen ist, bevor ich das Skript starte.

Brian
quelle
Wow, das ist eine wirklich clevere Lösung. Ein großes Lob dafür, dass es genau so läuft, wie Sie es in Echtzeit beabsichtigt haben.
Fideli
1
Ich denke darüber nach, diese Idee auf ein kleines Medienprogramm auszudehnen, das folgende Merkmale aufweist: spezifische Reihenfolge, bevorzugte Ausschnitte, Filtermischung, Speichern einer Konfiguration / Lesen aus einer Datei und ereignisbasiertes Abspielen von Medien. Interessiert sich auch jemand für ein solches Projekt?
Joecks
4

Ich würde dies lieber kommentieren, als eine halbe Antwort zu posten, aber ich habe nicht genug Ruf. Vielleicht kann jemand anderes darauf aufbauen.

Ich würde vorschlagen, das gesamte Video vorher zu erstellen. Schreiben Sie ein Bash-Skript, um mithilfe des Mencoders einen Clip mit einem Befehl wie dem folgenden zu generieren:

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

In diesem Befehl wäre START ein zufälliger Startpunkt, MOVIE.AVI ist ein zufälliger Quellfilm und MOVIE-CLIP - ##. Avi ist ein generierter Clip. Die Schalter -oac und -ovc geben an, dass die Ausgabecodecs mit der Quelle identisch sein sollen. Der Schalter -endpos gibt die Länge des Clips an, die auf 300 s eingestellt ist. Beachten Sie, dass dies keine Videolängenerkennung hat, was ich als ein Problem betrachte, das für jeden Film leicht manuell gelöst werden kann (vorausgesetzt, Sie haben nur eine Handvoll). Ihr Skript könnte diesen Befehl durchlaufen, um eine Reihe von Clips zu generieren.

Um die Clips zu verbinden, können Sie einen Befehl wie den folgenden verwenden:

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

Hier würde ich jemandem mit mehr Erfahrung vorschlagen, der abholt. Ich bin mir nicht sicher, ob es in Mencoder eine Möglichkeit gibt, Übergänge zwischen den Clips einzufügen oder aufzulösen.

Fideli
quelle