9

Я настраиваю A/V для праздничной вечеринки в эти выходные и у меня есть идея, которую я не знаю, как реализовать.

У меня есть несколько рождественских фильмов (Рождественские каникулы, Рождественская история, Это прекрасная жизнь и т.д.), Которые я бы хотел постоянно показывать на вечеринке. Это MacBook, подключенный к проектору. Я хочу, чтобы это было фоновой атмосферой, поэтому будет работать тихо.

Поскольку все фильмы находятся в диапазоне +1 часа, вместо того, чтобы просто воспроизводить их все от начала до конца, я бы хотел показывать небольшие сэмплы в случайном порядке и непрерывно. В идеале, он будет работать так, что каждые пять минут он будет выбирать случайный 5-минутный семпл из случайного фильма в списке воспроизведения / каталоге и отображать его. Как только этот клип закончен, он должен выбрать другой клип и сделать какое-то постепенное исчезновение / стирание с выбранным клипом.

Я не уверен, с чего начать, начиная с того, какого игрока мне следует использовать. Может ли VLC сделать что-то подобное? MPlayer? Если есть плеер с обширным языком сценариев (поддержка rand (), определение длины видео, произвольный доступ к видео). Если это так, я, вероятно, смогу RTFM и заставить его работать; просто у меня нет времени возвращаться из тупика, поэтому я бы хотел начать с правильного пути. Какие-либо предложения?

2 ответа2

11

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

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

где [Команда VLC] - любая команда, поддерживаемая 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

Да, и как примечание, у нас это было запущено на проекторе, и это было хитом вечеринки. Все любили возиться со значениями секунд и выбирать новые видео для добавления. Не уложил меня, но почти!

РЕДАКТИРОВАТЬ: я удалил строку, которая открывает VLC, потому что были проблемы с синхронизацией, когда VLC был бы загружен только наполовину, когда скрипт начал добавлять файлы в список воспроизведения. Теперь я просто вручную открываю VLC и жду, пока он завершит загрузку, прежде чем запускать скрипт.

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 добавить переходы исчезновения / растворения между клипами.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .