Packages
membrane_hls_plugin
2.0.2
3.0.10
3.0.9
3.0.8
3.0.7
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
2.1.9
2.1.8
2.1.7
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.16
2.0.15
2.0.14
2.0.13
2.0.12
2.0.11
2.0.10
2.0.9
2.0.8
2.0.7
2.0.6
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.1.12
1.1.11
1.1.10
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.0
Adaptive live streaming (HLS) plugin for the Membrane Framework.
Current section
Files
Jump to
Current section
Files
lib/membrane/hls/ts_sink.ex
defmodule Membrane.HLS.TSSink do
use Membrane.Sink
alias HLS.Packager
def_input_pad(:input,
accepted_format: Membrane.RemoteStream
)
def_options(
packager: [
spec: pid(),
description: "PID of the packager."
],
track_id: [
spec: String.t(),
description: "ID of the track."
],
build_stream: [
spec: (map() -> HLS.VariantStream.t() | HLS.AlternativeRendition.t()),
description: "Build the stream with the given stream format"
],
target_segment_duration: [
spec: Membrane.Time.t()
]
)
@impl true
def handle_init(_context, opts) do
{[], %{opts: opts}}
end
@impl true
def handle_stream_format(:input, format, _ctx, state) do
track_id = state.opts.track_id
target_segment_duration =
Membrane.Time.as_seconds(state.opts.target_segment_duration, :exact)
|> Ratio.ceil()
{codecs, stream} =
case state.opts.build_stream.(format) do
{format, stream} ->
info = %{
mp4a: %{
aot_id: Membrane.AAC.profile_to_aot_id(format.profile),
channels: Membrane.AAC.channels_to_channel_config_id(format.channels),
frequency: format.sample_rate
}
}
codecs = Membrane.HLS.serialize_codecs(info)
{codecs, stream}
stream ->
{Map.get(stream, Access.key!(:codecs), []), stream}
end
Packager.add_track(
state.opts.packager,
track_id,
codecs: codecs,
stream: stream,
segment_extension: ".ts",
target_segment_duration: target_segment_duration
)
{[], state}
end
@impl true
def handle_buffer(:input, buffer, _ctx, state) do
Packager.put_segment(
state.opts.packager,
state.opts.track_id,
buffer.payload,
Membrane.Time.as_seconds(buffer.metadata.duration) |> Ratio.to_float()
)
{[], state}
end
end