Add a function to retrieve timestamp of a frame (with multiple ffmpeg version).

This commit is contained in:
Frédéric Tronel
2023-12-02 21:03:15 +01:00
parent da13f3e9c8
commit 40592dcec2

View File

@@ -237,7 +237,18 @@ def ffmpegConvert(inputFile, inputFormat, outputFile, outputFormat, duration):
status = ffmpeg.wait()
if status != 0:
logger.error('Conversion failed with status code: %d' % status)
def getTSFrame(frame):
if 'pts_time' in frame:
pts_time = float(frame['pts_time'])
elif 'pkt_pts_time' in frame:
pts_time = float(frame['pkt_pts_time'])
else:
logger.error('Impossible to find timestamp of frame %s' % frame)
return None
ts = timedelta(seconds=pts_time)
return ts
def getFramesInStream(inputFile, begin, end, streamKind, subStreamId=0):
logger = logging.getLogger(__name__)
@@ -255,15 +266,9 @@ def getFramesInStream(inputFile, begin, end, streamKind, subStreamId=0):
if 'frames' in frames:
frames = frames['frames']
for frame in frames:
if 'pts_time' in frame:
pts_time = float(frame['pts_time'])
elif 'pkt_pts_time' in frame:
pts_time = float(frame['pkt_pts_time'])
else:
logger.error('Impossible to find timestamp of frame %s' % frame)
ts = getTSFrame(frame)
if ts == None
return None
ts = timedelta(seconds=pts_time)
if begin <= ts and ts <= end:
res.append(frame)
return res
@@ -295,11 +300,15 @@ def getNearestIFrame(inputFile, timestamp, before=True, delta=timedelta(seconds=
iframes.append(frame)
found = False
for frame in iframes:
if before and timedelta(seconds=float(frame['pts_time'])) <= timestamp:
for frame in iframes:
ts = getTSFrame(frame)
if ts == None
return None
if before and ts <= timestamp:
found = True
iframe = frame
if not before and timedelta(seconds=float(frame['pts_time'])) >= timestamp:
if not before and ts >= timestamp:
found = True
iframe = frame
break
@@ -308,10 +317,16 @@ def getNearestIFrame(inputFile, timestamp, before=True, delta=timedelta(seconds=
logger.info("Found i-frame at: %s" % iframe)
logger.debug("Found i-frame at %s" % iframe)
its = timedelta(seconds=float(iframe['pts_time']))
its = getTSFrame(iframe)
if its == None:
return None
nbFrames = 0
for frame in frames:
ts = timedelta(seconds=float(frame['pts_time']))
ts = getTSFrame(frame)
if ts == None
return None
if before:
if its <= ts and ts <= timestamp:
logger.info("Retrieve a frame between %s and %s at %s" % (its, timestamp, ts))