Seção aleatória de reprodução de vários vídeos, alterando a cada 5 minutos

9

Estou configurando o A / V para uma festa de 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 exibir continuamente na festa. A configuração é um MacBook conectado a um projetor. Eu quero que isso seja uma coisa de ambiente de fundo, para que funcione silenciosamente.

Como todos os filmes estão no intervalo de +1 hora, em vez de apenas reproduzi-los do começo ao fim, eu gostaria de mostrar pequenas amostras aleatoriamente e continuamente. O ideal é que, a cada cinco minutos, ele escolha uma amostra aleatória de 5 minutos de um filme aleatório na lista de reprodução / diretório e a exiba. Depois que o clipe terminar, ele deverá escolher outro clipe e fazer algum tipo de desbotamento / limpeza no clipe escolhido.

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

Brian
fonte

Respostas:

11

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.

Brian
fonte
Uau, essa é uma solução realmente eficiente. Parabéns por executá-lo exatamente como você pretendia em tempo real.
fideli
11
Estou pensando em estender essa idéia para um pequeno utilitário de mídia, que apresenta: ordem específica, recortes preferenciais, mistura de filtros, salvando uma configuração / lendo-a de um arquivo e reprodução de mídia baseada em eventos. Também há alguém interessado nesse projeto?
joecks
4

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:

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, 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:

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

fideli
fonte