mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-08 12:15:25 +03:00
Create preview gif
This commit is contained in:
parent
95be693b8a
commit
a83f07d8c8
@ -596,7 +596,7 @@ def event_thumbnail(id, max_cache_age=2592000):
|
|||||||
@bp.route("/events/<id>/preview.gif")
|
@bp.route("/events/<id>/preview.gif")
|
||||||
def event_preview(id: str, max_cache_age=2592000):
|
def event_preview(id: str, max_cache_age=2592000):
|
||||||
try:
|
try:
|
||||||
event = Event.get(Event.id == id)
|
event: Event = Event.get(Event.id == id)
|
||||||
if event.end_time is not None:
|
if event.end_time is not None:
|
||||||
event_complete = True
|
event_complete = True
|
||||||
except DoesNotExist:
|
except DoesNotExist:
|
||||||
@ -604,13 +604,14 @@ def event_preview(id: str, max_cache_age=2592000):
|
|||||||
jsonify({"success": False, "message": "Event not found"}), 404
|
jsonify({"success": False, "message": "Event not found"}), 404
|
||||||
)
|
)
|
||||||
|
|
||||||
|
start_ts = event.start_time
|
||||||
|
end_ts = event.start_time + 10
|
||||||
|
|
||||||
if datetime.fromtimestamp(event.start_time) < datetime.now().replace(
|
if datetime.fromtimestamp(event.start_time) < datetime.now().replace(
|
||||||
minute=0, second=0
|
minute=0, second=0
|
||||||
):
|
):
|
||||||
# has preview mp4
|
# has preview mp4
|
||||||
start_ts = event.start_time
|
preview: Previews = (
|
||||||
end_ts = event.start_time + 10
|
|
||||||
preview = (
|
|
||||||
Previews.select(
|
Previews.select(
|
||||||
Previews.camera,
|
Previews.camera,
|
||||||
Previews.path,
|
Previews.path,
|
||||||
@ -625,7 +626,6 @@ def event_preview(id: str, max_cache_age=2592000):
|
|||||||
)
|
)
|
||||||
.where(Previews.camera == event.camera)
|
.where(Previews.camera == event.camera)
|
||||||
.limit(1)
|
.limit(1)
|
||||||
.dicts()
|
|
||||||
.get()
|
.get()
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -648,7 +648,7 @@ def event_preview(id: str, max_cache_age=2592000):
|
|||||||
"20",
|
"20",
|
||||||
"-i",
|
"-i",
|
||||||
preview.path,
|
preview.path,
|
||||||
"r",
|
"-r",
|
||||||
"8",
|
"8",
|
||||||
"-vf",
|
"-vf",
|
||||||
"setpts=0.12*PTS",
|
"setpts=0.12*PTS",
|
||||||
@ -657,9 +657,10 @@ def event_preview(id: str, max_cache_age=2592000):
|
|||||||
"-c:v",
|
"-c:v",
|
||||||
"gif",
|
"gif",
|
||||||
"-f",
|
"-f",
|
||||||
"image2pipe",
|
"gif",
|
||||||
"-",
|
"-",
|
||||||
]
|
]
|
||||||
|
logger.info(f"running previous gif creation {' '.join(ffmpeg_cmd)}")
|
||||||
|
|
||||||
process = sp.run(
|
process = sp.run(
|
||||||
ffmpeg_cmd,
|
ffmpeg_cmd,
|
||||||
@ -670,14 +671,59 @@ def event_preview(id: str, max_cache_age=2592000):
|
|||||||
# need to generate from existing images
|
# need to generate from existing images
|
||||||
preview_dir = os.path.join(CACHE_DIR, "preview_frames")
|
preview_dir = os.path.join(CACHE_DIR, "preview_frames")
|
||||||
file_start = f"preview_{event.camera}"
|
file_start = f"preview_{event.camera}"
|
||||||
file_check = f"{file_start}-{event.start_time}.jpg"
|
start_file = f"{file_start}-{start_ts}.jpg"
|
||||||
selected_preview = None
|
end_file = f"{file_start}-{end_ts}.jpg"
|
||||||
|
selected_previews = []
|
||||||
|
|
||||||
for file in os.listdir(preview_dir):
|
for file in sorted(os.listdir(preview_dir)):
|
||||||
if file.startswith(file_start):
|
if not file.startswith(file_start):
|
||||||
if file < file_check:
|
continue
|
||||||
selected_preview = file
|
|
||||||
break
|
if file < start_file:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if file > end_file:
|
||||||
|
break
|
||||||
|
|
||||||
|
selected_previews.append(f"file '{file}'")
|
||||||
|
selected_previews.append("duration 0.12")
|
||||||
|
|
||||||
|
last_file = selected_previews[-2]
|
||||||
|
selected_previews.append(last_file)
|
||||||
|
|
||||||
|
ffmpeg_cmd = [
|
||||||
|
"ffmpeg",
|
||||||
|
"-hide_banner",
|
||||||
|
"-loglevel",
|
||||||
|
"warning",
|
||||||
|
"-f",
|
||||||
|
"concat",
|
||||||
|
"-y",
|
||||||
|
"-protocol_whitelist",
|
||||||
|
"pipe,file",
|
||||||
|
"-safe",
|
||||||
|
"0",
|
||||||
|
"-i",
|
||||||
|
"/dev/stdin",
|
||||||
|
"-loop",
|
||||||
|
"0",
|
||||||
|
"-c:v",
|
||||||
|
"gif",
|
||||||
|
"-f",
|
||||||
|
"gif",
|
||||||
|
"-",
|
||||||
|
]
|
||||||
|
logger.info(
|
||||||
|
f"running current gif creation {' '.join(ffmpeg_cmd)} with files {' '.join(selected_previews)}"
|
||||||
|
)
|
||||||
|
|
||||||
|
process = sp.run(
|
||||||
|
ffmpeg_cmd,
|
||||||
|
input="\n".join(selected_previews),
|
||||||
|
encoding="ascii",
|
||||||
|
capture_output=True,
|
||||||
|
)
|
||||||
|
gif_bytes = process.stdout
|
||||||
|
|
||||||
response = make_response(gif_bytes)
|
response = make_response(gif_bytes)
|
||||||
response.headers["Content-Type"] = "image/gif"
|
response.headers["Content-Type"] = "image/gif"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user