* Add flutter_lints package * Use key in widget constructors lint: use_key_in_widget_constructors * Unnecessary new keyword lint: unnecessary_new * Prefer const with constant constructors * Exclude protobuf files from analyzer * Private field could be final * Annotate overridden members * Use initializing formals when possible * Don't access members with `this` unless avoiding shadowing * Prefer is! operator * Use isEmpty instead of length * Use collection literals when possible * Revert comment changes * Cleaner null testing * Misc fixes * Avoid using `forEach` with a function literal * Prefer `final` over `var` where applicable * Enforce stricter type-checking * Ignore VS Code files * Flutter format * Prefer using lowerCamelCase for constant names * flutter format -l 100 * Disable `avoid_print` for examples * Slight improvements to example Should solve lint error: no_logic_in_create_state
67 lines
2.0 KiB
Dart
67 lines
2.0 KiB
Dart
import 'package:flutter_webrtc/flutter_webrtc.dart';
|
|
|
|
import '../errors.dart';
|
|
import 'options.dart';
|
|
import 'video_track.dart';
|
|
|
|
/// A video track from the local device. Use static methods in this class to create
|
|
/// video tracks.
|
|
class LocalVideoTrack extends VideoTrack {
|
|
RTCRtpSender? get sender => transceiver?.sender;
|
|
|
|
LocalVideoTrack(String name, MediaStreamTrack mediaTrack, MediaStream stream)
|
|
: super(name, mediaTrack, stream);
|
|
|
|
/// Creates a LocalVideoTrack from camera input.
|
|
static Future<LocalVideoTrack> createCameraTrack([LocalVideoTrackOptions? options]) async {
|
|
options ??= LocalVideoTrackOptions(params: VideoPresets.qhd);
|
|
|
|
try {
|
|
final stream = await _createCameraStream(options);
|
|
return LocalVideoTrack('camera', stream.getVideoTracks().first, stream);
|
|
} catch (e) {
|
|
return Future.error(e);
|
|
}
|
|
}
|
|
|
|
/// Restarts the track with new options. This is useful when switching between
|
|
/// front and back cameras.
|
|
Future<void> restartTrack([LocalVideoTrackOptions? options]) async {
|
|
if (sender == null) {
|
|
return Future.error(TrackCreateError('could not restart track'));
|
|
}
|
|
|
|
options ??= LocalVideoTrackOptions(params: VideoPresets.qhd);
|
|
|
|
try {
|
|
final stream = await _createCameraStream(options);
|
|
final 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 {
|
|
options ??= LocalVideoTrackOptions(params: VideoPresets.qhd);
|
|
|
|
try {
|
|
final stream = await navigator.mediaDevices.getUserMedia(<String, dynamic>{
|
|
'audio': false,
|
|
'video': options.mediaConstraints,
|
|
});
|
|
|
|
if (stream.getVideoTracks().isEmpty) {
|
|
return Future.error(TrackCreateError());
|
|
}
|
|
|
|
return stream;
|
|
} catch (e) {
|
|
return Future.error(e);
|
|
}
|
|
}
|
|
}
|