commit 4c1b4a76c3360b43fda53de2432f6a6c661f9241
parent 762f788de9c30fd9cf32e6b2f1a5049dd1333171
Author: rbckman <rob@tarina.org>
Date: Wed, 9 Apr 2025 21:54:46 +0300
need to faststart mp4, writing to database again, checking if video is already faststarted through database
Diffstat:
M | VERSION | | | 2 | +- |
M | gonzopi.py | | | 126 | +++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------- |
2 files changed, 83 insertions(+), 45 deletions(-)
diff --git a/VERSION b/VERSION
@@ -1,2 +1,2 @@
-2.01
+2.02
Gilliam
diff --git a/gonzopi.py b/gonzopi.py
@@ -467,6 +467,7 @@ def main():
camera.stop_preview()
#renderfilename, newaudiomix = renderscene(filmfolder, filmname, scene)
renderfilename = renderfilm(filmfolder, filmname, comp, scene)
+ writemessage('Render done!')
if renderfilename != '':
remove_shots = playdub(filmname,renderfilename, 'film')
#fastedit (maybe deploy sometime)
@@ -1418,7 +1419,7 @@ def main():
videos_totalt = db.query("SELECT COUNT(*) AS videos FROM videos")[0]
tot = int(videos_totalt.videos)
video_origins=datetime.datetime.now().strftime('%Y%d%m')+str(tot).zfill(5)+'_'+os.urandom(8).hex()
- #db.insert('videos', tid=datetime.datetime.now(), filename=filmfolder+'.videos/'+video_origins+'.mp4', foldername=foldername, filmname=filmname, scene=scene, shot=shot, take=take, audiolength=0, videolength=0)
+ db.insert('videos', tid=datetime.datetime.now(), filename=filmfolder+'.videos/'+video_origins+'.mp4', foldername=foldername, filmname=filmname, scene=scene, shot=shot, take=take, audiolength=0, videolength=0)
os.system(gonzopifolder + '/alsa-utils-1.1.3/aplay/arecord -D hw:' + str(plughw) + ' -f '+soundformat+' -c ' + str(channels) + ' -r '+soundrate+' -vv '+ foldername + filename + '.wav &')
sound_start = time.time()
if onlysound != True:
@@ -1458,7 +1459,11 @@ def main():
stoprecording(camera, rec_process)
os.system('pkill arecord')
soundlag=starttime-sound_start
- #db.update('videos', where='filename="'+filmfolder+'.videos/'+video_origins+'.mp4"', soundlag=soundlag)
+ try:
+ db.update('videos', where='filename="'+filmfolder+'.videos/'+video_origins+'.mp4"', soundlag=soundlag, faststart=False)
+ except:
+ db = correct_database(filmname,filmfolder,db)
+ db.update('videos', where='filename="'+filmfolder+'.videos/'+video_origins+'.mp4"', soundlag=soundlag, faststart=False)
#time.sleep(0.005) #get audio at least 0.1 longer
#camera.capture(foldername + filename + '.jpeg', resize=(800,341))
#if slidecommander:
@@ -2252,7 +2257,19 @@ def get_film_files(filmname,filmfolder,db):
videodb=db.select('videos')
return db
except:
- db.query("CREATE TABLE videos (id integer PRIMARY KEY, tid DATETIME, filename TEXT, foldername TEXT, filmname TEXT, scene INT, shot INT, take INT, audiolength FLOAT, videolength FLOAT,soundlag FLOAT, audiosync FLOAT);")
+ db.query("CREATE TABLE videos (id integer PRIMARY KEY, tid DATETIME, filename TEXT, foldername TEXT, filmname TEXT, scene INT, shot INT, take INT, audiolength FLOAT, videolength FLOAT,soundlag FLOAT, audiosync FLOAT, faststart BOOL);")
+ videodb=db.select('videos')
+ return db
+
+#---------remove and get correct database------
+
+def correct_database(filmname,filmfolder,db):
+ if not os.path.isdir(filmfolder+'.videos/'):
+ os.makedirs(filmfolder+'.videos/')
+ filmdb = filmfolder+'.videos/gonzopi.db'
+ run_command('rm '+filmdb)
+ db = web.database(dbn='sqlite', db=filmdb)
+ db.query("CREATE TABLE videos (id integer PRIMARY KEY, tid DATETIME, filename TEXT, foldername TEXT, filmname TEXT, scene INT, shot INT, take INT, audiolength FLOAT, videolength FLOAT,soundlag FLOAT, audiosync FLOAT, faststart BOOL);")
videodb=db.select('videos')
return db
@@ -4111,8 +4128,6 @@ def stretchaudio(filename,fps):
audiolength=videolength
#if there is no audio length
logger.info('audio is:' + str(audiolength))
- if not audiolength.strip():
- audiolength = 0
ratio = int(audiolength)/int(videolength)
print(str(ratio))
run_command('cp '+filename+'.wav '+filename+'_temp.wav')
@@ -4172,10 +4187,9 @@ def get_audio_length(filepath):
#-------------Compile Shot--------------
def compileshot(filename,filmfolder,filmname):
- global fps, soundrate, channels, bitrate, muxing
+ global fps, soundrate, channels, bitrate, muxing, db
videolength=0
- audiolength=0
-
+ audiolength=0
#Check if file already converted
if '.h264' in filename:
filename=filename.replace('.h264','')
@@ -4194,30 +4208,38 @@ def compileshot(filename,filmfolder,filmname):
#run_command('ffmpeg -i ' + video_origins + '.h264 -c:v h264_omx -profile:v high -level:v 4.2 -preset slower -bsf:v h264_metadata=level=4.2 -g 1 -b:v '+str(bitrate)+' '+ video_origins + '.mp4')
run_command('ffmpeg -fflags +genpts -r 25 -i ' + video_origins + '.h264 '+encoder()+ video_origins + '.mp4')
os.system('ln -sfr '+video_origins+'.mp4 '+filename+'.mp4')
- if has_audio_track(filename+'.mp4'):
- print('cool has audio')
- else:
- video_origins = (os.path.realpath(filename+'.mp4'))[:-4]
- if not os.path.isfile(filename + '.wav'):
- audiosilence(filename)
- #add audio/video start delay sync
- videolength = get_video_length(filename+'.mp4')
- print('videolength:'+str(videolength))
+ video_origins = (os.path.realpath(filename+'.mp4'))[:-4]
+ if not os.path.isfile(filename + '.wav'):
+ vumetermessage('creating audio track...')
+ audiosilence(filename)
+ #add audio/video start delay sync
+ vumetermessage('checking video audio length...')
+ videolength = get_video_length(filename+'.mp4')
+ print('videolength:'+str(videolength))
+ try:
+ audiolength = get_audio_length(filename+'.wav')
+ except:
+ audiolength=videolength
+ #if there is no audio length
+ logger.info('audio is:' + str(audiolength))
+ print('trimming audio')
+ if int(audiolength) > int(videolength):
+ vumetermessage('trimming audio...')
+ run_command('sox -V0 '+filename+'.wav -c 2 /dev/shm/temp.wav trim 0.013')
+ run_command('mv /dev/shm/temp.wav '+ filename + '.wav')
+ os.system('rm /dev/shm/temp.wav')
+ fps_rounded=round(fps)
+ if int(fps_rounded) != 25:
+ vumetermessage('stretching audio...')
+ stretchaudio(filename,fps)
+ if int(audiolength) != int(videolength):
+ vumetermessage('trimming audio to video...')
+ audiosync, videolength, audiolength = audiotrim(filename, 'end','')
try:
- audiolength = get_audio_length(filename+'.wav')
+ db.update('videos', where='filename="'+video_origins+'"', videolength=videolength/1000, audiolength=audiolength/1000, audiosync=audiosync)
except:
- audiolength=videolength
- audiosilence(filename)
- #if there is no audio length
- logger.info('audio is:' + str(audiolength))
- print('trimming audio')
- if int(audiolength) > int(videolength):
- run_command('sox -V0 '+filename+'.wav -c 2 /dev/shm/temp.wav trim 0.013')
- run_command('mv /dev/shm/temp.wav '+ filename + '.wav')
- stretchaudio(filename,fps)
- if int(audiolength) != int(videolength):
- audiosync, videolength, audiolength = audiotrim(filename, 'end','')
- #db.update('videos', where='filename="'+video_origins+'"', videolength=videolength/1000, audiolength=audiolength/1000, audiosync=audiosync)
+ db = correct_database(filmname,filmfolder,db)
+ db.update('videos', where='filename="'+video_origins+'"', videolength=videolength/1000, audiolength=audiolength/1000, audiosync=audiosync)
mux=False
if mux == True:
#muxing mp3 layer to mp4 file
@@ -4242,7 +4264,6 @@ def compileshot(filename,filmfolder,filmname):
#origin=os.path.realpath(filename+'.mp4')
#os.system('rm ' + video_origins + '.h264')
#os.system('rm ' + filename + '.h264')
- os.system('rm /dev/shm/temp.wav')
#os.system('ln -sfr '+video_origins+'.mp4 '+filename+'.mp4')
logger.info('compile done!')
#run_command('omxplayer --layer 3 ' + filmfolder + '/.rendered/' + filename + '.mp4 &')
@@ -4395,32 +4416,49 @@ def scenefiles(filmfolder, filmname):
#-------------Render Shot-------------
def rendershot(filmfolder, filmname, renderfilename, scene, shot):
- global fps, take, rendermenu, updatethumb, bitrate, muxing
+ global fps, take, rendermenu, updatethumb, bitrate, muxing, db
#This function checks and calls rendervideo & renderaudio if something has changed in the film
#Video
- if os.path.exists(renderfilename+'.wav') == False:
- ##MAKE AUDIO SILENCE
- audiosilence(renderfilename)
+ vumetermessage('render shot '+renderfilename)
+ video_origins = (os.path.realpath(renderfilename+'.mp4'))[:-4]
def render(q, filmfolder, filmname, renderfilename, scene, shot):
+ global fps, take, rendermenu, updatethumb, bitrate, muxing, db
videohash = ''
oldvideohash = ''
scenedir = filmfolder + filmname + '/scene' + str(scene).zfill(3) + '/shot' + str(shot).zfill(3) + '/'
#return if no file
# Video Hash
#if os.path.isfile(renderfilename + '.h264') == True:
- if has_audio_track(renderfilename+'.mp4') == False:
+ video_db=db.select('videos', where='filename="'+video_origins+'.mp4"')
+ faststart=True
+ try:
+ if video_db[0].faststart == 0:
+ faststart=False
+ if video_db[0].faststart == 1:
+ faststart=True
+ except:
+ pass
+ if faststart == False:
+ vumetermessage('found new clip compiling...')
+ os.system('mv ' + renderfilename + '.mp4 ' + renderfilename + '_tmp.mp4')
+ call(['ffmpeg', '-i', renderfilename + '_tmp.mp4', '-r', '25', '-fflags', '+genpts+igndts', '-vsync', '1', '-c:v', 'copy', '-c:a', 'copy', '-movflags', '+faststart', renderfilename+'.mp4', '-y'], shell=False)
+ run_command('rm '+renderfilename+'_tmp.mp4')
+ try:
+ db.update('videos', where='filename="'+video_origins+'.mp4"', faststart=True)
+ except:
+ db = correct_database(filmname,filmfolder,db)
+ db.update('videos', where='filename="'+video_origins+'.mp4"', faststart=True)
compileshot(renderfilename,filmfolder,filmname)
audiohash = str(int(countsize(renderfilename + '.wav')))
with open(scenedir + '.audiohash', 'w') as f:
f.write(audiohash)
- #if something shutdown in middle of process
- elif os.path.isfile(renderfilename + '_tmp.mp4') == True:
- os.system('cp ' + renderfilename + '_tmp.mp4 ' + renderfilename + '.mp4')
- elif os.path.isfile(renderfilename + '.mp4') == True:
+ if os.path.isfile(renderfilename + '.mp4') == True:
videohash = videohash + str(int(countsize(renderfilename + '.mp4')))
- video_origins = (os.path.realpath(renderfilename+'.mp4'))[:-4]
print('Videohash of shot is: ' + videohash)
#time.sleep(3)
+ #if something shutdown in middle of process
+ #elif os.path.isfile(renderfilename + '_tmp.mp4') == True:
+ # os.system('cp ' + renderfilename + '_tmp.mp4 ' + renderfilename + '.mp4')
else:
vumetermessage('Nothing here to play hit record')
status='',''
@@ -4564,7 +4602,8 @@ def rendershot(filmfolder, filmname, renderfilename, scene, shot):
logger.info('compile done!')
else:
print('Already rendered!')
- if muxing == True:
+ muxings=False
+ if muxings == True:
#muxing mp3 layer to mp4 file
#count estimated audio filesize with a bitrate of 320 kb/s
audiosize = countsize(renderfilename + '.wav') * 0.453
@@ -4674,7 +4713,6 @@ def renderscene(filmfolder, filmname, scene):
print('no videohash found, making one...')
with open(scenedir + '.videohash', 'w') as f:
f.write(videohash)
-
print('renderfix is:'+str(renderfixscene))
# Render if needed
if videohash != oldvideohash or renderfixscene == True:
@@ -4724,7 +4762,7 @@ def renderscene(filmfolder, filmname, scene):
print('Audio rendered!')
newaudiomix = True
os.system('mv ' + renderfilename + '.mp4 ' + renderfilename + '_tmp.mp4')
- call(['ffmpeg', '-i', renderfilename + '_tmp.mp4', '-r', '25', '-fflags', '+genpts+igndts', '-vsync', '1', '-c:v', 'copy', '-c:a', 'copy', '-movflags', 'faststart', renderfilename+'.mp4', '-y'], shell=False)
+ call(['ffmpeg', '-i', renderfilename + '_tmp.mp4', '-r', '25', '-fflags', '+genpts+igndts', '-vsync', '1', '-c:v', 'copy', '-c:a', 'copy', '-movflags', '+faststart', renderfilename+'.mp4', '-y'], shell=False)
os.remove(renderfilename + '_tmp.mp4')
else:
print('Already rendered!')