commit ced6babcca170e59f7a96418db9dceae7295f98a
parent 5e2182abf910ef6c0c681eed0811351d44cde145
Author: rbckman <rob@tarina.org>
Date: Wed, 22 Jan 2025 19:22:46 +0000
save trim details for render and blend support
Diffstat:
M | gonzopi.py | | | 253 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------- |
1 file changed, 174 insertions(+), 79 deletions(-)
diff --git a/gonzopi.py b/gonzopi.py
@@ -123,8 +123,8 @@ def main():
gonzopifolder = os.getcwd()
#MENUS
- standardmenu = 'DSK:', 'FILM:', 'SCENE:', 'SHOT:', 'TAKE:', '', 'SHUTTER:', 'ISO:', 'RED:', 'BLUE:', 'FPS:', 'Q:', 'BRIGHT:', 'CONT:', 'SAT:', 'SFX:', 'FLIP:', 'BEEP:', 'LENGTH:', 'HW:', 'CH:', 'MIC:', 'PHONES:', 'COMP:', 'TIMELAPSE', 'MODE:', 'SHUTDOWN', 'SRV:', 'SEARCH:', 'WIFI:', 'UPDATE', 'UPLOAD', 'BACKUP', 'LOAD', 'NEW', 'TITLE', 'LIVE:'
- gonzopictrlmenu = 'DSK:', 'FILM:', 'SCENE:', 'SHOT:', 'TAKE:', '', 'SHUTTER:', 'ISO:', 'RED:', 'BLUE:', 'FPS:', 'Q:', 'BRIGHT:', 'CONT:', 'SAT:', 'SFX:', 'FLIP:', 'BEEP:', 'LENGTH:', 'HW:', 'CH:', 'MIC:', 'PHONES:', 'COMP:', 'TIMELAPSE', 'MODE:','SHUTDOWN', 'SRV:', 'SEARCH:', 'WIFI:', 'CAMERA:', 'Add CAMERA', 'New FILM', 'New SCENE', 'Sync SCENE'
+ standardmenu = 'DSK:', 'FILM:', 'SCENE:', 'SHOT:', 'TAKE:', '', 'SHUTTER:', 'ISO:', 'RED:', 'BLUE:', 'FPS:', 'Q:', 'BRIGHT:', 'CONT:', 'SAT:', 'SFX:', 'FLIP:', 'BEEP:', 'LENGTH:', 'HW:', 'CH:', 'MIC:', 'PHONES:', 'COMP:', 'TIMELAPSE', 'BLEND:', 'CROSSFADE:', 'MODE:', 'SHUTDOWN', 'SRV:', 'SEARCH:', 'WIFI:', 'UPDATE', 'UPLOAD', 'BACKUP', 'LOAD', 'NEW', 'TITLE', 'LIVE:'
+ gonzopictrlmenu = 'DSK:', 'FILM:', 'SCENE:', 'SHOT:', 'TAKE:', '', 'SHUTTER:', 'ISO:', 'RED:', 'BLUE:', 'FPS:', 'Q:', 'BRIGHT:', 'CONT:', 'SAT:', 'SFX:', 'FLIP:', 'BEEP:', 'LENGTH:', 'HW:', 'CH:', 'MIC:', 'PHONES:', 'COMP:', 'TIMELAPSE', 'BLEND:', 'CROSSFADE:', 'MODE:', 'SHUTDOWN', 'SRV:', 'SEARCH:', 'WIFI:', 'CAMERA:', 'Add CAMERA', 'New FILM', 'New SCENE', 'Sync SCENE'
#gonzopictrlmenu = "BACK","CAMERA:", "Add CAMERA","New FILM","","New SCENE","Sync SCENE","Snapshot"
emptymenu='','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',''
menu = standardmenu
@@ -142,6 +142,10 @@ def main():
awb_lock = 'no'
effects = 'none', 'negative', 'solarize'
effectselected = 0
+ blendmodes = 'screen', 'average', 'darken', 'lighten', 'burn', 'multiply'
+ blendselect=0
+ blending=False
+ crossfade=0
cammode = 'film'
camera_model=''
fps = 25
@@ -479,29 +483,19 @@ def main():
trim = playdub(filmname,foldername + filename, 'shot')
if trim[0] == 'beginning' or trim[0] == 'end':
writemessage('Cutting clip...')
- take = counttakes(filmname, filmfolder, scene, shot)+1
- trim_filename = foldername + 'take' + str(take).zfill(3)
- videotrim(foldername, foldername + filename, trim_filename, trim[0], trim[1])
+ videotrimsave(foldername, trim[0], trim[1], filename)
elif trim[0] >= trim[1]:
trim = [trim[0],0]
elif trim[0] != 0 and trim[1] != 0:
writemessage('Cutting clip...')
- take = counttakes(filmname, filmfolder, scene, shot)+1
- trim_filename = foldername + 'take' + str(take).zfill(3)
- videotrim(foldername, foldername + filename, trim_filename, 'end', trim[1])
- take = counttakes(filmname, filmfolder, scene, shot)+1
- trim_filename2 = foldername + 'take' + str(take).zfill(3)
- videotrim(foldername, trim_filename, trim_filename2, 'beginning', trim[0])
+ videotrimsave(foldername, 'end', trim[1], filename)
+ videotrimsave(foldername, 'beginning', trim[0], filename)
elif trim[0] == 0 and trim[1] != 0:
writemessage('Cutting clip...')
- take = counttakes(filmname, filmfolder, scene, shot)+1
- trim_filename = foldername + 'take' + str(take).zfill(3)
- videotrim(foldername, foldername + filename, trim_filename, 'end', trim[1])
+ videotrimsave(foldername, 'end', trim[1], filename)
if trim[0] != 0 and trim[1] == 0:
writemessage('Cutting clip...')
- take = counttakes(filmname, filmfolder, scene, shot)+1
- trim_filename = foldername + 'take' + str(take).zfill(3)
- videotrim(foldername, foldername + filename, trim_filename, 'beginning', trim[0])
+ videotrimsave(foldername, 'beginning', trim[0], filename)
imagename = foldername + filename + '.jpeg'
overlay = displayimage(camera, imagename, overlay, 3)
camera.start_preview()
@@ -509,6 +503,20 @@ def main():
vumetermessage('nothing here! hit rec!')
rendermenu = True
updatethumb=True
+ #BLEND
+ elif pressed == 'middle' and menu[selected] == 'BLEND:':
+ videolenght=0
+ filename = filmfolder + filmname + '/scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/take' + str(take).zfill(3)
+ compileshot(filename,filmfolder,filmname)
+ pipe = subprocess.check_output('mediainfo --Inform="Video;%Duration%" ' + filename + '.mp4', shell=True)
+ videolenght = pipe.decode().strip()
+ videolenght=(int(videolenght)/1000)-0.2
+ if videolenght > 1:
+ selected=3
+ vumetermessage('select what shot to blend on')
+ blending=True
+ reclenght=videolenght
+ pressed='record'
#DUB SHOT
elif pressed == 'middle' and menu[selected] == 'SHOT:' and recordable == False:
newdub = clipsettings(filmfolder, filmname, scene, shot, take, plughw)
@@ -1326,21 +1334,26 @@ def main():
if pressed == 'record' and recordwithports==False or pressed == 'record_now' or pressed == 'retake_now' or pressed == 'retake' and recordwithports==False or reclenght != 0 and t > reclenght:
overlay = removeimage(camera, overlay)
if recording == False and recordable == True or recording == False and pressed == 'record_now' or recording == False and pressed == 'retake_now':
- #camera_recording=0
- scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
- if pressed == "record":
- #shot = shots+1
- take = takes+1
- elif pressed == "retake":
- take = takes+1
- elif pressed == 'record_now':
- shot=shots+1
- take=1
- elif pressed == 'retake_now':
- takes = counttakes(filmname, filmfolder, scene, shot)
- take = takes + 1
- foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/'
- filename = 'take' + str(take).zfill(3)
+ #camera_recording=0
+ if blending == False:
+ scenes, shots, takes = browse(filmname,filmfolder,scene,shot,take)
+ if pressed == "record":
+ #shot = shots+1
+ take = takes+1
+ elif pressed == "retake":
+ take = takes+1
+ elif pressed == 'record_now':
+ shot=shots+1
+ take=1
+ elif pressed == 'retake_now':
+ takes = counttakes(filmname, filmfolder, scene, shot)
+ take = takes + 1
+ foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/'
+ filename = 'take' + str(take).zfill(3)
+ else:
+ foldername = filmfolder + filmname + '/' + 'scene' + str(scene).zfill(3) +'/shot' + str(shot).zfill(3) + '/blend/'
+ filename = blendmodes[blendselect]
+ blending=False
if beeps > 0 and beeping == False:
beeping = True
beepcountdown = beeps
@@ -1504,6 +1517,9 @@ def main():
if effectselected < len(effects) - 1:
effectselected += 1
camera.image_effect = effects[effectselected]
+ elif menu[selected] == 'BLEND:':
+ if blendselect < len(blendmodes) - 1:
+ blendselect += 1
elif menu[selected] == 'SHUTTER:':
if camera.shutter_speed == 0:
camera.shutter_speed = camera.exposure_speed
@@ -1682,6 +1698,9 @@ def main():
if effectselected > 0:
effectselected -= 1
camera.image_effect = effects[effectselected]
+ elif menu[selected] == 'BLEND:':
+ if blendselect > 0:
+ blendselect -= 1
elif menu[selected] == 'SHUTTER:':
if camera.shutter_speed == 0:
camera.shutter_speed = camera.exposure_speed
@@ -2002,12 +2021,12 @@ def main():
lastmenu = menu[selected]
if showgonzopictrl == False:
menu = standardmenu
- settings = storagedrives[dsk][0]+' '+diskleft, filmname, str(scene) + '/' + str(scenes), str(shot) + '/' + str(shots), str(take) + '/' + str(takes), rectime, camerashutter, cameraiso, camerared, camerablue, str(round(camera.framerate)), str(quality), str(camera.brightness), str(camera.contrast), str(camera.saturation), effects[effectselected], str(flip), str(beeps), str(round(reclenght,2)), str(plughw), str(channels), str(miclevel), str(headphoneslevel), str(comp), '', cammode, '', serverstate, searchforcameras, wifistate, '', '', '', '', '', '', live
+ settings = storagedrives[dsk][0]+' '+diskleft, filmname, str(scene) + '/' + str(scenes), str(shot) + '/' + str(shots), str(take) + '/' + str(takes), rectime, camerashutter, cameraiso, camerared, camerablue, str(round(camera.framerate)), str(quality), str(camera.brightness), str(camera.contrast), str(camera.saturation), effects[effectselected], str(flip), str(beeps), str(round(reclenght,2)), str(plughw), str(channels), str(miclevel), str(headphoneslevel), str(comp), '',blendmodes[blendselect],str(crossfade), cammode, '', serverstate, searchforcameras, wifistate, '', '', '', '', '', '', live
else:
- #gonzopictrlmenu = 'FILM:', 'SCENE:', 'SHOT:', 'TAKE:', '', 'SHUTTER:', 'ISO:', 'RED:', 'BLUE:', 'FPS:', 'Q:', 'BRIGHT:', 'CONT:', 'SAT:', 'FLIP:', 'BEEP:', 'LENGTH:', 'HW:', 'CH:', 'MIC:', 'PHONES:', 'COMP:', 'TIMELAPSE', 'MODE:', 'DSK:', 'SHUTDOWN', 'SRV:', 'SEARCH:', 'WIFI:', 'CAMERA:', 'Add CAMERA', 'New FILM', 'Sync FILM', 'Sync SCENE'
+ #gonzopictrlmenu = 'FILM:', 'SCENE:', 'SHOT:', 'TAKE:', '', 'SHUTTER:', 'ISO:', 'RED:', 'BLUE:', 'FPS:', 'Q:', 'BRIGHT:', 'CONT:', 'SAT:', 'FLIP:', 'BEEP:', 'LENGTH:', 'HW:', 'CH:', 'MIC:', 'PHONES:', 'COMP:', 'TIMELAPSE', 'BLEND:', 'CROSSFADE:', 'MODE:', 'DSK:', 'SHUTDOWN', 'SRV:', 'SEARCH:', 'WIFI:', 'CAMERA:', 'Add CAMERA', 'New FILM', 'Sync FILM', 'Sync SCENE'
menu = gonzopictrlmenu
#settings = '',str(camselected),'','',rectime,'','','','','','','','','',''
- settings = storagedrives[dsk][0]+' '+diskleft, filmname, str(scene) + '/' + str(scenes), str(shot) + '/' + str(shots), str(take) + '/' + str(takes), rectime, camerashutter, cameraiso, camerared, camerablue, str(round(camera.framerate)), str(quality), str(camera.brightness), str(camera.contrast), str(camera.saturation), effects[effectselected], str(flip), str(beeps), str(reclenght), str(plughw), str(channels), str(miclevel), str(headphoneslevel), str(comp), '', cammode, '', serverstate, searchforcameras, wifistate, str(camselected+1), '', '', '', '', '', ''
+ settings = storagedrives[dsk][0]+' '+diskleft, filmname, str(scene) + '/' + str(scenes), str(shot) + '/' + str(shots), str(take) + '/' + str(takes), rectime, camerashutter, cameraiso, camerared, camerablue, str(round(camera.framerate)), str(quality), str(camera.brightness), str(camera.contrast), str(camera.saturation), effects[effectselected], str(flip), str(beeps), str(reclenght), str(plughw), str(channels), str(miclevel), str(headphoneslevel), str(comp), '',blendmodes[blendselect],str(crossfade), cammode, '', serverstate, searchforcameras, wifistate, str(camselected+1), '', '', '', '', '', ''
#Rerender menu if picamera settings change
#if settings != oldsettings or selected != oldselected:
writemenu(menu,settings,selected,'',showmenu)
@@ -2356,10 +2375,27 @@ def counttakes(filmname, filmfolder, scene, shot):
allfiles = []
return takes
for a in allfiles:
- if '.mp4' in a or '.h264' in a:
- if not doubles.replace('.h264', '.mp4') == a:
- takes = takes + 1
- doubles = a
+ if 'take' in a:
+ if '.mp4' in a or '.h264' in a:
+ if not doubles.replace('.h264', '.mp4') == a:
+ takes = takes + 1
+ doubles = a
+ return takes
+
+def counttakes2(folder):
+ takes = 0
+ doubles = ''
+ try:
+ allfiles = os.listdir(folder)
+ except:
+ allfiles = []
+ return takes
+ for a in allfiles:
+ if 'take' in a:
+ if '.mp4' in a or '.h264' in a:
+ if not doubles.replace('.h264', '.mp4') == a:
+ takes = takes + 1
+ doubles = a
return takes
#-----------Count videos on floor-----
@@ -3399,44 +3435,45 @@ def organize(filmfolder, filmname):
print(sorted(takes))
#time.sleep(2)
for s in sorted(takes):
- if '.mp4' in s or '.h264' in s:
- unorganized_nr = int(s[4:7])
- takename = filmfolder + filmname + '/' + i + '/' + p + '/take' + str(unorganized_nr).zfill(3)
- if '.mp4' in s:
- origin=os.path.realpath(takename+'.mp4')
- if origin != os.path.abspath(takename+'.mp4'):
- print('appending: '+origin)
- origin_files.append(origin)
- origin_scene_files.append(origin)
- if os.path.isfile(takename+'.h264'):
- print('oh no boubles found!')
- if '.h264' in s:
- origin=os.path.realpath(takename+'.h264')
- if origin != os.path.abspath(takename+'.h264'):
- origin_files.append(origin)
- origin_scene_files.append(origin)
- if organized_nr == unorganized_nr:
- #print('correct')
- pass
- if organized_nr != unorganized_nr:
- print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
- print(s)
- #time.sleep(3)
- mv = 'mv ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(unorganized_nr).zfill(3)
- run_command(mv + '.mp4 ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.mp4')
- run_command(mv + '.h264 ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.h264')
- run_command(mv + '.wav ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.wav')
- run_command(mv + '.jpeg ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.jpeg')
- #check if same video has both h246 and mp4 and render and remove h264
- for t in sorted(takes):
- if t.replace('.mp4','') == s.replace('.h264','') or s.replace('.mp4','') == t.replace('.h264',''):
- logger.info('Found both mp4 and h264 of same video!')
- logger.info(t)
- logger.info(s)
- #time.sleep(5)
- compileshot(takename,filmfolder,filmname)
- organized_nr -= 1
- organized_nr += 1
+ if 'take' in s:
+ if '.mp4' in s or '.h264' in s:
+ unorganized_nr = int(s[4:7])
+ takename = filmfolder + filmname + '/' + i + '/' + p + '/take' + str(unorganized_nr).zfill(3)
+ if '.mp4' in s:
+ origin=os.path.realpath(takename+'.mp4')
+ if origin != os.path.abspath(takename+'.mp4'):
+ print('appending: '+origin)
+ origin_files.append(origin)
+ origin_scene_files.append(origin)
+ if os.path.isfile(takename+'.h264'):
+ print('oh no boubles found!')
+ if '.h264' in s:
+ origin=os.path.realpath(takename+'.h264')
+ if origin != os.path.abspath(takename+'.h264'):
+ origin_files.append(origin)
+ origin_scene_files.append(origin)
+ if organized_nr == unorganized_nr:
+ #print('correct')
+ pass
+ if organized_nr != unorganized_nr:
+ print('false, correcting from ' + str(unorganized_nr) + ' to ' + str(organized_nr))
+ print(s)
+ #time.sleep(3)
+ mv = 'mv ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(unorganized_nr).zfill(3)
+ run_command(mv + '.mp4 ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.mp4')
+ run_command(mv + '.h264 ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.h264')
+ run_command(mv + '.wav ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.wav')
+ run_command(mv + '.jpeg ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.jpeg')
+ #check if same video has both h246 and mp4 and render and remove h264
+ for t in sorted(takes):
+ if t.replace('.mp4','') == s.replace('.h264','') or s.replace('.mp4','') == t.replace('.h264',''):
+ logger.info('Found both mp4 and h264 of same video!')
+ logger.info(t)
+ logger.info(s)
+ #time.sleep(5)
+ compileshot(takename,filmfolder,filmname)
+ organized_nr -= 1
+ organized_nr += 1
origin_files.extend(origin_scene_files)
with open(filmfolder+filmname+'/'+i+'/.origin_videos', 'w') as outfile:
outfile.write('\n'.join(str(i) for i in origin_scene_files))
@@ -3763,6 +3800,11 @@ def scenefiles(filmfolder, filmname):
#time.sleep(2)
return files
+
+
+
+
+
#-------------Render Shot-------------
def rendershot(filmfolder, filmname, renderfilename, scene, shot):
@@ -3810,6 +3852,41 @@ def rendershot(filmfolder, filmname, renderfilename, scene, shot):
# # run_command('rm ' + renderfilename + '*')
# status='',''
# q.put(status)
+
+ #EDITS AND FX
+ if os.path.isfile(scenedir+'.beginning') == True:
+ settings = pickle.load(open(scenedir + ".beginning", "rb"))
+ s, trimfile = settings
+ logger.info("settings loaded")
+ videotrim(scenedir,trimfile,'beginning', s)
+ os.remove(scenedir+'.beginning')
+ #readcutinout
+ #cutvideo()
+ newaudiomix = True
+ if os.path.isfile(scenedir+'.end') == True:
+ try:
+ settings = pickle.load(open(scenedir + ".end", "rb"))
+ s, trimfile = settings
+ logger.info("settings loaded")
+ videotrim(scenedir,trimfile,'end', s)
+ os.remove(scenedir+'.end')
+ except:
+ logger.info("couldnt load settings")
+ #readcutinout
+ #cutvideo()
+ newaudiomix = True
+ if os.path.isfile(scenedir+'blend/screen.h264') == True:
+ compileshot(scenedir+'blend/screen.h264',filmfolder,filmname)
+ run_command('ffmpeg -i '+renderfilename+'.mp4 -i '+scenedir+'blend/screen.mp4 -filter_complex "blend=screen" /dev/shm/screen.mp4')
+ run_command('cp /dev/shm/screen.mp4 '+renderfilename+'.mp4')
+ run_command('rm /dev/shm/screen.mp4')
+ #ffmpeg -i blendtest.mp4 -i blendtest3.mp4 -filter_complex "blend=screen" output2.mp4
+ newaudiomix = True
+ if os.path.isfile(scenedir+'dub/.crossfade.mp4') == True:
+ #ffmpeg -i blendtest.mp4 -i blendtest.mp4 -filter_complex "xfade=offset=4.5:duration=1" output3.mp4
+ #crossfade()
+ pass
+
try:
with open(scenedir + '.videohash', 'r') as f:
oldvideohash = f.readline().strip()
@@ -4414,6 +4491,7 @@ def clipsettings(filmfolder, filmname, scene, shot, take, plughw):
elif pressed == 'left':
if selected > 0:
selected = selected - 1
+
elif pressed == 'middle' and menu[selected] == 'BACK':
os.system('pkill aplay')
break
@@ -4755,14 +4833,31 @@ def viewfilm(filmfolder, filmname):
scene = scene + 1
return filmfiles
+
+#--------------Save video trim settings-----------------
+
+def videotrimsave(filmfolder, where, s, trimfile):
+ #db.insert('videos', tid=datetime.datetime.now())
+ settings=s,trimfile
+ try:
+ with open(filmfolder + "."+where, "wb") as f:
+ pickle.dump(settings, f)
+ #logger.info("settings saved")
+ except:
+ logger.warning("could not save settings")
+ #logger.warning(e)
+ return
+
#---------------Video Trim--------------------
-def videotrim(foldername ,filename, trim_filename, where, s):
+def videotrim(foldername ,filename, where, s):
#theres two different ways of non-rerendering mp4 cut techniques that i know MP4Box and ffmpeg
+ trim_filename = foldername+filename[:-3] + str(counttakes2(foldername)+1).zfill(3)
+ filename=foldername+filename
if where == 'beginning':
logger.info('trimming clip from beginning')
#run_command('ffmpeg -ss ' + str(s) + ' -i ' + filename + '.mp4 -c copy ' + trim_filename + '.mp4')
- run_command('MP4Box ' + filename + '.mp4 -splitx ' + str(s) + ':end -out ' + trim_filename + '.mp4')
+ run_command('MP4Box ' + filename + '.mp4 -splitx ' + str(s) + ':end -out ' + trim_filename + '.mp4')
run_command('cp ' + filename + '.wav ' + trim_filename + '.wav')
audiotrim(trim_filename, 'beginning','')
if os.path.exists(foldername+'dub') == True: