Відтворення випадкового розділу з декількох відео, що змінюються кожні 5 хвилин


9

Я встановлюю A / V для святкової вечірки в ці вихідні і маю ідею, яку я не знаю, як реалізувати.

У мене є купа різдвяних фільмів (різдвяні канікули, різдвяна історія, це чудове життя тощо), які я хотів би постійно бігати на вечірці. Налаштування - це MacBook, підключений до проектора. Я хочу, щоб це було фоновою обстановкою, тому воно буде працювати безшумно.

Оскільки всі фільми знаходяться в межах +1 години, а не просто відтворювати їх від початку до кінця, я б хотів показувати невеликі зразки випадковим чином та безперервно. В ідеалі так, як це працювало б, щоб кожні п’ять хвилин вибирали випадковий 5-хвилинний зразок із випадкового фільму у списку відтворення / каталогу та демонстрували його. Як тільки цей кліп закінчиться, він повинен вибрати інший кліп і зробити якесь зменшення / протирання вибраного кліпу.

Я не впевнений, з чого почати, починаючи з того, якого гравця я повинен використовувати. Чи може VLC зробити щось подібне? MPlayer? Якщо є плеєр з широкою мовою сценаріїв (підтримка rand (), виявлення довжини відео, випадковий доступ до відео). Якщо це так, я, ймовірно, зможу RTFM і змусить його працювати; це просто те, що я не маю часу відступати від тупиків, тому я хотів би почати з правильного шляху. Будь-які пропозиції?

Відповіді:


11

Не отримавши відповіді вчасно (повинен був розмістити це на тиждень раніше), я закінчився пірнанням в автоматизацію VLC. Я знайшов цю дорогоцінну камеру в блозі про керування VLC за допомогою розеток UNIX. Суть її полягає в тому, що якщо правильно налаштувати VLC, ви можете надсилати до нього команди через синтаксис командного рядка:

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

де [VLC Command] - будь-яка команда, яку VLC підтримує (ви можете знайти список команд, відправивши команду " longhelp ").

Я закінчив писати сценарій Python, щоб автоматично завантажувати каталог, наповнений фільмами, а потім випадковим чином вибирати кліпи для показу. Сценарій спочатку ставить усіх avis у список відтворення VLC. Потім він вибирає випадковий файл зі списку відтворення та вибирає випадкову вихідну точку цього відео, яке буде відтворюватися. Потім сценарій чекає вказану кількість часу і повторює процес. Ось це, не для слабкого серця:

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

О, і як бічна нота, у нас це працювало на проекторі, і це було хітом партії. Усі любили возитися зі значеннями секунд та вибирати нові відео, які потрібно додати. Чи не зрозумійте мене поклали , але майже!

EDIT: Я видалив рядок, який відкриває VLC, тому що виникли проблеми з тимчасовою передачею, коли VLC був би наполовину завантажений, коли сценарій почав додавати файли до списку відтворення. Тепер я просто відкриваю VLC вручну і чекаю, коли закінчиться завантаження перед запуском сценарію.


Нічого собі, це дійсно гладке рішення. Кудо, щоб він працював точно так, як ви задумали в режимі реального часу.
fideli

1
Я думаю про розширення цієї ідеї до невеликої утиліти медіа, яка має: певний порядок, бажані вирізки, змішування фільтрів, збереження конфігурації / читання її з файлу та відтворення медіа на основі подій. Чи також хтось зацікавлений у такому проекті?
joecks

4

Я вважаю за краще прокоментувати це, а не опублікувати напіввідповідь, але у мене недостатньо репутації. Можливо, хтось ще може на цьому побудувати.

Я б запропонував заздалегідь створити ціле відео. Напишіть сценарій bash, щоб використовувати mencoder для генерування кліпу за допомогою такої команди:

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

У цій команді START буде випадковою відправною точкою, MOVIE.AVI - фільм із випадковим джерелом, а MOVIE-CLIP - ##. Avi - один створений кліп. Перемикачі -oac і -ovc вказують, що вихідні кодеки повинні бути такими ж, як і вихідні. Перемикач -endpos вказує довжину кліпу, встановлену на 300 с. Зауважте, що це не має знаходження довжини відео, що я вважаю проблемою, яка легко вирішується вручну для кожного фільму (враховуючи, що у вас є лише кілька). Ваш сценарій може провести цикл через цю команду, щоб створити ряд кліпів.

Щоб приєднатись до кліпів, ви можете скористатися командою типу:

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

Саме тут я б запропонував, хто має більше досвіду. Я не впевнений, чи є спосіб у mencoder додати згасання / розчинення переходів між кліпами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.