Skip to content
vic

talklittle/ffmpex

Elixir wrapper for FFmpeg command line interface

talklittle/ffmpex.json
{
"createdAt": "2016-07-27T23:14:14Z",
"defaultBranch": "master",
"description": "Elixir wrapper for FFmpeg command line interface",
"fullName": "talklittle/ffmpex",
"homepage": "https://hexdocs.pm/ffmpex/",
"language": "Elixir",
"name": "ffmpex",
"pushedAt": "2024-06-30T22:15:29Z",
"stargazersCount": 238,
"topics": [],
"updatedAt": "2025-10-10T23:14:36Z",
"url": "https://github.com/talklittle/ffmpex"
}

Build Status Module Version

An Elixir wrapper for the FFmpeg command line interface.

Documentation: https://hexdocs.pm/ffmpex/

The API is a builder, building up the list of options per-file, per-stream(-per-file), and globally.

Note that adding options is backwards from using the ffmpeg CLI; when using ffmpeg CLI, you specify the options before each file. But with FFmpex (this library), you add the file/stream first, then add the relevant options afterward.

import FFmpex
use FFmpex.Options
command =
FFmpex.new_command
|> add_global_option(option_y())
|> add_input_file("/path/to/input.avi")
|> add_output_file("/path/to/output.avi")
|> add_stream_specifier(stream_type: :video)
|> add_stream_option(option_b("64k"))
|> add_file_option(option_maxrate("128k"))
|> add_file_option(option_bufsize("64k"))
{:ok, output} = execute(command)

It is possible to obtain ffmpeg’s output with:

command =
FFmpex.new_command
|> add_input_file("/path/to/input.mp4")
|> to_stdout()
|> add_file_option(option_f("avi"))
{:ok, output} = execute(command)
do_something(output)

You can use the FFprobe module to query for file info:

FFprobe.duration("/path/to/input.avi")
# => result in seconds, e.g., 228.456939

See silent_video and thumbnex for more usage examples.

FFmpeg must be installed.

Add ffmpex to your list of dependencies in mix.exs:

def deps do
[
{:ffmpex, "~> 0.11.0"}
]
end

You can specify some options in config.exs:

config :ffmpex, ffmpeg_path: "/path/to/ffmpeg"
config :ffmpex, ffprobe_path: "/path/to/ffprobe"

See the [Changelog]!(./CHANGELOG.md) for changes between versions.

FFmpex is not affiliated with nor endorsed by the FFmpeg project.

FFmpeg is a trademark of Fabrice Bellard, originator of the FFmpeg project.

Copyright (c) 2016 Andrew Shu

FFmpex source code is licensed under the [MIT License]!(./LICENSE.md).