Odtwarzanie losowej sekcji z wielu filmów zmieniających się co 5 minut

9

Konfiguruję A / V na imprezę wakacyjną w ten weekend i mam pomysł, że nie jestem pewien, jak to zaimplementować.

Mam mnóstwo świątecznych filmów (Święta Bożego Narodzenia, A Christmas Story, It's a Wonderful Life itp.), Które chciałbym oglądać na imprezie w sposób ciągły. Konfiguracja to MacBook podłączony do projektora. Chcę, aby była to atmosfera tła, więc będzie działać cicho.

Ponieważ wszystkie filmy są w zakresie +1 godzin, zamiast po prostu odtwarzać je od początku do końca, chciałbym pokazywać małe próbki losowo i ciągle. Idealnie działałoby to tak, że co pięć minut wybiera losową 5-minutową próbkę z losowego filmu z listy odtwarzania / katalogu i wyświetla ją. Po zakończeniu tego klipu powinien wybrać inny klip i wykonać pewnego rodzaju wyciszenie / wyczyszczenie wybranego klipu.

Nie jestem pewien, od czego zacząć, od jakiego odtwarzacza powinienem użyć. Czy VLC może zrobić coś takiego? MPlayer? Jeśli jest odtwarzacz z rozbudowanym językiem skryptowym (obsługa rand (), wykrywanie długości wideo, losowy dostęp do wideo). Jeśli tak, prawdopodobnie będę w stanie RTFM i uruchomić go; po prostu nie mam czasu na powrót z ślepych zaułków, więc chciałbym zacząć od właściwej ścieżki. Jakieś sugestie?

Brian
źródło

Odpowiedzi:

11

Po nieotrzymaniu odpowiedzi na czas (powinienem był to napisać tydzień wcześniej), skończyłem nurkując w automatyzacji VLC. Znalazłem ten klejnot w poście na blogu o kontrolowaniu VLC przy użyciu gniazd UNIX. Istotą tego jest to, że jeśli poprawnie skonfigurujesz VLC, możesz wysyłać do niego polecenia za pomocą składni wiersza poleceń:

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

gdzie [VLC Command] to dowolne polecenie obsługiwane przez VLC (listę poleceń można znaleźć, wysyłając polecenie „ longhelp ”).

Skończyło się na napisaniu skryptu Python, aby automatycznie załadować katalog pełen filmów, a następnie losowo wybrać klipy do wyświetlenia. Skrypt najpierw umieszcza wszystkie avis na liście odtwarzania VLC. Następnie wybiera losowy plik z listy odtwarzania i wybiera losowy punkt początkowy tego filmu do odtworzenia. Skrypt czeka następnie przez określony czas i powtarza proces. Oto nie dla osób o słabym sercu:

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

No i na marginesie, mieliśmy to uruchomione na projektorze i to był hit imprezy. Wszyscy uwielbiali bawić się wartościami sekund i wybierać nowe filmy do dodania. Nie położyłem mnie , ale prawie!

EDYCJA: Usunąłem wiersz otwierający VLC, ponieważ wystąpiły problemy z taktowaniem, w których VLC byłby w połowie załadowany, gdy skrypt zaczął dodawać pliki do listy odtwarzania. Teraz po prostu ręcznie otwieram VLC i czekam, aż zakończy się ładowanie przed uruchomieniem skryptu.

Brian
źródło
Wow, to naprawdę fajne rozwiązanie. Uznanie dla tego, aby działał dokładnie tak, jak zamierzałeś w czasie rzeczywistym.
fideli
1
Zastanawiam się nad rozszerzeniem tego pomysłu na małe użycie mediów, które ma: określoną kolejność, preferowane wycięcia, mieszanie filtrów, zapisanie konfiguracji / odczytanie z pliku oraz odtwarzanie multimediów na podstawie zdarzeń. Czy ktoś też jest zainteresowany takim projektem?
łączy
4

Wolę to skomentować, niż opublikować pół odpowiedzi, ale nie mam wystarczającej reputacji. Być może ktoś inny może to wykorzystać.

Proponuję wcześniej utworzyć cały film. Napisz skrypt bash, aby użyć mencodera do wygenerowania klipu za pomocą polecenia, takiego jak:

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

W tym poleceniu START byłby losowym punktem początkowym, MOVIE.AVI to losowy film źródłowy, a MOVIE-CLIP - ##. Avi to jeden wygenerowany klip. Przełączniki -oac i -ovc określają, że kodeki wyjściowe powinny być takie same jak źródło. Przełącznik -endpos określa długość klipu, ustawioną na 300 s. Zauważ, że nie ma funkcji wykrywania długości filmu, co uważam za problem, który można łatwo rozwiązać ręcznie dla każdego filmu (biorąc pod uwagę, że masz tylko garść). Skrypt może zapętlać to polecenie, aby wygenerować wiele klipów.

Aby dołączyć do klipów, możesz użyć polecenia takiego jak:

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

To jest miejsce, w którym poleciłbym komuś z większym doświadczeniem. Nie jestem pewien, czy w mencoderze jest sposób na dodawanie przejść zanikania / rozpuszczania między klipami.

fideli
źródło