Apply the filter to video (only), and pass the filtered video and the original audio as arguments to output(...)
:
import ffmpeg
v = ffmpeg.input("input.webm").video.filter("scale", force_original_aspect_ratio="decrease", force_divisible_by=2)
a = ffmpeg.input("input.webm").audio
ffmpeg.output(v, a, "out.mp4", vcodec="libx264", r=60, preset='fast', acodec='aac').overwrite_output().run()
In case you want it in one line:
ffmpeg.output(ffmpeg.input("input.webm").video.filter("scale", force_original_aspect_ratio="decrease", force_divisible_by=2), ffmpeg.input("input.webm").audio, "out.mp4", vcodec="libx264", r=60, preset='fast', acodec='aac').overwrite_output().run()
For getting the equivalent command line, you may add -report
global argument, and check the log file:
ffmpeg.output(ffmpeg.input("input.webm").video.filter("scale", force_original_aspect_ratio="decrease", force_divisible_by=2), ffmpeg.input("input.webm").audio, "out.mp4", vcodec="libx264", r=60, preset='fast', acodec='aac').global_args('-report').overwrite_output().run()
According to the log file, the equivalent command line is:
ffmpeg -i input.webm -filter_complex "[0:v]scale=force_divisible_by=2:force_original_aspect_ratio=decrease[s0]" -map "[s0]" -map 0:a -acodec aac -preset fast -r 60 -vcodec libx264 out.mp4 -report -y
As you can see, -filter_complex
is used, the filtered video is mapped with -map "[s0]"
and the audio is mapped with -map 0:a
.