Fix a bug discovered by the synthetic video.
This commit is contained in:
+50
-46
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user