Add a new option to not take into account sequences that are shorter than a certain threshold.

This commit is contained in:
Frédéric Tronel
2023-12-18 16:14:57 +01:00
parent 2f425aa9cf
commit 6959e83327

View File

@@ -17,6 +17,8 @@ from tqdm import tqdm, trange
from select import select from select import select
from math import floor, ceil, log from math import floor, ceil, log
from shutil import copyfile, which from shutil import copyfile, which
import hexdump
# Useful SPS/PPS discussion # Useful SPS/PPS discussion
# TODO: improve situation of SPS and PPS header mismatch when merging MVK with mkvmerge to remove warnings. # TODO: improve situation of SPS and PPS header mismatch when merging MVK with mkvmerge to remove warnings.
@@ -1092,12 +1094,18 @@ def main():
parser.add_argument("-o", "--output", dest='outputFile', type=str, required=True, help="Output MKV file to produce.") parser.add_argument("-o", "--output", dest='outputFile', type=str, required=True, help="Output MKV file to produce.")
parser.add_argument("-p", "--part", dest='parts', nargs='+', required=False, action='append', metavar="hh:mm:ss[.mmm]-hh:mm:ss[.mmm]", help="Extract this exact part of the original file.") parser.add_argument("-p", "--part", dest='parts', nargs='+', required=False, action='append', metavar="hh:mm:ss[.mmm]-hh:mm:ss[.mmm]", help="Extract this exact part of the original file.")
parser.add_argument("-k", "--keep", action='store_true', help="Do not cleanup temporary files after processing.") parser.add_argument("-k", "--keep", action='store_true', help="Do not cleanup temporary files after processing.")
parser.add_argument("--safe", action='store_true', help="Suppress headers and trailers to only keep safe parts of the movie.")
parser.add_argument("-t", "--threshold", action='store', type=int, help="Suppress headers and trailers that are smaller than the threshold.")
parser.add_argument("-f", "--fusion", action='store_true', help="Collapse the trailer of a part with the header of the next (when it makes sense).")
parser.add_argument("--dump-memory", action='store_true', dest='dump', help="For debug purpose, dump all memory mapping of headers (and trailers) before (after) each part. They are kept in memory only otherwise.") parser.add_argument("--dump-memory", action='store_true', dest='dump', help="For debug purpose, dump all memory mapping of headers (and trailers) before (after) each part. They are kept in memory only otherwise.")
parser.add_argument("-s","--srt", action='store_true', dest='srt', help="Dump subtitles ") parser.add_argument("-s","--srt", action='store_true', dest='srt', help="Dump subtitles ")
args = parser.parse_args() args = parser.parse_args()
logger.debug("Arguments: %s" % args) logger.debug("Arguments: %s" % args)
if args.threshold == None:
args.threshold = 0
allOptionalTools, paths = checkRequiredTools() allOptionalTools, paths = checkRequiredTools()
# Flatten args.parts # Flatten args.parts
@@ -1252,7 +1260,7 @@ def main():
subparts = [] subparts = []
if nbHeadFrames > 0: if nbHeadFrames > args.threshold:
# We extract all frames between the beginning upto the frame that immediately preceeds the I-frame. # We extract all frames between the beginning upto the frame that immediately preceeds the I-frame.
head = extractAllStreams(ffmpeg=paths['ffmpeg'], ffprobe=paths['ffprobe'], inputFile=mkv, begin=ts1, end=headIFrameTS, nbFrames=nbHeadFrames-1, filesPrefix='part-%d-head' % (partnum), streams=streams, width=width, height=height, temporaries=temporaries, dumpMemFD=args.dump) head = extractAllStreams(ffmpeg=paths['ffmpeg'], ffprobe=paths['ffprobe'], inputFile=mkv, begin=ts1, end=headIFrameTS, nbFrames=nbHeadFrames-1, filesPrefix='part-%d-head' % (partnum), streams=streams, width=width, height=height, temporaries=temporaries, dumpMemFD=args.dump)
# Change private codec data of the new file so that it is the same as the one of the original movie # Change private codec data of the new file so that it is the same as the one of the original movie
@@ -1269,17 +1277,21 @@ def main():
extractMKVPart(mkvmerge=paths['mkvmerge'], inputFile=mkv, outputFile=internal, begin=headIFrameTS, end=tailIFrameTS) extractMKVPart(mkvmerge=paths['mkvmerge'], inputFile=mkv, outputFile=internal, begin=headIFrameTS, end=tailIFrameTS)
subparts.append(internal) subparts.append(internal)
if nbTailFrames > 0: if nbTailFrames > args.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.
tail = extractAllStreams(ffmpeg=paths['ffmpeg'], ffprobe=paths['ffprobe'], inputFile=mkv, begin=tailIFrameTS, end=ts2, nbFrames=nbTailFrames, filesPrefix='part-%d-tail' % (partnum), streams=streams, width=width, height=height, temporaries=temporaries, dumpMemFD=args.dump) tail = extractAllStreams(ffmpeg=paths['ffmpeg'], ffprobe=paths['ffprobe'], inputFile=mkv, begin=tailIFrameTS, end=ts2, nbFrames=nbTailFrames, filesPrefix='part-%d-tail' % (partnum), streams=streams, width=width, height=height, temporaries=temporaries, dumpMemFD=args.dump)
# Change private codec data of the new file so that it is the same as the one of the original movie # Change private codec data of the new file so that it is the same as the one of the original movie
changeCodecPrivateData(paths['mkvinfo'], tail, codecData) changeCodecPrivateData(paths['mkvinfo'], tail, codecData)
subparts.append(tail) subparts.append(tail)
logger.info('Merging: %s' % subparts) if not args.fusion:
part = mergeMKVs(inputs=subparts, outputName="part-%d.mkv" % partnum) logger.info('Merging: %s' % subparts)
mkvparts.append(part) part = mergeMKVs(inputs=subparts, outputName="part-%d.mkv" % partnum)
temporaries.append(part) mkvparts.append(part)
temporaries.append(part)
else:
logging.error("Not yet implemented")
exit(-1)
pos = pos+tailIFrameTS-ts1 pos = pos+tailIFrameTS-ts1