Compare commits

..
2 Commits
Author SHA1 Message Date
Frédéric Tronel 814c64cc52 Fix a bug discovered by the synthetic video. 2026-08-31 21:28:07 +02:00
Frédéric Tronel c17ccb6563 Typo in calling ffmpeg. 2026-08-31 21:27:41 +02:00
2 changed files with 51 additions and 47 deletions
+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.
+1 -1
View File
@@ -241,7 +241,7 @@ def extract_all_streams(ffmpeg_path:str, ffprobe_path:str, input_file:IO[bytes],
video_codec_params.extend([f'-c:v:{video_id:d}', codec, f'-level:v:{video_id:d}', video_codec_params.extend([f'-c:v:{video_id:d}', codec, f'-level:v:{video_id:d}',
level, '-pix_fmt', pixel_format]) level, '-pix_fmt', pixel_format])
video_codec_params.extend(interlaced_options) video_codec_params.extend(interlaced_options)
video_codec_params.extend([f'-colorspace:v:{video_id}', color_space, video_codec_params.extend([f'-colorspace:v:{video_id:d}', color_space,
f'-color_primaries:v:{video_id:d}', color_primaries, f'-color_primaries:v:{video_id:d}', color_primaries,
f'-color_trc:v:{video_id:d}', color_transfer, f'-color_trc:v:{video_id:d}', color_transfer,
f'-color_range:v:{video_id:d}', color_range]) f'-color_range:v:{video_id:d}', color_range])