I’m playing around with membrane, trying to save an RTP stream from an IP camera to file. Using code from some demos I managed to get the the video stream and send it to a hls stream to make sure it works. At this point my code looks like this:
def handle_init(opts) do
%{audio_port: audio_port, video_port: video_port} = opts
spec = %ParentSpec{
children: [
video_src: %Membrane.Element.UDP.Source{
local_port_no: video_port,
},
audio_src: %Membrane.Element.UDP.Source{
local_port_no: audio_port,
},
rtp: %RTP.SessionBin{
secure?: false,
},
],
links: [
link(:video_src) |> via_in(:rtp_input) |> to(:rtp),
link(:audio_src) |> via_in(:rtp_input) |> to(:rtp)
]
}
{{:ok, spec: spec}, %{}}
end
defp handle_stream(%{video: video_ssrc, table: table}) do
spec = %ParentSpec{
children: %{
video_parser: %Membrane.H264.FFmpeg.Parser{framerate: {30, 1}, alignment: :au, attach_nalus?: true},
video_payloader: Membrane.MP4.Payloader.H264,
video_cmaf_muxer: Membrane.MP4.CMAF.Muxer,
hls: %Membrane.HTTPAdaptiveStream.Sink {
manifest_module: Membrane.HTTPAdaptiveStream.HLS,
target_window_duration: 10 |> Membrane.Time.seconds(),
storage: %Membrane.HTTPAdaptiveStream.Storages.FileStorage{directory: "output"}
}
},
links: [
link(:rtp)
|> via_out(Pad.ref(:output, video_ssrc))
|> to(:video_parser)
|> to(:video_payloader)
|> to(:video_cmaf_muxer)
|> via_in(:input)
|> to(:hls)
],
stream_sync: :sinks
}
[spec: spec]
end
I’d like to replace the hls output and save the stream to a avi or mp4 file. Is it possible?
Thanks!