정시에 답변을 얻지 못한 후 (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를 수동으로 열고로드가 완료 될 때까지 기다립니다.