change ffmpeg filter audio to add track

fix
This commit is contained in:
Lucas Faber authored and Lucas Vivohost committed 2026-09-14 09:20:47 +02:00
1 parent 0d5f084cd2
commit 4ba8088373
1 file changed
+73 -19
+73 -19
View File
@@ -387,20 +387,51 @@ def cmd_filter_audio(args):
5. alimiter: Hard limit at 0.95 to prevent digital clipping (distortion).
6. dynaudnorm: Smooths out loudness levels over time.
"""
idx_filt = select_audio_stream(args.input, args.audio_index)
inp = ffmpeg.input(args.input)
idx_filt = select_audio_stream(args.input, args.audio_index)
inp = ffmpeg.input(args.input)
probe = ffmpeg.probe(args.input)
audio_streams = [
s["index"]
for s in probe["streams"]
if s.get("codec_type") == "audio"
]
audio_streams = []
audio_titles = {}
audio_languages = {}
for s in probe["streams"]:
if s.get("codec_type") == "audio":
idx = s["index"]
audio_streams.append(idx)
tags = s.get("tags", {})
audio_titles[idx] = tags.get("title", f"Audio {idx}")
audio_languages[idx] = tags.get("language", "und")
filtered_audios = []
metadata_args = []
out_audio_idx = 0
for idx in audio_streams:
audio = inp[str(idx)]
# -------------------
# ORIGINAL STREAM
# -------------------
filtered_audios.append(audio)
metadata_args += [
f"-metadata:s:a:{out_audio_idx}",
f"title={audio_titles[idx]}",
f"-metadata:s:a:{out_audio_idx}",
f"language={audio_languages[idx]}",
]
out_audio_idx += 1
# -------------------
# FILTERED STREAM
# -------------------
if idx == idx_filt:
audio_filtered = (
audio
@@ -412,26 +443,48 @@ def cmd_filter_audio(args):
.filter("alimiter", limit=0.95)
.filter("dynaudnorm", f=200, g=15)
)
filtered_audios.append(audio_filtered)
else:
filtered_audios.append(audio)
streams = probe.get("streams", [])
subtitle_streams = [s for s in streams if s.get("codec_type") == "subtitle"]
base_title = audio_titles[idx]
filtered_title = base_title + " + filtered"
lang = audio_languages[idx]
metadata_args += [
f"-metadata:s:a:{out_audio_idx}",
f"title={filtered_title}",
f"-metadata:s:a:{out_audio_idx}",
f"language={lang}",
f"-metadata:s:a:{out_audio_idx}",
f"handler_name={filtered_title}",
]
out_audio_idx += 1
# -------------------
# SUBTITLES
# -------------------
subs = []
if subtitle_streams:
if any(s.get("codec_type") == "subtitle" for s in probe["streams"]):
subs.append(inp["s"])
out = ffmpeg.output(
inp.video,
# -------------------
# OUTPUT (IMPORTANT FIX HERE)
# -------------------
input_args = [inp.video,
*filtered_audios,
*subs,
*subs,]
out = ffmpeg.output(
*input_args,
args.output,
vcodec="copy",
acodec="libvorbis",
scodec=get_scodec(args.output),
)
scodec=get_scodec(args.output)
).global_args(*metadata_args)
return out
@@ -784,7 +837,7 @@ def cmd_test(args):
args.input = test_file
args.output = os.path.join(test_dir, "out_filter_audio" + os.path.splitext(test_file)[1])
args.audio_index = 1
test_dict = [ {"video_count": len(video_streams), "audio_count": len(audio_streams),
test_dict = [ {"video_count": len(video_streams), "audio_count": len(audio_streams)+1,
"subtitle_count": len(subtitle_streams), "audio_codecs": ["vorbis"]}]
ret += run_and_probe("filter-audio", cmd_filter_audio, args, test_dict)
@@ -954,7 +1007,8 @@ def main():
# ----------------------------
if args.command != "test":
args.input = ensure(getattr(args, "input", None), f"Input file ({Path.cwd()})")
if not Path(args.input).expanduser().exists():
args.input = Path(args.input).resolve()
if not Path(args.input).exists():
parser.error("Input file does not exist!")
if args.command in REQUIRES_OUTPUT and not getattr(args, "output", None):
args.output = ensure(getattr(args, "output", None), "Output file (enter for default file)")