Depois de não receber uma resposta a tempo (deveria ter postado isso uma semana antes), acabei mergulhando na automação do VLC. Encontrei esta joia de um post sobre como controlar o VLC usando soquetes UNIX. O essencial é que, se você configurar o VLC corretamente, poderá enviar comandos a ele através da sintaxe da linha de comando:
echo [VLC Command] | nc -U /Users/vlc.sock
onde [VLC Command] é qualquer comando que o VLC suporta (você pode encontrar uma lista de comandos enviando o comando " longhelp ").
Acabei escrevendo um script Python para carregar automaticamente um diretório cheio de filmes e depois escolher aleatoriamente os clipes a serem exibidos. O script primeiro coloca todos os avis em uma lista de reprodução do VLC. Em seguida, ele escolhe um arquivo aleatório da lista de reprodução e escolhe um ponto de partida aleatório nesse vídeo para reprodução. O script aguarda o tempo especificado e repete o processo. Aqui está, não para os fracos de coração:
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
Ah, e como uma nota lateral, tínhamos isso rodando em um projetor e foi o sucesso da festa. Todo mundo adorava mexer nos valores dos segundos e escolher novos vídeos para adicionar. Não me meteu , mas quase!
EDIT: Eu removi a linha que abre o VLC porque havia problemas de tempo em que o VLC só ficava meio carregado quando o script começava a adicionar arquivos à lista de reprodução. Agora, eu apenas abro manualmente o VLC e espero que ele termine de carregar antes de iniciar o script.
Eu preferiria comentar isso, em vez de postar uma meia resposta, mas não tenho reputação suficiente. Talvez alguém possa construir sobre isso.
Eu sugeriria criar o vídeo inteiro de antemão. Escreva um script bash para usar o mencoder para gerar um clipe usando um comando como o seguinte:
Nesse comando, START seria um ponto de partida aleatório, MOVIE.AVI é um filme de origem aleatória e MOVIE-CLIP - ##. Avi é um clipe gerado. As opções -oac e -ovc especificam que os codecs de saída devem ser os mesmos da fonte. A opção -endpos especifica a duração do clipe, definida como 300 s. Observe que isso não possui a descoberta do tamanho do vídeo, o que considero um problema que é facilmente resolvido manualmente para cada filme (considerando que você tem apenas um punhado). Seu script pode percorrer esse comando para gerar um número de clipes.
Para ingressar nos clipes, você pode usar um comando como:
É aqui que eu sugeriria alguém com mais experiência. Não tenho certeza se existe uma maneira no mencoder de adicionar transições de desbotamento / dissolução entre os clipes.
fonte