每隔5分钟播放一次多个视频,随机播放部分


9

我将在本周末为度假聚会设置A / V,但我不确定该如何实施。

我有很多圣诞节电影(圣诞节假期,圣诞节故事,奇妙的生活等),我希望连续不断地参加聚会。设置是将MacBook连接到投影仪。我希望这是一个背景氛围的东西,所以它将安静地运行。

由于所有电影均在+1小时范围内,因此,我不只是从头至尾地播放它们,而是希望随机且连续地显示小样本。理想的工作方式是每五分钟从播放列表/目录中的随机电影中选择一个随机的5分钟样本并显示出来。该剪辑结束后,应选择另一个剪辑,并对选定的剪辑进行某种淡入/擦除操作。

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

Answers:


11

在没有及时得到答案(应该在一个星期前发布)之后,我最终潜入了自动VLC。我发现这个博客张贴有关使用Unix套接字控制VLC的宝石。要点是,如果正确配置了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

哦,作为补充,我们让它在投影仪上运行,这很受派对欢迎。每个人都喜欢把秒值弄乱,并选择要添加的新视频。没让我被打倒,但是差点!

编辑:我删除了打开VLC的行,因为存在计时问题,其中当脚本开始将文件添加到播放列表时,VLC只会被加载一半。现在,我只是手动打开VLC,等待它完成加载,然后再启动脚本。


哇,那真是个好办法。使其完全按照您的预期实时运行是很荣幸的。
fideli

1
我正在考虑将该想法扩展到一个小型媒体工具,该工具具有以下特点:特定顺序,首选剪切,滤镜混合,保存配置/从文件中读取配置以及基于事件的媒体播放。有人对这样的项目感兴趣吗?
joecks 2012年

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 s。请注意,这没有视频长度发现,我认为这是一个容易为每个电影手动解决的问题(假设您只有少数几个)。您的脚本可以遍历该命令以生成许多剪辑。

要加入剪辑,可以使用以下命令:

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

这是我建议有更多经验的人选择的地方。我不确定在mencoder中是否有办法在片段之间添加淡入/淡出过渡。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.