Reprodução de seção aleatória de vários vídeos que mudam a cada 5 minutos

9

Estou configurando o A / V para uma festa de fim de ano neste fim de semana e tenho uma ideia que não tenho certeza de como implementar.

Eu tenho um monte de filmes de Natal (Férias de Natal, Uma História de Natal, É uma Vida Maravilhosa, etc.) que eu gostaria de ter correndo continuamente na festa. A configuração é um MacBook conectado a um projetor. Eu quero que isso seja uma coisa de ambiente de fundo, então ele vai estar funcionando silenciosamente.

Como todos os filmes estão no intervalo de +1 hora, em vez de apenas reproduzi-los do começo ao fim, gostaria de mostrar amostras pequenas de forma aleatória e contínua. Idealmente, o modo como funcionaria é que a cada cinco minutos ele escolheria uma amostra aleatória de 5 minutos de um filme aleatório na lista de reprodução / diretório e a exibiria. Uma vez que o clipe acabou, ele deve escolher outro clipe e fazer algum tipo de fade / wipe para o clipe escolhido.

Não sei por onde começar, começando com qual player devo usar. O VLC pode fazer algo assim? MPlayer? Se houver um player com uma linguagem de script extensa (suporte para rand (), descoberta de comprimento de vídeo, acesso aleatório a vídeo). Se assim for, provavelmente serei capaz de fazer RTFM e fazê-lo funcionar; é só que eu não tenho tempo para recuar de becos sem saída, então eu gostaria de começar no caminho certo. Alguma sugestão?

    
por brian 09.12.2009 / 21:28

2 respostas

11

Depois de não receber uma resposta no tempo (deveria ter postado isso uma semana antes), acabei mergulhando na automação do VLC. Eu encontrei este gem de um post sobre o controle do VLC usando sockets UNIX. A essência disso é que, se você configurar o VLC corretamente, poderá enviar comandos para ele por meio da sintaxe da linha de comando:

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

onde [Comando VLC] é 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 clipes para mostrar. O script primeiro coloca todos os avis em uma lista de reprodução 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 reproduzir. 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, nós tivemos isso rodando em um projetor e foi o hit da festa. Todo mundo adorava brincar com os valores de segundos e escolher novos vídeos para adicionar. Não me colocou, mas quase!

EDITAR: removi a linha que abre o VLC porque havia problemas de tempo em que o VLC só seria carregado pela metade quando o script começou a adicionar arquivos à lista de reprodução. Agora eu só abro manualmente o VLC e espero que ele termine de carregar antes de iniciar o script.

    
por 29.12.2009 / 07:20
4

Eu prefiro comentar isso, em vez de postar uma meia resposta, mas não tenho reputação suficiente. Talvez outra pessoa possa construir 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:

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

Nesse comando, START seria um ponto de partida aleatório, o MOVIE.AVI é um filme fonte aleatório e o MOVIE-CLIP - ##. avi é um clipe gerado. Os switches -oac e -ovc especificam que os codecs de saída devem ser iguais aos da origem. A opção -endpos especifica o tamanho do clipe, definido como 300 s. Note que isso não tem descoberta de comprimento de vídeo, o que eu considero ser um problema que é facilmente resolvido manualmente para cada filme (dado que você só tem um punhado). Seu script pode passar por esse comando para gerar vários clipes.

Para juntar os clipes, você pode usar um comando como:

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

É aqui que eu sugiro que alguém com mais experiência receba. Não tenho certeza se existe uma maneira no mencoder de adicionar transições de desvanecimento / dissolução entre os clipes.

    
por 11.12.2009 / 03:02