Moja praca polega ostatnio na programowym tworzeniu filmów. W Pythonie, typowy przepływ pracy wygląda tak:Czy możesz "przesyłać" obrazy do pliku ffmpeg, aby skonstruować wideo, zamiast zapisywać je na dysku?
import subprocess, Image, ImageDraw
for i in range(frames_per_second * video_duration_seconds):
img = createFrame(i)
img.save("%07d.png" % i)
subprocess.call(["ffmpeg","-y","-r",str(frames_per_second),"-i", "%07d.png","-vcodec","mpeg4", "-qscale","5", "-r", str(frames_per_second), "video.avi"])
Ten workflow tworzy obraz dla każdej ramki w wideo i zapisuje je na dysku. Po zapisaniu wszystkich obrazów, ffmpeg jest wywoływane w celu skonstruowania wideo ze wszystkich obrazów.
Zapisywanie obrazów na dysk (bez tworzenia obrazów w pamięci) powoduje zużycie większości cykli i nie wydaje się konieczne. Czy istnieje sposób na wykonanie tej samej funkcji, ale bez zapisywania obrazów na dysk? Tak więc ffmpeg zostanie wywołany, a obrazy zostaną skonstruowane i dostarczone do ffmpeg natychmiast po skonstruowaniu.
Nie wiem, w jaki sposób tworzysz obrazy, ale ffmpeg akceptuje również wejścia do rur: 'ffmpeg -f image2pipe -c: v png -r 30000/1001 -i -'. – LordNeckbeard
Dla uproszczenia wystarczy założyć, że 'createFrame (i)' zwraca obiekt obrazu Python Image Library, który przechowujemy w 'img'. Myślę, że twoja odpowiedź jest krokiem we właściwym kierunku, ale połowa wyzwania polegałaby na przesuwaniu skonstruowanych obrazów do ffmpeg podczas pracy w programie Pythona. – Brandon
może kolejki, a następnie potok obrazów przez drugi wątek? – lolopop