Skip to content

Commit a2fed46

Browse files
committed
changes webrtc
1 parent 19a2797 commit a2fed46

15 files changed

+857
-29
lines changed

.metadata

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# This file should be version controlled.
55

66
version:
7-
revision: 135454af32477f815a7525073027a3ff9eff1bfd
7+
revision: f1875d570e39de09040c8f79aa13cc56baab8db1
88
channel: stable
99

1010
project_type: app
@@ -13,26 +13,11 @@ project_type: app
1313
migration:
1414
platforms:
1515
- platform: root
16-
create_revision: 135454af32477f815a7525073027a3ff9eff1bfd
17-
base_revision: 135454af32477f815a7525073027a3ff9eff1bfd
18-
- platform: android
19-
create_revision: 135454af32477f815a7525073027a3ff9eff1bfd
20-
base_revision: 135454af32477f815a7525073027a3ff9eff1bfd
21-
- platform: ios
22-
create_revision: 135454af32477f815a7525073027a3ff9eff1bfd
23-
base_revision: 135454af32477f815a7525073027a3ff9eff1bfd
24-
- platform: linux
25-
create_revision: 135454af32477f815a7525073027a3ff9eff1bfd
26-
base_revision: 135454af32477f815a7525073027a3ff9eff1bfd
27-
- platform: macos
28-
create_revision: 135454af32477f815a7525073027a3ff9eff1bfd
29-
base_revision: 135454af32477f815a7525073027a3ff9eff1bfd
16+
create_revision: f1875d570e39de09040c8f79aa13cc56baab8db1
17+
base_revision: f1875d570e39de09040c8f79aa13cc56baab8db1
3018
- platform: web
31-
create_revision: 135454af32477f815a7525073027a3ff9eff1bfd
32-
base_revision: 135454af32477f815a7525073027a3ff9eff1bfd
33-
- platform: windows
34-
create_revision: 135454af32477f815a7525073027a3ff9eff1bfd
35-
base_revision: 135454af32477f815a7525073027a3ff9eff1bfd
19+
create_revision: f1875d570e39de09040c8f79aa13cc56baab8db1
20+
base_revision: f1875d570e39de09040c8f79aa13cc56baab8db1
3621

3722
# User provided section
3823

lib/features/home/data/repositories/web_rtc_repository.dart

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
// ignore_for_file: use_setters_to_change_properties, use_late_for_private_fields_and_variables, inference_failure_on_collection_literal
22

33
import 'dart:async';
4+
import 'dart:convert';
45
import 'dart:developer';
56

67
import 'package:demo_webrtc/core/core.dart';
78
import 'package:demo_webrtc/features/home/home.dart';
89
import 'package:flutter_webrtc/flutter_webrtc.dart';
910
import 'package:injectable/injectable.dart';
11+
import 'package:sdp_transform/sdp_transform.dart';
1012

