@@ -164,6 +164,69 @@ receive do {:ex_webrtc, ^pc1, {:track, _track}} = msg -> IO.inspect(msg) end
164
164
165
165
<!-- tabs-close -->
166
166
167
+ ## Offer to receive data
168
+
169
+ Offering to receive media tracks is a bit tricky as we can't force the other side to send something.
170
+ Therefore, when we send an offer with the mline's direction set to ` recvonly ` , the other side will,
171
+ by default, set such a track to inactive.
172
+ To make things work, we have to manually set the direction to ` sendonly ` .
173
+
174
+ <!-- tabs-open -->
175
+
176
+ ### JavaScript
177
+
178
+ [ ![ JS FIDDLE] ( https://img.shields.io/badge/-JS%20FIDDLE-blueviolet )] ( https://jsfiddle.net/mickel8/bhv8ds03/ )
179
+
180
+ ``` js
181
+ pc1 = new RTCPeerConnection ();
182
+ pc2 = new RTCPeerConnection ();
183
+
184
+ tr = pc1 .addTransceiver (" audio" , { direction: " recvonly" });
185
+
186
+ offer = await pc1 .createOffer ();
187
+
188
+ await pc1 .setLocalDescription (offer);
189
+ await pc2 .setRemoteDescription (offer);
190
+
191
+ // change direction from default "recvonly" to "sendonly"
192
+ // in other case, when negotiation finishes,
193
+ // currentDirection of this transceiver will be inactive
194
+ pc2 .getTransceivers ()[0 ].direction = " sendonly" ;
195
+
196
+ answer = await pc2 .createAnswer ();
197
+ await pc2 .setLocalDescription (answer);
198
+ await pc1 .setRemoteDescription (answer);
199
+
200
+ console .log (pc2 .getTransceivers ()[0 ].direction );
201
+ console .log (pc2 .getTransceivers ()[0 ].currentDirection );
202
+ ```
203
+
204
+ ### Elixir WebRTC
205
+
206
+ ``` elixir
207
+ {:ok , pc1} = PeerConnection .start_link ()
208
+ {:ok , pc2} = PeerConnection .start_link ()
209
+
210
+ {:ok , _tr } = PeerConnection .add_transceiver (pc1, :audio , direction: :recvonly )
211
+
212
+ {:ok , offer} = PeerConnection .create_offer (pc1)
213
+ :ok = PeerConnection .set_local_description (pc1, offer)
214
+ :ok = PeerConnection .set_remote_description (pc2, offer)
215
+
216
+ [pc2_tr] = PeerConnection .get_transceivers (pc2)
217
+ :ok = PeerConnection .set_transceiver_direction (pc2, pc2_tr.id, :sendonly )
218
+
219
+ {:ok , answer} = PeerConnection .create_answer (pc2)
220
+ :ok = PeerConnection .set_local_description (pc2, answer)
221
+ :ok = PeerConnection .set_remote_description (pc1, answer)
222
+
223
+ [pc2_tr] = PeerConnection .get_transceivers (pc2)
224
+ IO .inspect (pc2_tr.direction)
225
+ IO .inspect (pc2_tr.current_direction)
226
+ ```
227
+
228
+ <!-- tabs-close -->
229
+
167
230
## Rejecting Incoming Track
168
231
169
232
To reject incoming track, we simply change the transceiver's direction to "inactive".
0 commit comments