Membrane plugin to transcode video into different qualities using FFmpeg.
- ffmpeg
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"})
]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"})
]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"})
]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{})
]resolution:{width, height}(use-2for auto-calculated dimension)bitrate: Maximum bitrate in bits/secondfps: Target framerateprofile::baseline,:main,:highcrf: Constant rate factor (18-28, lower = higher quality)preset::ultrafast,:veryfast,:fast,:medium,:slowtune::zerolatency,:film,:animationgop_size: GOP size in framesb_frames: Number of B-framescopy: Skip re-encoding (boolean)
bitrate: Target bitrate in bits/secondsample_rate: Sample rate in Hzchannels: Number of audio channelscopy: Skip re-encoding (boolean)
- 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 2024, KIM Keep In Mind GmbH Licensed under the Apache License, Version 2.0