Script som triggar videohastighet beroende på .srt-fil?

Permalänk
Medlem

Script som triggar videohastighet beroende på .srt-fil?

I videouppspelningsprogram som t.ex. VLC Media Player finns det funktioner för att öka hastighet på videon, går att öka 1,5x 2x 4x osv.

Har märkt att man ofta kan se filmer på 4x utan att missa någon viktig information, med undantag av när det förekommer något tal.

Skulle det vara svårt att göra ett script som ändrar uppspelningshastigheten, så att den är 4x, med undantag av då det förekommer tal, då den återgår till 1x? Information om när det förekommer tal kan hämtas från .srt-fil.

Idéer hur man kan göra detta?

Visa signatur

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed placerat orci vitae condimentum tempor. Nulla facilisi. Interdum et malesuada fames ac ante ipsum primis in faucibus. In at sapien id felis tempor tincidunt. Cras accumsan enim elit, ut laoreet neque dapibus ac.

Permalänk
Medlem

Ptja om man bara ser en film som ett slags informationsutbyte och inte spänning/dynamik/etc etc så räcker det väl att läsa en sammanfattning på wikipedia?

Permalänk
99:e percentilen

Nog för att smaken är som baken, men är huvudsyftet med att se på film verkligen att inte "missa någon viktig information"? Vilket problem skulle du egentligen lösa om du lyckades med din idé? Tidsbrist? Är det inte då mer värt att kolla på film i normal hastighet fyra gånger så sällan, eller kanske till och med oftare än så med tanke på all tid du förmodligen kommer spara på att inte mecka med automatisk hastighetsförändring? Eller för den delen läsa en sammanfattning på valfri lämplig webbsajt (vilket till skillnad från den faktiska filmen dessutom är gratis)?

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem

Vilken helfestlig ide! Lyssna inte på de andra tramspellarna. Det är klart du ska snabbspola förbi tråkiga scener. Jag hafsade ihop något snabbt och fult som verkar lyckas med det du vill, dock för MPC-HC och inte VLC. Kräver Python med Requests-biblioteket installerat och att man har aktiverat webbinterfacet i MPC-HC. Kör så här där script.py innehåller koden nedanför och subs.srt är undertextfilen.

Jag höftade ihop ett filter med två hårdkodade parametrar så att den inte snabbspolar så fort det är någon sekund utan undertexter. filter_hysteresis styr hur långt hål i undertexterna det ska vara för att snabbspola över huvud taget och padding bestämmer hur långt innan och efter undertexterna snabbspolningen börjar och slutar. Båda är i millisekunder (eftersom MPC-HC räknade i den enheten). Om jag chansade dåligt får du ändra värdena.

import requests
import time
from sys import argv

s = requests.Session()

filter_hysteresis = 10e3
padding = 2e3

def parsetime(timestr):
split = timestr.split(":")
s = int(split[0])*3600e3 + int(split[1])*60e3 + float(split[2].replace(",", ""))
return s

# parse srt
raw = []
with open(argv[1]) as f:
for line in f.read().split("\n\n"):
split = line.split("\n")
if len(split) > 1:
raw.append([parsetime(x) for x in split[1].split(" --> ")])

# do some filtering
timestamps = []
i = 0
start = None
while i < len(raw) - 1:
if start is None:
start = raw[i][0]
if raw[i+1][0] - raw[i][1] > filter_hysteresis:
timestamps.append([start - padding, raw[i][1] + padding])
start = None
i += 1
timestamps.append([start - padding, raw[i][1] + padding])

# sync
ff = False
s.post("http://127.0.0.1:13579/command.html", data={"wm_command": 896})

# main loop
while True:
millis = int(s.get("http://127.0.0.1:13579/status.html").text.split(", ")[2])
print(millis)
for timestamp in timestamps:
if timestamp[0] < millis < timestamp[1]:
if ff:
print("normal speed")
s.post("http://127.0.0.1:13579/command.html", data={"wm_command": 896})
ff = False
break
else:
if not ff:
print("ff")
s.post("http://127.0.0.1:13579/command.html", data={"wm_command": 895})
s.post("http://127.0.0.1:13579/command.html", data={"wm_command": 895})
ff = True
time.sleep(0.05)

