User:Manetta/prototyping/2001-annotated-cut-ups
annotated cut ups
(proces scripts here step 1-3)
As I was thinking to create an excercise of the semantic-web by working with film, i started to write annotations in a spreadsheat-file. There, I notated a starting and ending time, and described the actions of the characters and objects that are present in that shot. When turning these annotations in subtitle files, it produces a very descriptive layer onto the film. (and i doubt that that is bringing the viewer that much). I wrote the descriptions in the form of so called 'triples'. A triple is a description used in markup-languages as RDF, which contains three elements:
triple = subject + predicate + object
example: Dave + is located in + main room
the first lines of the annotations:
00:00:00.00,00:00:07.00,space,is located in,between stars 00:00:07.00,00:01:08.00,spaceship,is located in,space,#,spaceflight,flying to,jupiter,#,spaceship,performs,spaceflight 00:01:08.00,00:01:19.00,spaceship,is located in,space 00:01:19.00,00:01:31.00,spaceship,is located in,space 00:01:31.00,00:01:47.00,dave,is located in,main room,,dave ,running at,main room,,main room ,is located in ,spaceship 00:01:47.00,00:01:56.00,other three astronauts,is located in,hybernation beds 00:01:56.00,00:02:23.00,dave,is located in,main room,,dave ,running at,main room 00:02:23.00,00:02:30.00,dave,is located in,main room,,dave ,running at,main room
2. create subtitle file from csv file
Then, i turned the annotations from csv into a subtitle file.
import os
import csv
import itertools
# SIMPLE SRT:
with open('2001-space-odyssey-simple.srt', 'w') as txt:
with open('2001-chunks-annotations-01-simple.csv', 'rb') as f:
reader = csv.reader(f)
i=1
for row in reader:
start = row[0]
end = row[1]
x1 = row[2]
r1 = row[3]
y1 = row[4]
x2 = row[6]
r2 = row[7]
y2 = row[8]
x3 = row[10]
r3 = row[11]
y3 = row[12]
x4 = row[14]
r4 = row[15]
y4 = row[16]
x5 = row[18]
r5 = row[19]
y5 = row[20]
x6 = row[22]
r6 = row[23]
y6 = row[24]
x7 = row[26]
r7 = row[27]
y7 = row[28]
x8 = row[30]
r8 = row[31]
y8 = row[32]
x9 = row[34]
r9 = row[35]
y9 = row[36]
a = i
b = start+" --> "+end
c = x1+" "+r1+" "+y1+"\n"+x2+" "+r2+" "+y2+"\n"+<br>x3+" "+r3+" "+y3+"\n"+x4+" "+r4+" "+y4+"\n"+x5+" "+<br>r5+" "+y5+"\n"+x6+" "+r6+" "+y6+"\n"+<br>x7+" "+r7+" "+y7+"\n"+x8+" "+r8+" "+y8+"\n"+<br>x9+" "+r9+" "+y9+"\n\n\n"
# print c
txt.write(str(a)+"\n")
txt.write(b+"\n")
txt.write(c)
i=i+1
1 00:00:00.00 --> 00:00:07.00 space is located in between stars 2 00:00:07.00 --> 00:01:08.00 spaceship is located in space spaceflight flying to jupiter spaceship performs spaceflight 3 00:01:08.00 --> 00:01:19.00 spaceship is located in space 4 00:01:19.00 --> 00:01:31.00 spaceship is located in space 5 00:01:31.00 --> 00:01:47.00 dave is located in main room dave running at main room main room is located in spaceship 6 00:01:47.00 --> 00:01:56.00 other three astronauts is located in hybernation beds
2001 'element' clips
After annotating the first 8 minutes of the Jupiter Mission (part of 2001, a Space Odyssey), i created a set of 28 clips containing all the shots in which a certain 'element' is present (including the connections). To do this, i used videogrep to search for an 'element' in the subtitles i just created:
searching with regular expressions (re) for either 'dave' and 'dave)'
import os
import re
p = "python videogrep.py --input 2001-space-odyssey-jupiter-mission.avi --search 'dave\ |dave\)' --output video-dave.mp4"
print p
os.system(p)
The following clips are videogrepped at the following terms:
undefined room
Dave
HAL
button
main room
tablet
reassembled version of 2001
This made it possible to later on connect the different characters and locations in the film, by doing a set of 'search and replace' queries. And so this connected for example every shot of the 'main room' with a shot of the 'spaceship', as the main room is located in the space ship.
This method uses the relations that are created in the film, using the act of deduction: when the main room has a fixed truth of being in the spaceship, all the shots that contain 'main room' are connected to the 'spaceship' shots.
I wanted to bring these videogrepped clips back to the film, to create a reassembled version of 2001, based on these relations. So then I created an ordering of the grepped videoclips, and exported a new videofile where the grepped clips are timestretched to the original shotduration:
from __future__ import division
import os
import csv
import re
import glob
import subprocess as sub
import datetime
import itertools
# open csv with duration column in it:
with open('../2001-chunks-annotations-01-duration.csv', 'rb') as f:
reader = csv.reader(f)
i=0
# *** GET DURATION OF CSV SHEET (ORIGINAL SHOT DURATION) ***
for row in reader:
shotduration = row[3]
print shotduration
# --> if using an integer number:
# shotduration = "".join(shotduration)
# shotduration = shotduration.split('.')
# shotduration = shotduration[0]
# SHOTDURATION / GREPPEDDURATION = SETPTS
# *** LIST OF VIDEO'S TO REPLACE ORIGINAL SHOTS ***
videofiles = [
'video-between-stars.mp4',
'video-jupiter.mp4',
'video-space.mp4',
'video-space.mp4',
'video-main-room.mp4',
'video-hybernation-beds.mpeg',
'video-main-room.mp4',
'video-main-room.mp4',
'video-main-room.mp4',
'video-undefined-room.mp4',
'video-food.mp4',
'video-button.mp4',
'video-door.mp4',
'video-frank.mp4',
'video-button.mp4',
'video-button.mp4',
'video-BBC.mp4',
'video-main-room.mp4',
'video-tablet.mp4',
'video-couch.mp4',
'video-earth.mp4',
'video-other-three-astronauts.mpeg',
'video-frank-and-dave.mp4',
'video-hybernation.mp4',
'video-tablet.mp4',
'video-earth.mp4',
'video-hybernation-beds.mpeg',
'video-food.mp4',
'video-frank-at-tablet.mp4',
'video-frank-and-dave-at-tablet.mp4',
'video-hybernation-beds.mpeg',
'video-HAL.mp4',
'video-main-room.mp4',
'video-earth.mp4',
'video-HAL.mp4',
'video-earth.mp4',
'video-BBC.mp4',
'video-eating-table.mp4',
'video-tablet.mp4',
'video-earth.mp4',
'video-frank-at-tablet.mp4',
'video-HAL.mp4',
'video-tablet.mp4',
'video-main-room.mp4',
'video-HAL.mp4'
]
# print videofiles[i]
# *** READING DURATION OF LIST OF VIDEOFILES***
v = "ffmpeg -i "+videofiles[i]+" 2>&1 | grep Duration | awk '{print $2}' | tr -d ,"
# print v
p = os.popen(v,'rb')
while 1:
line = p.readline()
if not line: break
# print line
number = line.split(':')
# print number[0]
# *** CONVERTING TIMESTAMP
# TO INTEGER (IN SECONDS) ***
hours = float(number[0])*2400
# print number[1]
minutes = float(number[1])*60
# print number[2]
seconds = float(number[2])
# --> if using integer number:
# seconds = number[2].split('.')
# seconds = seconds[0]
clipduration = float(hours)+float(minutes)+float(seconds)
print clipduration
# set stretch value:
pts = float(shotduration) / float(clipduration)
print pts
# print i
# *** STRETCH THE VIDEOFILES TO ORIGINAL SHOT DURATION
# (DIVIDING SHOTDURATION / CLIPDURATION)
# SHOTDURATION = FROM ORIGINAL FILM SPEED
# CLIPDURATION = LENGTH OF VIDEOGREPPED VIDEOS ***
x = "ffmpeg -i "+videofiles[i]+" -vf 'setpts="+str(pts)+"*PTS' -an -y export/0"+str(i)+".mpeg"
print x
os.system(x)
# *** WRITE VIDEO FILENAME TO TXT FILE ***
with open('clipslist.txt', 'w') as txt:
m = 0
for video in videofiles:
print>>txt,"file 'export/0"+str(m)+".mpeg'"
m=m+1
print "ENDING"
i=i+1
# *** joining the stretched clips together in one file ***
a = "ffmpeg -f concat -i clipslist.txt -c copy 2001-joined-clips-01.avi"
print a
os.system(a)
end of process
As the clips became quite repetitive, and the system behind it quite complex, i decided to leave the clips here, and focus on 2001 from a different perspective.