Чтобы создать строку фильтра с плавным переходом для передачи в ffmpeg, можно использовать эту вспомогательную функцию:
def create_afade_arg(is_in, start, end, fade_to_percent):
d = 100*(end-start)/(100-fade_to_percent)
cmd = [f"afade=enable='between(t,{str(start)},{str(end)})':t="]
if is_in:
cmd.append("in")
start = end - d
else:
cmd.append("out")
cmd.append(f":st={start}:d={d}")
return ''.join(cmd)
Затем вы можете использовать ее, например, в "-filter_complex", например:
fade_t = 2 # duration of fade in seconds
fade_to_percent = 10 # target percent of volume to fade to
afade_arg = create_afade_arg( True, pos, pos+fade_t, fade_to_percent)
afade_str = ','.join(afade_arg)
... и передается в ffmpeg следующим образом:
exit_code = subprocess.call(["ffmpeg", "-i", "input.mp3", "-filter_complex", "[in]" + afade_str + "[out]" ,"-map", "[out]", "out.mp3"])