OctopusRage
How to use Membrane webrtc for audio only?
hey guys im quite new using membrane, i want to use membrane webrtc to utilize my webrtc call (audio only)
here’s my pipeline
@impl true
def handle_init(_ctx, opts) do
spec =
child(:webrtc_source, %Membrane.WebRTC.Source{
signaling: opts[:ingress_signaling]
})
|> via_out(:output, options: [kind: :audio])
|> child(%Membrane.Transcoder{output_stream_format: Membrane.Opus})
|> child(:audio_realtimer, Membrane.Realtimer)
|> via_in(:input, options: [kind: :audio])
|> child(:webrtc_sink, %Membrane.WebRTC.Sink{
signaling: opts[:egress_signaling]
})
{[spec: spec], %{}}
end
and here’s my channels code
@impl true
def join("call:" <> signaling_id, %{"call_id" => call_id, "role" => role} = payload, socket) when role in ["ingress", "egress"] do
PhoenixSignaling.register_channel(signaling_id)
signaling = PhoenixSignaling.Registry.get(signaling_id)
c_pid = CallHandler.new(call_id)
if role == "egress" do
CallHandler.add_egress(c_pid, signaling_id, signaling)
else
CallHandler.add_ingress(c_pid, signaling_id, signaling)
end
socket = assign(socket, :signaling_id, signaling_id)
{:ok, socket}
end
@impl true
def handle_in(signaling_id, msg, socket) do
IO.inspect({:receive_frombrows, signaling_id, msg})
# msg = Jason.decode!(msg)
PhoenixSignaling.signal(signaling_id, msg)
{:noreply, socket}
end
@impl true
def handle_info({:membrane_webrtc_signaling, _pid, msg, _metadata}, socket) do
IO.inspect({:receive_signal, socket.assigns.signaling_id, msg})
push(socket, socket.assigns.signaling_id, msg)
{:noreply, socket}
end
all my peers successfully doing handshake but media wont flow into my peers
no errors in my code either, did i make some mistake on my pipeline?
Most Liked
varsill
I see, so as I mentioned before - each of the Membrane.WebRTC.Source and Membrane.WebRTC.Sink elements supports only either inbound our outbound traffic for a single PeerConnection, but not both at the time.
However it’s possible to write a Membrane component based on ex_webrtc that would handle both inbound and outbound tracks with a single PeerConnection - you can take a look at how they did it here: membrane_rtc_engine/ex_webrtc/lib/ex_webrtc_endpoint.ex at master · fishjam-cloud/membrane_rtc_engine · GitHub .
Unfortunately it’s more complicated than handling just a single type of tracks.







