每 5 分钟播放多个视频中的随机片段

每 5 分钟播放多个视频中的随机片段

我正在为这个周末的节日聚会设置视听设备,我有一个想法,但不确定如何实现。

我有很多圣诞电影(《圣诞假期》、《圣诞故事》、《生活多美好》等),我想在派对上连续播放。设置是一台连接到投影仪的 MacBook。我希望这是一个背景氛围,所以它会安静地运行。

由于所有电影的时长都在 1 小时以上,因此我不想从头到尾播放所有电影,而是想随机连续地播放一些小片段。理想情况下,它会每五分钟从播放列表/目录中的随机电影中随机选择一个 5 分钟的片段并显示。该片段播放结束后,它会选择另一个片段并对所选片段进行淡入淡出/擦除。

我不知道从哪里开始,先从我应该使用什么播放器开始。VLC 能做这样的事情吗?MPlayer?如果有带有广泛脚本语言的播放器(支持 rand()、视频长度发现、随机视频访问)。如果是这样,我可能能够 RTFM 并使其工作;只是我没有时间从死胡同回溯,所以我想从正确的轨道开始。有什么建议吗?

答案1

由于没有及时得到答复(应该在一周前发布),我最终开始研究如何自动化 VLC。我发现关于使用 UNIX 套接字控制 VLC 的博客文章非常精彩。其要点是,您可以通过命令行语法向 VLC 发送命令:

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

在哪里[VLC 命令]是 VLC 支持的任何命令(您可以通过发送命令“隆赫普“)。

我最终编写了一个 Python 脚本,用于自动加载一个包含电影的目录,然后随机选择要显示的剪辑。该脚本首先将所有视频放入 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 并等待它完成加载后再启动脚本。

答案2

我更愿意对此发表评论,而不是发布半个答案,但我的声誉不够。也许其他人可以在此基础上继续。

我建议事先制作整个视频。编写一个 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 中是否有办法在剪辑之间添加淡入淡出/溶解过渡。

相关内容