ich arbeite im Moment an einem Programm, welches ein Video (mp4) in seine einzelnen Frames zerlegt, anhand von Messdaten eine Art Cursor an einer bestimmten Position in jedem Bild hinzufügt und anschließend die Einzelbilder wieder zu einem mp4 zusammenfügt. Bisher komme ich auch ganz gut zurecht mit den Modulen OpenCV2 und Pillow und eben FFMPEG. Das Programm ist auch bereits lauffähig und tut im Groben was es soll. Leider gehen mir aber immer die ersten x Sekunden des Videos verloren (5<=x<=15). Nach mehrstündiger Fehlersuche bin ich aber nicht darauf gestoßen, was diesen Verlust auslöst, mir ist aber bekannt, dass es bereits beim "Zerlegen" des Videos in Einzelbilder zu entsprechendem Datenverlust kommt (die ersten ca. 75 - 225 Frames fehlen schlichtweg). Nun zu meiner Frage: Woran könnte dies liegen und wie könnte man dies am besten beheben?
Code: Alles auswählen
def create_tempdir():
try:
os.mkdir('./temp/')
except OSError as e:
print(e)
def load_video(video):
cap = cv2.VideoCapture(video)
if not cap:
print("Failed to load video.")
sys.exit(1)
fps = cap.get(cv2.CAP_PROP_FPS)
return cap,fps
def frames_to_png(cap):
f = 0
while(cap.isOpened()):
ret,frame = cap.read()
if ret==True:
f += 1
# Convert cv2 image to rgb and load from numpy array
frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
img = Image.fromarray(frame)
# make Cursor
img.paste(cursor,(int(200+100*math.sin(f/10.0)),int(200+100*math.cos(f/10.0))),cursor)
# Convert back to bgr numpy array and write to disk
frame = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
cv2.imwrite('./temp/frame{}.png'.format(str(f)),frame)
else:
break
cap.release()
...
def main():
create_tempdir()
stream, framerate = load_video(video)
frames_to_png(stream)
png_to_mp4(framerate)
make_avi()
if output_name.endswith('mp4'):
make_mp4()
#os.remove('{}avi'.format(output_name[:-3]))
cleanup()
Scheut euch nicht auch irgendwelche Vermutungen zu äußern, ich freue mich über jeden neuen Ansatz.
Vielen Dank
Holzi