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.
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:
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:
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.
quelle