Skip to content

Commit 884ab81

Browse files
committed
wip restart connection on tracks change
1 parent 7e72442 commit 884ab81

File tree

3 files changed

+61
-44
lines changed

3 files changed

+61
-44
lines changed

assets/player.js

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,42 @@
11
export function createPlayerHook(iceServers = []) {
22
return {
33
async mounted() {
4-
this.videoQuality = document.getElementById("lexp-video-quality");
5-
this.videoQuality.onchange = () => {
6-
this.pushEventTo(this.el, "layer", this.videoQuality.value);
4+
const view = view;
5+
6+
view.handleEvent("restart", async () => await view.connect(view));
7+
8+
await view.connect(view);
9+
},
10+
11+
async connect(view) {
12+
view.videoQuality = document.getElementById("lexp-video-quality");
13+
view.videoQuality.onchange = () => {
14+
view.pushEventTo(view.el, "layer", view.videoQuality.value);
715
};
816

9-
this.pc = new RTCPeerConnection({ iceServers: iceServers });
17+
view.pc = new RTCPeerConnection({ iceServers: iceServers });
1018

11-
this.pc.onicecandidate = (ev) => {
12-
this.pushEventTo(this.el, "ice", JSON.stringify(ev.candidate));
19+
view.pc.onicecandidate = (ev) => {
20+
view.pushEventTo(view.el, "ice", JSON.stringify(ev.candidate));
1321
};
1422

15-
this.pc.ontrack = (ev) => {
16-
if (!this.el.srcObject) {
17-
this.el.srcObject = ev.streams[0];
23+
view.pc.ontrack = (ev) => {
24+
if (!view.el.srcObject) {
25+
view.el.srcObject = ev.streams[0];
1826
}
1927
};
20-
this.pc.addTransceiver("audio", { direction: "recvonly" });
21-
this.pc.addTransceiver("video", { direction: "recvonly" });
28+
view.pc.addTransceiver("audio", { direction: "recvonly" });
29+
view.pc.addTransceiver("video", { direction: "recvonly" });
2230

23-
const offer = await this.pc.createOffer();
24-
await this.pc.setLocalDescription(offer);
31+
const offer = await view.pc.createOffer();
32+
await view.pc.setLocalDescription(offer);
2533

26-
const eventName = "answer" + "-" + this.el.id;
27-
this.handleEvent(eventName, async (answer) => {
28-
await this.pc.setRemoteDescription(answer);
34+
const eventName = "answer" + "-" + view.el.id;
35+
view.handleEvent(eventName, async (answer) => {
36+
await view.pc.setRemoteDescription(answer);
2937
});
3038

31-
this.pushEventTo(this.el, "offer", offer);
39+
view.pushEventTo(view.el, "offer", offer);
3240
},
3341
};
3442
}

lib/live_ex_webrtc/player.ex

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -300,35 +300,43 @@ defmodule LiveExWebRTC.Player do
300300
def handle_info({:live_ex_webrtc, :info, publisher_audio_track, publisher_video_track}, socket) do
301301
%{player: player} = socket.assigns
302302

303-
player =
304-
case player do
305-
%Player{publisher_audio_track: nil, publisher_video_track: nil} ->
306-
video_layers = (publisher_video_track && publisher_video_track.rids) || ["h"]
307-
308-
video_layers =
309-
Enum.map(video_layers, fn
310-
"h" -> {"h", "high"}
311-
"m" -> {"m", "medium"}
312-
"l" -> {"l", "low"}
313-
end)
314-
315-
%Player{
316-
player
317-
| publisher_audio_track: publisher_audio_track,
318-
publisher_video_track: publisher_video_track,
319-
video_layers: video_layers
320-
}
321-
322-
%Player{
323-
publisher_audio_track: ^publisher_audio_track,
324-
publisher_video_track: ^publisher_video_track
325-
} ->
303+
case player do
304+
%Player{
305+
publisher_audio_track: ^publisher_audio_track,
306+
publisher_video_track: ^publisher_video_track
307+
} ->
308+
# tracks are the same, do nothing
309+
{:noreply, socket}
310+
311+
%Player{
312+
publisher_audio_track: old_publisher_audio_track,
313+
publisher_video_track: old_publisher_video_track
314+
} ->
315+
video_layers = (publisher_video_track && publisher_video_track.rids) || ["h"]
316+
317+
video_layers =
318+
Enum.map(video_layers, fn
319+
"h" -> {"h", "high"}
320+
"m" -> {"m", "medium"}
321+
"l" -> {"l", "low"}
322+
end)
323+
324+
player = %Player{
326325
player
327-
end
326+
| publisher_audio_track: publisher_audio_track,
327+
publisher_video_track: publisher_video_track,
328+
video_layers: video_layers
329+
}
328330

329-
socket = assign(socket, :player, player)
331+
socket = assign(socket, :player, player)
330332

331-
{:noreply, socket}
333+
if old_publisher_audio_track != nil or old_publisher_video_track != nil do
334+
socket = push_event(socket, "restart-#{player.id}", %{})
335+
{:noreply, socket}
336+
else
337+
{:noreply, socket}
338+
end
339+
end
332340
end
333341

334342
def handle_info({:live_ex_webrtc, :audio, packet}, socket) do

mix.exs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ defmodule LiveExWebrtc.MixProject do
4242
[
4343
{:phoenix_live_view, "~> 1.0"},
4444
{:jason, "~> 1.0"},
45-
{:ex_webrtc, "~> 0.8.0"},
45+
# {:ex_webrtc, "~> 0.8.0"},
46+
{:ex_webrtc, github: "elixir-webrtc/ex_webrtc", branch: "vp8-simulcast", override: true},
4647
{:ex_doc, "~> 0.31", only: :dev, runtime: false}
4748
]
4849
end

0 commit comments

Comments
 (0)