Sempervivum
Erfahrenes Mitglied
Dieses Skript hat zwei Hauptfunktionen:
1. Zuweisen eines Thumbnail bzw. Posterimage zu einem MP4-Video.
2. Erzeugen einer Sidecar-Datei, die den VLC-Player steuert.
Wie man sieht ist es schon ein wenig lang geworden und der nächste Schritt wäre, es objektorientiert anzulegen entspr. den beiden Hauptfunktionen.
Und eine Validierung der Zeit vor dem Speichern wäre noch angebracht.
Beim Abspielen wird dann der VLC-Player aufgerufen und Lautstärke und Startzeit übergeben:
1. Zuweisen eines Thumbnail bzw. Posterimage zu einem MP4-Video.
2. Erzeugen einer Sidecar-Datei, die den VLC-Player steuert.
Code:
import sys
import os
from shutil import copyfile
import json
import vlc
import time
import re
import tkinter as tk
from PIL import ImageTk, Image
try:
# texts for start and stop preview button:
txtStartPreview = "Start Preview"
txtStopPreview = "Stop Preview"
# height of preview for thumb:
hPreview = 200
print(str(sys.argv))
# path without extension:
path = os.path.splitext(sys.argv[1])[0]
# extension:
extension = os.path.splitext(sys.argv[1])[1]
# path of video:
videoPath = sys.argv[1]
# path for playerinfo:
infoPath = path + ".playerinfo"
# path for thumbnail:
thumbPath = path + "-thumb.jpg"
# path for temp video:
tempPath = path + "-temp" + extension
print(tempPath)
def parseTimeStr(str):
mo = re.match("(\d{2}):(\d{2}):(\d{2})(\.\d{0,3})?", str)
if mo:
grps = mo.groups()
ms = int(grps[0]) * 3600 + int(grps[1]) * 60 + int(grps[2])
if grps[3] != None:
ms += float(grps[3])
else:
ms = -1
return ms
# create thumbnail:
def createThumb():
# ffmpeg -ss 00:00:45 -i test2.mp4 -vframes 10 -q:v 2 thumb%2d.jpg
# delete old thumb if exists:
if os.path.exists(thumbPath):
os.remove(thumbPath)
# create thumb by use of ffmpeg:
os.system(
"ffmpeg -ss "
+ entryTime.get()
+ r' -i "' +
tempPath + '" -vframes 1 -q:v 2 "' + thumbPath + '"'
)
# display preview of thumbnail:
img = Image.open(thumbPath)
width, height = img.size
newWidth = int(width * hPreview / height)
img = img.resize((newWidth, hPreview), Image.ANTIALIAS)
img = ImageTk.PhotoImage(img)
label.configure(image=img)
label.image = img
applyButton.configure(state=tk.NORMAL)
# apply thumbnail to video:
def applyThumb():
# ffmpeg -i video.mp4 -i image.png -map 1 -map 0 -c copy -disposition:0 attached_pic out.mp4
os.system(
r'ffmpeg -i "' +
tempPath + '" -i "' + thumbPath +
'" -map 1 -map 0 -c copy -disposition:0 attached_pic "' +
videoPath + '"'
)
# Preview in VLC player:
def previewStart():
global player
if previewButton.cget('text') == txtStartPreview:
previewButton.configure(text=txtStopPreview)
previewIsPlaying = True
try:
vlcInstance
except:
vlcInstance = vlc.Instance(
"--input-repeat=-1", "--fullscreen")
player = vlcInstance.media_player_new()
media = vlcInstance.media_new(sys.argv[1])
media.get_mrl()
player.set_media(media)
media.add_option(
"start-time=" + str(parseTimeStr(entryTime.get())))
player.play()
else:
player.stop()
previewButton.configure(text=txtStartPreview)
previewIsPlaying = False
# create file containing params:
def saveParams():
params = {"volume": 25, "startTime": parseTimeStr(entryTime.get())}
jsonParams = json.dumps(params)
f = open(infoPath, "w")
f.write(jsonParams)
f.close()
# create temp video file:
copyfile(videoPath, tempPath)
# create GUI:
root = tk.Tk()
# create entry for time:
entryTime = tk.Entry(root)
entryTime.insert(0, "00:00:30")
entryTime.pack(padx=5, pady=5)
# frame for creating thumbs:
frameThumb = tk.Frame(root, bd=2, relief=tk.GROOVE)
frameThumb.pack(fill=tk.X)
# create label for preview:
label = tk.Label(frameThumb)
label.pack(padx=5, pady=5)
# create button for creating thumbnail:
createButton = tk.Button(
frameThumb, text="Create Thumb", command=createThumb)
createButton.pack(padx=5, pady=5)
# create button for applying thumbnail:
applyButton = tk.Button(frameThumb, text="Apply Thumb",
command=applyThumb, state=tk.DISABLED)
applyButton.pack(padx=5, pady=5)
# frame for creating player info:
frameParams = tk.Frame(root, bd=2, relief=tk.GROOVE)
frameParams.pack(fill=tk.X)
# create button for preview start and stop:
previewButton = tk.Button(frameParams, text=txtStartPreview,
command=previewStart)
previewButton.pack(padx=5, pady=5)
# create button for saving player info:
paramsButton = tk.Button(
frameParams, text="Save Params", command=saveParams)
paramsButton.pack(padx=5, pady=5)
root.mainloop()
except:
print("Error at line", sys.exc_info()[2].tb_lineno, sys.exc_info()[0])
Und eine Validierung der Zeit vor dem Speichern wäre noch angebracht.
Beim Abspielen wird dann der VLC-Player aufgerufen und Lautstärke und Startzeit übergeben:
Code:
import glob
import sys
import os
import json
import subprocess
try:
print("args:", str(sys.argv))
infoPath = os.path.splitext(sys.argv[1])[0] + ".playerinfo"
if os.path.isfile(infoPath):
print(infoPath)
f = open(infoPath, "r")
info = json.loads(f.read())
f.close()
print(str(info))
else:
info = {'volume': 25, 'startTime': 0}
vlcPath = "C:\\Program Files\\Multimedia\\VLC\\vlc.exe"
print(str(info['volume']))
subprocess.call([
vlcPath, sys.argv[1],
"--directx-volume=" + str(info['volume']),
":start-time=" + str(info['startTime'])
])
except:
print("Error at line", sys.exc_info()[2].tb_lineno, sys.exc_info()[0])
input()