Advertisement
Guest User

drop_here_to_edit.py

a guest
Jul 2nd, 2021
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.52 KB | None | 0 0
  1. #v1
  2.  
  3. max_interval=180 # frames
  4. min_interval=max_interval-60
  5.  
  6. import subprocess
  7. import os
  8. import sys
  9.  
  10. if len(sys.argv)<3:
  11.  print("Drag and drop image and video")
  12.  exit()
  13.  
  14. print(f"image: {sys.argv[1]}\nvideo: {sys.argv[2]}")
  15.  
  16.  
  17. face=sys.argv[1]
  18. video=sys.argv[2]
  19. dir=os.path.dirname(video)
  20. outdir=f"{dir}\\..\\output\\"
  21.  
  22. # retrieve frame data
  23. result = subprocess.run(['ffprobe', '-loglevel', 'error', '-select_streams', 'v:0', '-show_entries', 'frame=key_frame,coded_picture_number,pkt_pts_time', '-of', 'csv=print_section=0', video], stdout=subprocess.PIPE)
  24. fr=result.stdout.decode("utf-8").split("\r\n")
  25. fr=[x.split(",") for x in fr if x]
  26. fr={int(x[2]):[x[0],x[1]] for x in fr}
  27.  
  28. # just do the editing if video is short
  29. if len(fr)<max_interval:
  30.  subprocess.run(['video.bat', face, video])
  31.  exit()
  32.  
  33. # keyframes
  34. kf=[x for x in fr if fr[x][0]=="1"]
  35. dif=[]
  36. y=None
  37. for x in kf:
  38.  if y!=None:
  39.   dif.append(x-y)
  40.  y=x
  41.  
  42.  
  43. video_s=os.path.splitext(video)
  44.  
  45. if max(dif)>max_interval or min(dif)<min_interval:
  46. # cut video into [interval]-sized slices
  47.  frames_left=len(fr)
  48.  f0=0
  49.  f1=0
  50.  i=0
  51.  while True:
  52.   f1=f0+max_interval if f0+max_interval<len(fr) else len(fr)-1
  53.   t=float(fr[f1][1])-float(fr[f0][1])
  54.   subprocess.run(['ffmpeg', '-i', video, '-loglevel', 'warning', '-stats', '-ss', fr[f0][1], '-t', str(t), video_s[0]+"_"+str(i)+".mp4"], stdout=subprocess.PIPE)
  55.   i+=1
  56.   f0=f1
  57.   if f0+1>=len(fr):
  58.    break
  59. else:
  60. # cut video by keyframes if intervals are short enough (usually faster)
  61.  subprocess.run(['ffmpeg', '-i', video, '-loglevel', 'warning', '-stats', '-acodec', 'copy', '-f', 'segment', '-vcodec', 'copy', '-reset_timestamps', '1', '-map', '0', video_s[0]+"_%d.mp4"], stdout=subprocess.PIPE)
  62.  i=len(kf)
  63.  
  64.  
  65. # edit sliced fragments
  66. videos=[f"{video_s[0]}_{str(x)}.mp4" for x in range(0,i)]
  67. edited_videos=[]
  68. for x in videos:
  69.  subprocess.run(['video.bat', face, x])
  70.  edited_videos.append(f"{outdir}{os.path.splitext(os.path.basename(face))[0]}_{os.path.basename(x)}")
  71.  
  72. # merge edited fragments
  73. list_video=os.path.join(dir, f"list_{os.path.basename(video)}.txt")
  74.  
  75. with open(list_video,"a") as f:
  76.  for x in edited_videos:
  77.   f.write(f"file '{x}'\n")
  78.  
  79. subprocess.run(['ffmpeg', '-f', 'concat', '-loglevel', 'warning', '-stats', '-safe', '0','-i', list_video, '-c', 'copy', f"{outdir}{os.path.splitext(os.path.basename(face))[0]}_{os.path.basename(video)}"], stdout=subprocess.PIPE)
  80.  
  81. # remove temp files
  82. os.remove(list_video)
  83. for x,y in videos,edited_videos:
  84.  os.remove(x)
  85.  os.remove(y)
  86.  
  87. input("Done...")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement