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 스크립트를 작성했습니다. 이 스크립트는 먼저 모든 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

4

나는 반 답변을 게시하기보다는 이것을 언급하고 싶지만 평판이 충분하지 않습니다. 아마도 다른 누군가가 이것을 만들 수 있습니다.

미리 전체 비디오를 만드는 것이 좋습니다. mencoder를 사용하여 다음과 같은 명령을 사용하여 클립을 생성하는 bash 스크립트를 작성하십시오.

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.