feature: switch between front and back cameras

This commit is contained in:
David Zhao
2021-08-06 21:20:21 -07:00
parent f1a7591ec7
commit 509a037936
6 changed files with 77 additions and 10 deletions
+38 -1
View File
@@ -5,6 +5,8 @@ import 'options.dart';
import 'video_track.dart';
class LocalVideoTrack extends VideoTrack {
RTCRtpSender? get sender => transceiver?.sender;
LocalVideoTrack(String name, MediaStreamTrack mediaTrack, MediaStream stream)
: super(name, mediaTrack, stream);
@@ -14,6 +16,41 @@ class LocalVideoTrack extends VideoTrack {
options = LocalVideoTrackOptions(params: VideoPresets.qhd);
}
try {
var stream = await _createCameraStream(options);
return LocalVideoTrack("camera", stream.getVideoTracks().first, stream);
} catch (e) {
return Future.error(e);
}
}
Future<void> restartTrack([LocalVideoTrackOptions? options]) async {
if (sender == null) {
return Future.error(TrackCreateError('could not restart track'));
}
if (options == null) {
options = LocalVideoTrackOptions(params: VideoPresets.qhd);
}
try {
var stream = await _createCameraStream(options);
var track = stream.getVideoTracks().first;
mediaStream = stream;
await mediaTrack.stop();
mediaTrack = track;
await sender?.replaceTrack(track);
} catch (e) {
return Future.error(e);
}
}
static Future<MediaStream> _createCameraStream(
LocalVideoTrackOptions? options) async {
if (options == null) {
options = LocalVideoTrackOptions(params: VideoPresets.qhd);
}
try {
var stream = await navigator.mediaDevices.getUserMedia({
"audio": false,
@@ -24,7 +61,7 @@ class LocalVideoTrack extends VideoTrack {
return Future.error(TrackCreateError());
}
return LocalVideoTrack("camera", stream.getVideoTracks().first, stream);
return stream;
} catch (e) {
return Future.error(e);
}