1113
@Injectable(as: IWebRTCRepository)
1214
class WebRtcRepository implements IWebRTCRepository {
@@ -39,7 +41,6 @@ class WebRtcRepository implements IWebRTCRepository {
3941
_remoteVideoRenderer = RTCVideoRenderer();
4042
await _remoteVideoRenderer.initialize();
4143
_peerConnection = await _createPeerConnection();
42-
await _createOffer();
4344
return _remoteVideoRenderer;
4445
} catch (_) {
4546
rethrow;
@@ -83,6 +84,7 @@ class WebRtcRepository implements IWebRTCRepository {
8384
'sdpSemantics': 'plan-b',
8485
'iceServers': [
8586
{'url': 'stun:stun.l.google.com:19302'}
87+
// {'url': 'eturnal.stunturn.svc.cluster.local:3479'}
8688
// {'url': _config.turnUrl}
8789
]
8890
};
@@ -124,10 +126,47 @@ class WebRtcRepository implements IWebRTCRepository {
124126
return peerConnection;
125127
}
126128

127-
Future<void> _createOffer() async {
128-
final description = await _peerConnection!.createOffer(
129-
{'offerToReceiveVideo': 1},
129+
@override
130+
Future<Map<String, dynamic>> createOffer() async {
131+
final description = await _peerConnection!.createOffer(_constraints);
132+
await _peerConnection!.setLocalDescription(description);
133+
return _sesion(description);
134+
}
135+
136+
@override
137+
Future<Map<String, dynamic>> createAnswer() async {
138+
final description = await _peerConnection!.createAnswer(_constraints);
139+
await _peerConnection!.setLocalDescription(description);
140+
return _sesion(description);
141+
}
142+
143+
@override
144+
Future<void> setRemoteDescription(String value) async {
145+
final session = await jsonDecode(value) as Map<String, dynamic>;
146+
final sdp = write(session, null);
147+
final description = RTCSessionDescription(
148+
sdp,
149+
'answer',
150+
// : 'offer',
130151
);
131-
_peerConnection!.setLocalDescription(description);
152+
log(description.toMap().toString());
153+
await _peerConnection!.setRemoteDescription(description);
132154
}
155+
156+
@override
157+
Future<void> addCandidate(String value) async {
158+
final session = await jsonDecode(value);
159+
log((session['candidate'] as String?) ?? '');
160+
final candidate = RTCIceCandidate(
161+
session['candidate'] as String?,
162+
session['sdpMid'] as String?,
163+
session['sdpMlineIndex'] as int?,
164+
);
165+
await _peerConnection!.addCandidate(candidate);
166+
}
167+
168+
Map<String, dynamic> _sesion(RTCSessionDescription description) =>
169+
parse(description.sdp!);
170+
171+
Map<String, dynamic> get _constraints => {'offerToReceiveVideo': 1};
133172
}

lib/features/home/domain/repositories/i_web_rtc_repository.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ abstract class IWebRTCRepository {
55
Future<RTCVideoRenderer> initRemoteRender();
66
Stream<WebRTCData> get onLocalWebRTC;
77
Future<void> close();
8+
Future<Map<String, dynamic>> createOffer();
9+
Future<Map<String, dynamic>> createAnswer();
10+
Future<void> setRemoteDescription(String value);
11+
Future<void> addCandidate(String value);
812
}
913

1014
abstract class WebRTCData {}

lib/features/home/presentation/bloc/home_bloc.dart

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'dart:developer';
33

44
import 'package:bloc/bloc.dart';
55
import 'package:demo_webrtc/features/home/home.dart';
6+
import 'package:flutter/material.dart';
67
import 'package:flutter_webrtc/flutter_webrtc.dart';
78
import 'package:freezed_annotation/freezed_annotation.dart';
89
import 'package:injectable/injectable.dart';
@@ -17,6 +18,10 @@ class HomeBloc extends Bloc<HomeEvent, HomeState> {
1718
HomeBloc(this._repository) : super(HomeState.initial()) {
1819
on<_Start>(_startToState);
1920
on<_RemoteConnect>(_remoteConnectToState);
21+
on<_Offer>(_offerToState);
22+
on<_Answer>(_answerToState);
23+
on<_Description>(_descriptionToState);
24+
on<_Candidate>(_candidateToState);
2025
}
2126

2227
final IWebRTCRepository _repository;
@@ -27,6 +32,13 @@ class HomeBloc extends Bloc<HomeEvent, HomeState> {
2732
RTCVideoRenderer get localRender => _localRender;
2833
RTCVideoRenderer get remoteRender => _remoteRender;
2934

35+
late final TextEditingController _controller;
36+
TextEditingController get controller => _controller;
37+
38+
void init() {
39+
_controller = TextEditingController();
40+
}
41+
3042
Future<void> _startToState(_, Emitter<HomeState> emit) async {
3143
try {
3244
Wakelock.enable();
@@ -76,7 +88,47 @@ class HomeBloc extends Bloc<HomeEvent, HomeState> {
7688
Future<void> close() async {
7789
await _subscription.cancel();
7890
await _repository.close();
91+
_controller.dispose();
7992
Wakelock.disable();
8093
return super.close();
8194
}
95+
96+
Future<void> _offerToState(_, Emitter<HomeState> emit) async {
97+
try {
98+
final session = await _repository.createOffer();
99+
print('==============');
100+
print(session);
101+
print('==============');
102+
} catch (_) {
103+
print(_);
104+
}
105+
}
106+
107+
Future<void> _answerToState(_, Emitter<HomeState> emit) async {
108+
try {
109+
final session = await _repository.createAnswer();
110+
print(session);
111+
} catch (_) {
112+
print(_);
113+
}
114+
}
115+
116+
Future<void> _descriptionToState(_, Emitter<HomeState> emit) async {
117+
try {
118+
print(value);
119+
await _repository.setRemoteDescription(value);
120+
} catch (_) {
121+
print(_);
122+
}
123+
}
124+
125+
Future<void> _candidateToState(_, Emitter<HomeState> emit) async {
126+
try {
127+
await _repository.addCandidate(value);
128+
} catch (_) {
129+
print(_);
130+
}
131+
}
132+
133+
String get value => _controller.text;
82134
}

0 commit comments

Comments
 (0)