use python-ffmpeg (run external ffmpeg) to generate video thumb as it also auto-rotates
This commit is contained in:
2
BUGs
2
BUGs
@@ -1,4 +1,4 @@
|
||||
### Next: 99
|
||||
### Next: 100
|
||||
BUG-97: if restart a job, we reset start time too (debatable) -
|
||||
prob. better making a job have anull start time rather than now() as default, then if its null set it when we run the job
|
||||
(this would set it at actual run time not create time, and if we restart, it would leave orig start time correct)
|
||||
|
||||
@@ -45,6 +45,7 @@ import face_recognition
|
||||
import re
|
||||
import sys
|
||||
import json
|
||||
import ffmpeg
|
||||
|
||||
|
||||
# global debug setting
|
||||
@@ -1694,41 +1695,27 @@ def GenImageThumbnail(job, file):
|
||||
# GenVideoThumbnail(): log and then generate the thumb for a video (this grabs the width/height of a frame from the video,
|
||||
# and then reads the first few frames until the mean() fo the frame indicates its not just black frame, then make the thumbnail
|
||||
####################################################################################################################################
|
||||
def GenVideoThumbnail(job, file):
|
||||
ProcessFileForJob( job, "Generate Thumbnail from Video file: {}".format( file ), file )
|
||||
def GenVideoThumbnail( job, fname):
|
||||
ProcessFileForJob( job, f"Generate Thumbnail from Video file: {fname}", fname )
|
||||
height = THUMBSIZE
|
||||
try:
|
||||
vcap = cv2.VideoCapture(file)
|
||||
res, frame = vcap.read()
|
||||
first_res = res
|
||||
first_frame = frame
|
||||
frame_cnt=0
|
||||
# if the mean pixel value is > 15, we have something worth making a sshot of (no black frame at start being the sshot)
|
||||
# limit it to 1000 frames jic
|
||||
while res and frame.mean() < 15 and frame_cnt < 1000:
|
||||
res, frame = vcap.read()
|
||||
frame_cnt += 1
|
||||
# if we never got a frame that is not dark, then use first frame
|
||||
if not res:
|
||||
res = first_res
|
||||
frame = first_frame
|
||||
|
||||
w = vcap.get(cv2.CAP_PROP_FRAME_WIDTH)
|
||||
h = vcap.get(cv2.CAP_PROP_FRAME_HEIGHT)
|
||||
if w > h:
|
||||
factor = w / THUMBSIZE
|
||||
else:
|
||||
factor = h / THUMBSIZE
|
||||
new_h = int(h / factor)
|
||||
new_w = int(w / factor)
|
||||
frame = cv2.resize(frame, (new_w, new_h), 0, 0, cv2.INTER_LINEAR)
|
||||
|
||||
res, thumb_buf = cv2.imencode('.jpeg', frame)
|
||||
bt = thumb_buf.tobytes()
|
||||
thumbnail = base64.b64encode(bt)
|
||||
thumbnail = str(thumbnail)[2:-1]
|
||||
except Exception as e:
|
||||
AddLogForJob( job, f"ERROR: Failed to Generate thumbnail for video file: {file} - error={e}" )
|
||||
probe = ffmpeg.probe(fname)
|
||||
time = float(probe['streams'][0]['duration']) // 2
|
||||
tmp_fname='/tmp/pa_tmp_'+os.path.basename(fname.split('.')[0])+'.jpg'
|
||||
(
|
||||
ffmpeg
|
||||
.input(fname, ss=time)
|
||||
.filter('scale', -1, height)
|
||||
.output(tmp_fname, vframes=1)
|
||||
.overwrite_output()
|
||||
.run(capture_stdout=True, capture_stderr=True)
|
||||
)
|
||||
except ffmpeg.Error as e:
|
||||
AddLogForJob( job, f"ERROR: Failed to Generate thumbnail for video file: {fname} - error={e}" )
|
||||
return None
|
||||
|
||||
thumbnail, w, h = GenThumb( tmp_fname, False )
|
||||
os.remove( tmp_fname )
|
||||
return thumbnail
|
||||
|
||||
####################################################################################################################################
|
||||
|
||||
Reference in New Issue
Block a user