5分ごとに変化する複数のビデオからのランダムなセクションの再生


9

今週末のホリデーパーティー用にA / Vを設定していますが、実装方法がわからないのですが。

私はたくさんのクリスマス映画(クリスマス休暇、クリスマスストーリー、それは素晴らしい人生など)を持っています。それらはパーティーで継続的に実行したいと思っています。セットアップは、プロジェクターに接続されたMacBookです。これを背景の雰囲気にしたいので、静かに実行します。

すべての映画が+1時間の範囲内にあるため、最初から最後まですべて再生するのではなく、小さなサンプルをランダムかつ継続的に表示したいと思います。理想的には、それが機能する方法は、5分ごとに、プレイリスト/ディレクトリ内のランダムな映画からランダムな5分のサンプルを選択して表示することです。そのクリップが終了すると、別のクリップを選択し、選択したクリップに対して何らかのフェード/ワイプを実行する必要があります。

どこから始めればいいのかわからない。VLCはこのようなことを行うことができますか?MPlayer?広範なスクリプト言語(rand()のサポート、ビデオの長さの検出、ランダムビデオアクセス)を備えたプレーヤーがいる場合。もしそうなら、私はおそらくRTFMをしてそれを動作させることができるでしょう。行き止まりからバックトラックする時間がないので、正しいトラックから始めたいです。助言がありますか?

回答:


11

時間内に回答が得られなかった後(これは1週間前に投稿されているはずです)、結局、VLCの自動化に飛び込みました。UNIXソケットを使用したVLCの制御に関するブログ記事のこの逸品を見つけました。その要点は、VLCを正しく設定すると、コマンドライン構文を介してVLCにコマンドを送信できることです。

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

ここで、[VLC Command]はVLCがサポートする任意のコマンドです(コマンド「longhelp」を送信すると、コマンドのリストを見つけることができます)。

結局、映画の完全なディレクトリを自動的にロードし、表示するクリップをランダムに選択する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を手動で開き、読み込みが完了するのを待ってからスクリプトを開始します。


うわー、それは本当に洗練されたソリューションです。リアルタイムで意図したとおりに実行することへの称賛。
fideli、2009

1
特定の順序、優先するカットアウト、フィルターブレンディング、構成の保存/ファイルからの読み取り、イベントベースのメディアの再生など、その機能を小さなメディアユーティリティに拡張することを考えています。誰かがそのようなプロジェクトに興味を持っていますか?
ジョーク

4

半解を投稿するよりは、コメントした方がいいですが、評判が足りません。おそらく、他の誰かがこれに基づいて構築できます。

ビデオ全体を事前に作成することをお勧めします。mencoderを使用して次のようなコマンドを使用してクリップを生成するbashスクリプトを記述します。

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

このコマンドでは、STARTはランダムな開始点、MOVIE.AVIはランダムなソースムービー、MOVIE-CLIP-##。aviは生成された1つのクリップです。-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でクリップ間のフェード/ディゾルブトランジションを追加する方法があるかどうかはわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.