Her 5 dakikada bir değişen birden fazla videodan rastgele bölümü oynatın


9

Bu hafta sonu bir tatil partisi için A / V kuruyorum ve nasıl uygulanacağından emin değilim bir fikrim var.

Partide sürekli koşmak istediğim bir sürü Noel filmim var (Noel Tatili, Bir Noel Hikayesi, Harika Bir Hayat, vb.). Kurulum, bir projektöre bağlı bir MacBook'tur. Bunun arka plan havası olmasını istiyorum, bu yüzden sessizce çalışacak.

Tüm filmler +1 saat aralığında olduğundan, hepsini baştan sona oynatmak yerine, küçük örnekleri rastgele ve sürekli olarak göstermek istiyorum. İdeal olarak, her beş dakikada bir oynatma listesindeki / dizindeki rastgele bir filmden rastgele 5 dakikalık bir örnek seçip görüntülemesidir. Bu klip bittiğinde, başka bir klip seçmeli ve seçilen klibe bir tür solma / silme yapmalıdır.

Hangi yerden kullanmam gerektiğinden emin olarak nereden başlayacağımdan emin değilim. VLC böyle bir şey yapabilir mi? MPlayer? Komut dosyası yazma dili geniş olan bir oynatıcı varsa (rand () desteği, video uzunluğu bulma, rastgele video erişimi). Eğer öyleyse, muhtemelen RTFM'yi çalıştırabilir ve çalıştırabilirim; sadece çıkmaz sokaklardan geri adım atacak zamanım olmadığı için doğru yolda başlamak istiyorum. Herhangi bir öneri?

Yanıtlar:


11

Zamanında bir cevap alamadıktan sonra (bunu bir hafta önce yayınlamalıydım), VLC'yi otomatikleştirmeye daldım. UNIX yuvalarını kullanarak VLC'yi kontrol etme hakkında bir blog gönderisinin bu taşını buldum . Bunun özü, VLC'yi doğru bir şekilde yapılandırırsanız, komut satırı sözdizimi aracılığıyla komutlar gönderebilirsiniz:

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

burada [VLC Komutu] VLC'nin desteklediği herhangi bir komuttur (" longhelp " komutunu göndererek komutların bir listesini bulabilirsiniz ).

Filmlerle dolu bir dizini otomatik olarak yüklemek için bir Python betiği yazdım ve sonra rastgele gösterilecek klipleri seçtim. Komut dosyası önce tüm avis'i bir VLC çalma listesine koyar. Daha sonra oynatma listesinden rastgele bir dosya seçer ve oynatmak için o videoda rastgele bir başlangıç ​​noktası seçer. Komut dosyası daha sonra belirtilen süre kadar bekler ve işlemi tekrarlar. İşte, kalbin zayıflığı için değil:

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

Oh ve bir yan not olarak, bunu bir projektörde çalıştırıyorduk ve partinin vuruşu oldu. Herkes saniye değerleriyle uğraşmayı ve eklemek için yeni videolar seçmeyi severdi. Vermedi bana koydu olsun ama neredeyse!

DÜZENLEME: VLC'yi yalnızca çalma listesine dosya eklemeye başladığında VLC'nin yalnızca yarısı yükleneceği zamanlama sorunları olduğu için VLC'yi açan satırı kaldırdım. Şimdi VLC'yi manuel olarak açıyorum ve komut dosyasını başlatmadan önce yüklemeyi bitirmesini bekliyorum.


Vay be, bu gerçekten kaygan bir çözüm. Gerçek zamanlı olarak istediğiniz gibi çalışmasını sağlayın.
fideli

1
Bu fikri küçük bir medya aracına genişletmeyi düşünüyorum: belirli düzen, tercih edilen kesimler, filtre karıştırma, bir yapılandırmayı kaydetme / bir dosyadan okuma ve olay tabanlı medya oynatma. Ayrıca birisi böyle bir projeyle ilgileniyor mu?
12'de

4

Ben bu soruya yarım cevap vermek yerine yorum yapmayı tercih ederim ama yeterli itibarım yok. Belki başka biri buna dayanabilir.

Tüm videoyu önceden oluşturmanızı öneririm. Aşağıdaki gibi bir komut kullanarak klip oluşturmak için mencoder'ı kullanmak için bir bash betiği yazın:

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

Bu komutta, START rastgele bir başlangıç ​​noktası, MOVIE.AVI rastgele bir kaynak film ve MOVIE-CLIP - ##. Avi oluşturulan bir klip. -Oac ve -ovc anahtarları, çıkış codec bileşenlerinin kaynakla aynı olması gerektiğini belirtir. -Endpos anahtarı, 300 s olarak ayarlanmış klibin uzunluğunu belirtir. Bunun, her film için manuel olarak kolayca çözülebilecek bir sorun olduğunu düşündüğüm video uzunluğu keşfi olmadığını unutmayın (yalnızca bir avuçunuz olduğu göz önüne alındığında). Komut dosyanız bir dizi klip oluşturmak için bu komutta dolaşabilir.

Kliplere katılmak için aşağıdaki gibi bir komut kullanabilirsiniz:

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

Burası daha fazla tecrübesi olan birisinin aldığını öneriyorum. Mencoder'da klipler arasında solma / çözme geçişleri eklemenin bir yolu olup olmadığından emin değilim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.