fix: apply_sync ffmpeg streamcpy and filter
This commit is contained in:
1 parent
708a256427
commit
38841b1ae4
2 files changed
+51
-7
No files matched your search
+25
-3
@@ -57,6 +57,23 @@ def probe_audio_streams(path: str) -> list[dict]:
|
||||
return []
|
||||
|
||||
|
||||
def _codec_args(codec: str, out_idx: int) -> list[str]:
|
||||
"""Return ffmpeg codec args for a given audio codec string."""
|
||||
lossless = {"flac", "alac", "pcm_s16le", "pcm_s24le", "pcm_s32le", "pcm_f32le", "pcm_f64le"}
|
||||
if codec in lossless:
|
||||
return [f"-c:a:{out_idx}", codec]
|
||||
# lossy codecs: use original where possible
|
||||
codec_map = {
|
||||
"aac": "aac", "mp3": "libmp3lame", "opus": "libopus",
|
||||
"vorbis": "libvorbis", "ac3": "ac3", "eac3": "eac3",
|
||||
}
|
||||
enc = codec_map.get(codec, "aac")
|
||||
args = [f"-c:a:{out_idx}", enc]
|
||||
if enc != codec or codec not in lossless:
|
||||
args += [f"-b:a:{out_idx}", "192k"]
|
||||
return args
|
||||
|
||||
|
||||
def build_ffmpeg_cmd(file_a: str, file_b: str, lag_sec: float, out_path: str) -> list[str]:
|
||||
"""Build ffmpeg command to mux A video + A audio + delayed B audio streams."""
|
||||
b_streams = probe_audio_streams(file_b)
|
||||
@@ -67,6 +84,7 @@ def build_ffmpeg_cmd(file_a: str, file_b: str, lag_sec: float, out_path: str) ->
|
||||
set_german = (len(b_streams) == 1 and b_streams[0]["language"] in ("und", "unknown", ""))
|
||||
|
||||
# Build filter_complex for B audio streams
|
||||
# Negative adelay trims the start (B ahead of A), positive adds silence (B behind A)
|
||||
filters = []
|
||||
for i, s in enumerate(b_streams):
|
||||
filters.append(f"[1:a:{i}]adelay={lag_ms:.0f}|{lag_ms:.0f}:all=1[d{i}]")
|
||||
@@ -81,11 +99,15 @@ def build_ffmpeg_cmd(file_a: str, file_b: str, lag_sec: float, out_path: str) ->
|
||||
for i in range(len(b_streams)):
|
||||
cmd += ["-map", f"[d{i}]"]
|
||||
|
||||
# Codecs: copy everything (lossless)
|
||||
cmd += ["-c:v", "copy", "-c:a", "copy"]
|
||||
# Codecs: copy video + A's audio, re-encode B's filtered audio with same codec
|
||||
n_a_audio = len(probe_audio_streams(file_a))
|
||||
cmd += ["-c:v", "copy"]
|
||||
for i in range(n_a_audio):
|
||||
cmd += [f"-c:a:{i}", "copy"]
|
||||
for i, s in enumerate(b_streams):
|
||||
cmd += _codec_args(s["codec"], n_a_audio + i)
|
||||
|
||||
# Language metadata for B audio streams (they become the last N audio streams in output)
|
||||
n_a_audio = len(probe_audio_streams(file_a))
|
||||
for i, s in enumerate(b_streams):
|
||||
out_audio_idx = n_a_audio + i # 0-based index in output audio streams
|
||||
if set_german and i == 0:
|
||||
|
||||
Reference in new issue
Block a user