ส่วนการเล่นแบบสุ่มจากวิดีโอหลายรายการเปลี่ยนแปลงทุก 5 นาที


9

ฉันกำลังตั้งค่า A / V สำหรับปาร์ตี้วันหยุดสุดสัปดาห์นี้และมีความคิดว่าฉันไม่แน่ใจว่าจะนำไปใช้อย่างไร

ฉันมีภาพยนตร์คริสต์มาสหลายเรื่อง (วันหยุดคริสต์มาสเรื่องราววันคริสต์มาสมันเป็นชีวิตที่วิเศษ ฯลฯ ) ที่ฉันอยากจะเล่นอย่างต่อเนื่องในงานปาร์ตี้ การตั้งค่าเป็น MacBook เชื่อมต่อกับโปรเจ็กเตอร์ ฉันต้องการให้สิ่งนี้เป็นบรรยากาศแบบพื้นหลังดังนั้นมันจึงจะทำงานเงียบ ๆ

เนื่องจากภาพยนตร์ทุกเรื่องอยู่ในช่วงเวลา +1 ชั่วโมงแทนที่จะเล่นตั้งแต่ต้นจนจบฉันต้องการแสดงตัวอย่างขนาดเล็กแบบสุ่มและต่อเนื่อง วิธีที่จะใช้งานได้ก็คือทุก ๆ ห้านาทีมันจะเลือกตัวอย่างแบบสุ่ม 5 นาทีจากภาพยนตร์แบบสุ่มในเพลย์ลิสต์ / ไดเรกทอรีและแสดง เมื่อคลิปนั้นจบไปแล้วก็ควรเลือกคลิปอื่นและทำสีจาง ๆ / เช็ดไปที่คลิปที่เลือก

ฉันไม่แน่ใจว่าจะเริ่มจากตรงไหนเริ่มจากสิ่งที่ผู้เล่นควรใช้ VLC สามารถทำสิ่งนี้ได้หรือไม่? MPlayer? หากมีผู้เล่นที่มีภาษาสคริปต์อย่างกว้างขวาง (รองรับ rand (), ค้นหาความยาววิดีโอ, เข้าถึงวิดีโอแบบสุ่ม) ถ้าเป็นเช่นนั้นฉันอาจจะสามารถ RTFM และทำให้มันทำงานได้ เป็นเพียงว่าฉันไม่มีเวลาย้อนรอยจากจุดจบดังนั้นฉันจึงอยากเริ่มต้นในเส้นทางที่ถูกต้อง ข้อเสนอแนะใด ๆ

คำตอบ:


11

หลังจากไม่ได้รับคำตอบทันเวลา (ควรโพสต์เมื่อสัปดาห์ก่อน) ฉันลงเอยด้วยการดำน้ำให้เป็น VLC แบบอัตโนมัติ ฉันพบนี้อัญมณีของบล็อกโพสต์เกี่ยวกับการควบคุม VLC ใช้ซ็อกเก็ตยูนิกซ์ ส่วนสำคัญของมันคือถ้าคุณกำหนดค่า 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 ด้วยตนเองและรอให้โหลดเสร็จก่อนเริ่มสคริปต์


ว้าวนั่นเป็นวิธีที่ลื่นจริงๆ รุ่งโรจน์เพื่อให้มันทำงานตรงตามที่คุณตั้งใจในเวลาจริง
fideli

1
ฉันกำลังคิดที่จะขยายความคิดนั้นไปยังสื่อขนาดเล็กที่มีคุณสมบัติ: ลำดับเฉพาะการตัดลึกที่ต้องการการผสมตัวกรองการบันทึกการกำหนดค่า / การอ่านจากไฟล์และการเล่นสื่อตามเหตุการณ์ เป็นคนที่สนใจในโครงการดังกล่าวหรือไม่?
เชื่อมโยง

4

ฉันต้องการแสดงความคิดเห็นนี้แทนที่จะโพสต์คำตอบครึ่ง แต่ฉันไม่มีชื่อเสียงเพียงพอ บางทีคนอื่นสามารถสร้างสิ่งนี้

ฉันขอแนะนำให้สร้างวิดีโอทั้งหมดล่วงหน้า เขียนสคริปต์ทุบตีเพื่อใช้ 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 หรือไม่ที่จะเพิ่มช่วงการเปลี่ยนภาพ / จางหายระหว่างคลิป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.