Call FFMPEG with Complex Filter from Ports

I’m trying to call FFMPEG with a complex filter from Ports, but despite the command working in my shell, I somehow miss the understanding to get it working in Elixir with ports when combined with a complex filter.

This works in my shell,

ffmpeg -i input.mp4 -filter_complex " [0:a] volume=1 [final_audio]" -map ‘[final_audio]’ output.mp4

but the following in Elixir does not work. It seems to get stuck before the transformation.

ffmpeg = System.find_executable(“ffmpeg”)
ffmpeg_args = ["-i", “input.mp4”, “-filter_complex”, “[0:a] volume=1 [final_audio]”, “-map”, “[final_audio]”, “-c:v”, “libx264”, “output.mp4”]
Port.open({:spawn_executable, ffmpeg}, [{:args, ffmpeg_args}, :binary, :exit_status, :hide, :use_stdio])

also the following gets stuck:

ffmpeg_args = ["-i", “input.mp4”, “-filter_complex”, “[0:a]”, “volume=1”, “[final_audio]”, “-map”, “[final_audio]”, “-c:v”, “libx264”, “output.mp4”]

On the other hand, the following works:

ffmpeg = System.find_executable(“ffmpeg”)
ffmpeg_args = ["-i", “video.mp4”, final_output]
Port.open({:spawn_executable, ffmpeg}, [{:args, ffmpeg_args}, :binary, :exit_status, :hide, :use_stdio])

I think you’re missing single quotes around the [final_audio]. And a set of double quotes around [0:a] volume=1 [final_audio]

I think you can simplify the argument passing by using the ~W/~w sigils.

ffmpeg_args = ~W(-i input.mp4 -filter_complex [0:a] volume=1 [final_audio] -map [final_audio] -c:v libx264 output.mp4)

1 Like

unfortunately, all of that does not seem to work. Somehow the complex filter seems to let the call get stuck before file transformation :frowning:

Do you want to keep with bare Elixir or would you mind trying a wrapper?

I remember that when Port was hurting me with stdin handling, I found the rambo lib to be incredibly useful!

3 Likes

I first wanted to get it working to optimize later so I avoid spending a lot of time for nothing.

Luckily, it’s working now with complex filters.

ffmpeg_args = ~W(-i interception.mp4 -filter_complex [0:a]volume=1[final_audio] -map [final_video] -c:v libx264 final_output.mp4)