1
1
using NativeWebSocket ;
2
+ using System . Collections ;
3
+ using Unity . WebRTC ;
2
4
using UnityEngine ;
3
5
using UnityEngine . Events ;
4
6
using UnityEngine . UI ;
@@ -56,6 +58,8 @@ public class WebRTCConnection : MonoBehaviour {
56
58
public UnityEvent AudioTransmissionReceived ;
57
59
58
60
private WebRTCManager webRTCManager ;
61
+ private VideoStreamTrack videoStreamTrack ;
62
+ private AudioStreamTrack audioStreamTrack ;
59
63
60
64
private void Awake ( ) {
61
65
SimpleWebRTCLogger . EnableLogging = ShowLogs ;
@@ -117,28 +121,22 @@ private void Update() {
117
121
118
122
if ( StartStopVideoTransmission && ! IsVideoTransmissionActive && IsVideoAudioSender ) {
119
123
IsVideoTransmissionActive = ! IsVideoTransmissionActive ;
120
- StreamingCamera . gameObject . SetActive ( IsVideoTransmissionActive ) ;
121
- webRTCManager . AddVideoTrack ( StreamingCamera , VideoResolution . x , VideoResolution . y ) ;
124
+ StartVideoTransmission ( ) ;
122
125
}
123
126
124
127
if ( ! StartStopVideoTransmission && IsVideoTransmissionActive ) {
125
128
IsVideoTransmissionActive = ! IsVideoTransmissionActive ;
126
- StreamingCamera . gameObject . SetActive ( IsVideoTransmissionActive ) ;
127
- webRTCManager . RemoveVideoTrack ( ) ;
129
+ StopVideoTransmission ( ) ;
128
130
}
129
131
130
132
if ( StartStopAudioTransmission && ! IsAudioTransmissionActive && IsVideoAudioSender ) {
131
133
IsAudioTransmissionActive = ! IsAudioTransmissionActive ;
132
- StreamingAudioSource . gameObject . SetActive ( IsAudioTransmissionActive ) ;
133
- StreamingAudioSource . Play ( ) ;
134
- webRTCManager . AddAudioTrack ( StreamingAudioSource ) ;
134
+ StartAudioTransmission ( ) ;
135
135
}
136
136
137
137
if ( ! StartStopAudioTransmission && IsAudioTransmissionActive ) {
138
138
IsAudioTransmissionActive = ! IsAudioTransmissionActive ;
139
- StreamingAudioSource . Stop ( ) ;
140
- StreamingAudioSource . gameObject . SetActive ( IsAudioTransmissionActive ) ;
141
- webRTCManager . RemoveAudioTrack ( ) ;
139
+ StopAudioTransmission ( ) ;
142
140
}
143
141
}
144
142
@@ -254,29 +252,78 @@ public void SendDataChannelMessageToPeer(string targetPeerId, string message) {
254
252
}
255
253
256
254
public void StartVideoTransmission ( ) {
255
+ StopCoroutine ( StartVideoTransmissionAsync ( ) ) ;
256
+ StartCoroutine ( StartVideoTransmissionAsync ( ) ) ;
257
+ }
258
+
259
+ private IEnumerator StartVideoTransmissionAsync ( ) {
260
+
261
+ StreamingCamera . gameObject . SetActive ( true ) ;
262
+
263
+ // camera activation delay?
264
+ yield return new WaitForSeconds ( 1f ) ;
265
+
257
266
if ( IsVideoTransmissionActive ) {
258
267
// for restarting without stopping
259
268
webRTCManager . RemoveVideoTrack ( ) ;
260
- webRTCManager . AddVideoTrack ( StreamingCamera , VideoResolution . x , VideoResolution . y ) ;
261
269
}
270
+ videoStreamTrack = StreamingCamera . CaptureStreamTrack ( VideoResolution . x , VideoResolution . y ) ;
271
+ webRTCManager . AddVideoTrack ( videoStreamTrack ) ;
272
+
262
273
StartStopVideoTransmission = true ;
274
+ IsVideoTransmissionActive = true ;
263
275
}
264
276
265
277
public void StopVideoTransmission ( ) {
278
+
279
+ StopCoroutine ( StartVideoTransmissionAsync ( ) ) ;
280
+
281
+ StreamingCamera . gameObject . SetActive ( false ) ;
282
+
283
+ webRTCManager . RemoveVideoTrack ( ) ;
284
+
266
285
StartStopVideoTransmission = false ;
286
+ IsVideoTransmissionActive = false ;
267
287
}
268
288
269
289
public void StartAudioTransmission ( ) {
290
+ StopCoroutine ( StartAudioTransmissionAsync ( ) ) ;
291
+ StartCoroutine ( StartAudioTransmissionAsync ( ) ) ;
292
+ }
293
+
294
+ private IEnumerator StartAudioTransmissionAsync ( ) {
295
+
296
+ StopCoroutine ( StartAudioTransmissionAsync ( ) ) ;
297
+
298
+ StreamingAudioSource . gameObject . SetActive ( IsAudioTransmissionActive ) ;
299
+
300
+ // audio activation delay?
301
+ yield return new WaitForSeconds ( 1f ) ;
302
+
303
+ StreamingAudioSource . Play ( ) ;
304
+
270
305
if ( IsAudioTransmissionActive ) {
271
306
// for restarting without stopping
272
307
webRTCManager . RemoveAudioTrack ( ) ;
273
- webRTCManager . AddAudioTrack ( StreamingAudioSource ) ;
274
308
}
309
+ audioStreamTrack = new AudioStreamTrack ( StreamingAudioSource ) {
310
+ Loopback = true
311
+ } ;
312
+ webRTCManager . AddAudioTrack ( audioStreamTrack ) ;
313
+
275
314
StartStopAudioTransmission = true ;
315
+ IsAudioTransmissionActive = true ;
276
316
}
277
317
278
318
public void StopAudioTransmission ( ) {
319
+
320
+ StreamingAudioSource . Stop ( ) ;
321
+ StreamingAudioSource . gameObject . SetActive ( IsAudioTransmissionActive ) ;
322
+
323
+ webRTCManager . RemoveAudioTrack ( ) ;
324
+
279
325
StartStopAudioTransmission = false ;
326
+ IsAudioTransmissionActive = false ;
280
327
}
281
328
}
282
329
}
0 commit comments