Phần phát lại ngẫu nhiên từ nhiều video thay đổi cứ sau 5 phút


9

Tôi đang thiết lập A / V cho một bữa tiệc vào cuối tuần này và có một ý tưởng rằng tôi không chắc chắn cách thực hiện.

Tôi có một loạt các bộ phim Giáng sinh (Kỳ nghỉ Giáng sinh, Câu chuyện Giáng sinh, Đó là một cuộc sống tuyệt vời, v.v.) mà tôi muốn được chạy liên tục trong bữa tiệc. Thiết lập là MacBook được kết nối với máy chiếu. Tôi muốn đây là một thứ tuyệt vời nền để nó sẽ hoạt động một cách im lặng.

Vì tất cả các bộ phim đều ở trong phạm vi +1 giờ, thay vì chỉ phát tất cả chúng từ đầu đến cuối, tôi muốn hiển thị các mẫu nhỏ một cách ngẫu nhiên và liên tục. Lý tưởng nhất là cách nó hoạt động là cứ sau năm phút, nó sẽ chọn một mẫu 5 phút ngẫu nhiên từ một bộ phim ngẫu nhiên trong danh sách phát / thư mục và hiển thị nó. Khi clip đó kết thúc, nó nên chọn một clip khác và thực hiện một số loại mờ dần / xóa sang clip đã chọn.

Tôi không chắc bắt đầu từ đâu, bắt đầu với người chơi nào tôi nên sử dụng. VLC có thể làm một cái gì đó như thế này? MPlayer? Nếu có một trình phát có ngôn ngữ kịch bản mở rộng (hỗ trợ cho rand (), phát hiện thời lượng video, truy cập video ngẫu nhiên). Nếu vậy, tôi có thể sẽ có thể RTFM và làm cho nó hoạt động; chỉ là tôi không có thời gian để quay lại từ ngõ cụt nên tôi muốn bắt đầu đi đúng hướng. Bất kỳ đề xuất?

Câu trả lời:


11

Sau khi không nhận được câu trả lời kịp thời (lẽ ra nên đăng bài này một tuần trước đó), tôi đã kết thúc việc tự động hóa VLC. Tôi tìm thấy viên ngọc quý này của một bài đăng trên blog về việc kiểm soát VLC bằng cách sử dụng các ổ cắm UNIX. Điểm chính của nó là nếu bạn cấu hình VLC chính xác, bạn có thể gửi lệnh đến nó thông qua cú pháp dòng lệnh:

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

trong đó [Lệnh VLC] là bất kỳ lệnh nào mà VLC hỗ trợ (bạn có thể tìm thấy danh sách các lệnh bằng cách gửi lệnh " longhelp ").

Cuối cùng tôi đã viết một tập lệnh Python để tự động tải lên một thư mục chứa đầy phim và sau đó chọn ngẫu nhiên các clip để hiển thị. Kịch bản trước tiên đặt tất cả avis vào danh sách phát VLC. Sau đó, nó chọn một tệp ngẫu nhiên từ danh sách phát và chọn một điểm bắt đầu ngẫu nhiên trong video đó để phát. Tập lệnh sau đó chờ trong khoảng thời gian đã chỉ định và lặp lại quy trình. Nó đây, không dành cho người yếu tim:

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

Ồ và như một lưu ý phụ, chúng tôi đã có cái này chạy trên máy chiếu và nó là bản hit của bữa tiệc. Mọi người đều thích lộn xộn với các giá trị giây và chọn video mới để thêm. Không khiến tôi nằm , nhưng gần như vậy!

EDIT: Tôi đã xóa dòng mở VLC vì có vấn đề về thời gian trong đó VLC sẽ chỉ được tải một nửa khi tập lệnh bắt đầu thêm tệp vào danh sách phát. Bây giờ tôi chỉ cần mở VLC theo cách thủ công và đợi cho nó tải xong trước khi bắt đầu tập lệnh.


Wow, đó là một giải pháp thực sự khéo léo. Kudos để có nó chạy chính xác như bạn dự định trong thời gian thực.
fideli

1
Tôi đang suy nghĩ về việc mở rộng ý tưởng đó cho một phương tiện truyền thông nhỏ, có các tính năng: thứ tự cụ thể, cắt bỏ ưa thích, trộn bộ lọc, lưu cấu hình / đọc nó từ một tệp và phát phương tiện dựa trên sự kiện. Có ai đó quan tâm đến một dự án như vậy?
tham gia

4

Tôi muốn bình luận điều này hơn là đăng một nửa câu trả lời, nhưng tôi không có đủ danh tiếng. Có lẽ ai đó khác có thể xây dựng trên này.

Tôi sẽ đề nghị tạo toàn bộ video trước. Viết tập lệnh bash để sử dụng mencoder để tạo clip bằng cách sử dụng lệnh như sau:

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

Trong lệnh đó, START sẽ là điểm bắt đầu ngẫu nhiên, MOVIE.AVI là phim nguồn ngẫu nhiên và MOVIE-CLIP - ##. Avi là một clip được tạo. Các công tắc -oac và -ovc xác định rằng các codec đầu ra phải giống với nguồn. Công tắc -endpose chỉ định độ dài của clip, được đặt thành 300 s. Lưu ý rằng điều này không có phát hiện độ dài video, mà tôi coi là một vấn đề dễ dàng giải quyết thủ công cho từng bộ phim (với điều kiện là bạn chỉ có một số ít). Kịch bản của bạn có thể lặp qua lệnh đó để tạo một số clip.

Để tham gia các clip, bạn có thể sử dụng một lệnh như:

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

Đây là nơi tôi sẽ đề nghị ai đó có nhiều kinh nghiệm chọn từ. Tôi không chắc chắn liệu có cách nào trong mencoder để thêm hiệu ứng làm mờ / hòa tan giữa các clip hay không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.