kåååd
Visa signatur

Spela Swemantle! Du vet att du vill.

Ibland har jag fel, men då är det någon annans fel.

Permalänk
Medlem

Om jag hade ställt denna fråga på ett filmregissörsforum hade jag förstått invändningarna men här? Eftersom jag frågar efter ett specifikt script så vet jag självklart redan vad jag är ute efter, och huruvida det är "artistiskt korrekt" eller inte, eller vad tramspellarna (för att citera LemonIllusion) nu vill säga är faktiskt helt irrelevant Kul att en person kunde hålla det on topic i alla fall

Skrivet av LemonIllusion:

Vilken helfestlig ide! Lyssna inte på de andra tramspellarna. Det är klart du ska snabbspola förbi tråkiga scener. Jag hafsade ihop något snabbt och fult som verkar lyckas med det du vill, dock för MPC-HC och inte VLC. Kräver Python med Requests-biblioteket installerat och att man har aktiverat webbinterfacet i MPC-HC. Kör så här där script.py innehåller koden nedanför och subs.srt är undertextfilen.

Jag höftade ihop ett filter med två hårdkodade parametrar så att den inte snabbspolar så fort det är någon sekund utan undertexter. filter_hysteresis styr hur långt hål i undertexterna det ska vara för att snabbspola över huvud taget och padding bestämmer hur långt innan och efter undertexterna snabbspolningen börjar och slutar. Båda är i millisekunder (eftersom MPC-HC räknade i den enheten). Om jag chansade dåligt får du ändra värdena.

import requests
import time
from sys import argv

s = requests.Session()

filter_hysteresis = 10e3
padding = 2e3

def parsetime(timestr):
split = timestr.split(":")
s = int(split[0])*3600e3 + int(split[1])*60e3 + float(split[2].replace(",", ""))
return s

# parse srt
raw = []
with open(argv[1]) as f:
for line in f.read().split("\n\n"):
split = line.split("\n")
if len(split) > 1:
raw.append([parsetime(x) for x in split[1].split(" --> ")])

# do some filtering
timestamps = []
i = 0
start = None
while i < len(raw) - 1:
if start is None:
start = raw[i][0]
if raw[i+1][0] - raw[i][1] > filter_hysteresis:
timestamps.append([start - padding, raw[i][1] + padding])
start = None
i += 1
timestamps.append([start - padding, raw[i][1] + padding])

# sync
ff = False
s.post("http://127.0.0.1:13579/command.html", data={"wm_command": 896})

# main loop
while True:
millis = int(s.get("http://127.0.0.1:13579/status.html").text.split(", ")[2])
print(millis)
for timestamp in timestamps:
if timestamp[0] < millis < timestamp[1]:
if ff:
print("normal speed")
s.post("http://127.0.0.1:13579/command.html", data={"wm_command": 896})
ff = False
break
else:
if not ff:
print("ff")
s.post("http://127.0.0.1:13579/command.html", data={"wm_command": 895})
s.post("http://127.0.0.1:13579/command.html", data={"wm_command": 895})
ff = True
time.sleep(0.05)

kåååd

Spännande! Nu ska vi se som en programmerings-retard som jag kan få rätt på detta.
Kom på att det funkar rätt bra att se även talsektioner av filmen med 2x hastighet och hinna uppfatta vad som sägs. Är det mycket ändring i koden om man ändrar så det fortfarande är 4x vid icke-tal, men 2x vid tal istället? Om du känner för det får du jättegärna lägga till en och annan kommentar i koden med så kan jag testa mig fram på egen hand.

Visa signatur

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed placerat orci vitae condimentum tempor. Nulla facilisi. Interdum et malesuada fames ac ante ipsum primis in faucibus. In at sapien id felis tempor tincidunt. Cras accumsan enim elit, ut laoreet neque dapibus ac.