Fix a bug discovered by the synthetic video.

This commit is contained in:
Frédéric Tronel
2026-08-31 21:28:07 +02:00
parent c17ccb6563
commit 814c64cc52
+50 -46
View File
@@ -153,6 +153,8 @@ def cut_recording(media: PreparedMedia, options: ProcessingOptions,
except InvalidMediaError: except InvalidMediaError:
raise InvalidMediaError("Impossible to retrieve timestamp of final i-frame.") raise InvalidMediaError("Impossible to retrieve timestamp of final i-frame.")
assert head_iframe_ts <= tail_iframe_ts
checks.append(pos+head_iframe_ts-ts1) checks.append(pos+head_iframe_ts-ts1)
subparts = [] subparts = []
@@ -199,61 +201,63 @@ def cut_recording(media: PreparedMedia, options: ProcessingOptions,
if h264_head_ts is not None: if h264_head_ts is not None:
h264_ts.append(h264_head_ts) h264_ts.append(h264_head_ts)
# Creating MKV file that corresponds to current part between I-frames if head_iframe_ts < tail_iframe_ts:
# Internal video with all streams (video, audio and subtitles)
internal_mkv_name = f'part-{partnum:d}-internal.mkv'
# Internal video stream as a raw H264 stream
internal_h264_name = f'part-{partnum:d}-internal.h264'
# Internal video timestamps
internal_h264_ts_name = f'part-{partnum:d}-internal-ts.txt'
# Internal video with only audio and subtitles streams
internal_novideo_mkv_name = f'part-{partnum:d}-internal-novideo.mkv'
try: # Creating MKV file that corresponds to current part between I-frames
internal_mkv = open(internal_mkv_name, 'wb+') # Internal video with all streams (video, audio and subtitles)
except OSError as e: internal_mkv_name = f'part-{partnum:d}-internal.mkv'
raise TemporaryFileError(f"Impossible to create file: {internal_mkv_name}") from e # Internal video stream as a raw H264 stream
internal_h264_name = f'part-{partnum:d}-internal.h264'
# Internal video timestamps
internal_h264_ts_name = f'part-{partnum:d}-internal-ts.txt'
# Internal video with only audio and subtitles streams
internal_novideo_mkv_name = f'part-{partnum:d}-internal-novideo.mkv'
try: try:
internal_novideo_mkv = open(internal_novideo_mkv_name, 'wb+') internal_mkv = open(internal_mkv_name, 'wb+')
except OSError as e: except OSError as e:
raise TemporaryFileError(f"Impossible to create file: \ raise TemporaryFileError(f"Impossible to create file: {internal_mkv_name}") from e
{internal_novideo_mkv_name}") from e
try: try:
internal_h264 = open(internal_h264_name, 'wb+') internal_novideo_mkv = open(internal_novideo_mkv_name, 'wb+')
except OSError as e: except OSError as e:
raise TemporaryFileError(f"Impossible to create file: {internal_h264_name}") from e raise TemporaryFileError(f"Impossible to create file: \
{internal_novideo_mkv_name}") from e
try: try:
internal_h264_ts = open(internal_h264_ts_name, 'w+', encoding='utf8') internal_h264 = open(internal_h264_name, 'wb+')
except OSError as e: except OSError as e:
raise TemporaryFileError(f"Impossible to create file: {internal_h264_ts_name}") from e raise TemporaryFileError(f"Impossible to create file: {internal_h264_name}") from e
# logger.info('Merge header, middle and trailer subpart into: %s' % internal_mkv_name) try:
# Extract internal part of MKV internal_h264_ts = open(internal_h264_ts_name, 'w+', encoding='utf8')
extract_mkv_part(mkvmerge_path=options.tools_paths['mkvmerge'], input_file=media.movie, except OSError as e:
output_file=internal_mkv, begin=head_iframe_ts, end=tail_iframe_ts) raise TemporaryFileError(f"Impossible to create file: {internal_h264_ts_name}") from e
# Extract video stream of internal part as a raw H264 and its timestamps. # logger.info('Merge header, middle and trailer subpart into: %s' % internal_mkv_name)
logger.info('Extract video track as raw H264 file.') # Extract internal part of MKV
extract_track_from_mkv(mkvextract_path=options.tools_paths['mkvextract'], extract_mkv_part(mkvmerge_path=options.tools_paths['mkvmerge'], input_file=media.movie,
input_file=internal_mkv, index=0, output_file=internal_h264, output_file=internal_mkv, begin=head_iframe_ts, end=tail_iframe_ts)
timestamps=internal_h264_ts)
# Remove video track from internal part of MKV # Extract video stream of internal part as a raw H264 and its timestamps.
logger.info('Remove video track from %s', internal_mkv_name) logger.info('Extract video track as raw H264 file.')
remove_video_tracks_from_mkv(mkvmerge_path=options.tools_paths['mkvmerge'], extract_track_from_mkv(mkvextract_path=options.tools_paths['mkvextract'],
input_file=internal_mkv, output_file=internal_novideo_mkv) input_file=internal_mkv, index=0, output_file=internal_h264,
timestamps=internal_h264_ts)
temporaries.add(internal_mkv) # Remove video track from internal part of MKV
temporaries.add(internal_h264) logger.info('Remove video track from %s', internal_mkv_name)
temporaries.add(internal_h264_ts) remove_video_tracks_from_mkv(mkvmerge_path=options.tools_paths['mkvmerge'],
temporaries.add(internal_novideo_mkv) input_file=internal_mkv, output_file=internal_novideo_mkv)
h264parts.append(internal_h264) temporaries.add(internal_mkv)
h264_ts.append(internal_h264_ts) temporaries.add(internal_h264)
subparts.append(internal_novideo_mkv) temporaries.add(internal_h264_ts)
temporaries.add(internal_novideo_mkv)
h264parts.append(internal_h264)
h264_ts.append(internal_h264_ts)
subparts.append(internal_novideo_mkv)
if (not options.coarse) and (nb_tail_frames > options.threshold): if (not options.coarse) and (nb_tail_frames > options.threshold):
# We extract all frames between the I-frame (including it) upto the end. # We extract all frames between the I-frame (including it) upto the end.