change ffmpeg filter audio to add track
fix
This commit is contained in:
1 parent
0d5f084cd2
commit
4ba8088373
1 file changed
+73
-19
+73
-19
@@ -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)")
|
||||
|
||||
Reference in new issue
Block a user