Packages
membrane_ffmpeg_transcoder_plugin
1.5.2
1.6.1
1.6.0
1.5.16
1.5.15
1.5.14
1.5.13
1.5.12
1.5.11
1.5.10
1.5.9
1.5.8
1.5.7
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.2
1.4.1
1.4.0
1.3.1
1.3.0
1.2.12
1.2.11
1.2.10
1.2.9
1.2.8
1.2.7
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.2
1.0.1
1.0.0
Membrane plugin to transcode audio and video into different qualities using FFmpeg
Current section
Files
Jump to
Current section
Files
membrane_ffmpeg_transcoder_plugin
README.md
README.md
# Membrane.FFmpeg.Transcoder

Membrane plugin to transcode video into different qualities using FFmpeg.
## Requirements
- ffmpeg
## Usage
### Basic Multi-Quality Transcoding
```elixir
spec = [
child(:source, %Membrane.File.Source{location: "input.ts"})
|> child(:transcoder, Membrane.FFmpeg.Transcoder)
|> via_out(:video, options: [resolution: {-2, 1080}, bitrate: 6_500_000, fps: 30])
|> child(:hd_sink, %Membrane.File.Sink{location: "hd.h264"}),
get_child(:transcoder)
|> via_out(:video, options: [resolution: {-2, 720}, bitrate: 3_300_000, fps: 30])
|> child(:sd_sink, %Membrane.File.Sink{location: "sd.h264"}),
get_child(:transcoder)
|> via_out(:audio, options: [bitrate: 128_000, sample_rate: 48_000, channels: 2])
|> child(:audio_sink, %Membrane.File.Sink{location: "audio.aac"})
]
```
### Stream Copy (No Re-encoding)
```elixir
spec = [
child(:source, %Membrane.File.Source{location: "input.ts"})
|> child(:transcoder, Membrane.FFmpeg.Transcoder)
|> via_out(:video, options: [copy: true])
|> child(:video_sink, %Membrane.File.Sink{location: "video.h264"}),
get_child(:transcoder)
|> via_out(:audio, options: [copy: true])
|> child(:audio_sink, %Membrane.File.Sink{location: "audio.aac"})
]
```
### MP4 Output with Parsers
```elixir
spec = [
child(:source, %Membrane.File.Source{location: "input.ts"})
|> child(:transcoder, Membrane.FFmpeg.Transcoder)
|> via_out(:video, options: [resolution: {-2, 720}, bitrate: 3_300_000])
|> child(:h264_parser, %Membrane.H264.Parser{output_stream_structure: :avc1})
|> child(:mp4_muxer, %Membrane.MP4.Muxer.ISOM{fast_start: true})
|> child(:sink, %Membrane.File.Sink{location: "output.mp4"})
]
```
### Teletext Subtitle Extraction
```elixir
spec = [
child(:source, %Membrane.File.Source{location: "input_with_teletext.ts"})
|> child(:transcoder, Membrane.FFmpeg.Transcoder)
|> via_out(:text, options: [source: {:dvb_teletext, 777}])
|> child(:subtitle_sink, %Membrane.Testing.Sink{})
]
```
### Video Options
- `resolution`: `{width, height}` (use `-2` for auto-calculated dimension)
- `bitrate`: Maximum bitrate in bits/second
- `fps`: Target framerate
- `profile`: `:baseline`, `:main`, `:high`
- `crf`: Constant rate factor (18-28, lower = higher quality)
- `preset`: `:ultrafast`, `:veryfast`, `:fast`, `:medium`, `:slow`
- `tune`: `:zerolatency`, `:film`, `:animation`
- `gop_size`: GOP size in frames
- `b_frames`: Number of B-frames
- `copy`: Skip re-encoding (boolean)
### Audio Options
- `bitrate`: Target bitrate in bits/second
- `sample_rate`: Sample rate in Hz
- `channels`: Number of audio channels
- `copy`: Skip re-encoding (boolean)
## Features
- buffers come with pts and dts values
- same performance as ffmpeg
- simple API: attach an output with options, that's it (check the test)
- constrains the bitrate
- by adding a Membrane.h264.Parser in the middle, it is compatible with Membrane.MP4.Muxer.CMAF and Membrane.MP4.Muxer.ISOM
- transcodes to AAC and H264
## Copyright and License
Copyright 2024, [KIM Keep In Mind GmbH](https://www.keepinmind.info/)
Licensed under the [Apache License, Version 2.0](LICENSE)