video rendering, local track creation
This commit is contained in:
@@ -1,8 +1,30 @@
|
||||
import 'package:flutter_webrtc/flutter_webrtc.dart';
|
||||
|
||||
import '../errors.dart';
|
||||
import '../proto/livekit_models.pb.dart';
|
||||
import 'options.dart';
|
||||
import 'track.dart';
|
||||
|
||||
class LocalAudioTrack extends Track {
|
||||
LocalAudioTrack(String name, MediaStreamTrack track) : super(TrackType.AUDIO, name, track);
|
||||
MediaStream mediaStream;
|
||||
|
||||
LocalAudioTrack(String name, MediaStreamTrack track, this.mediaStream)
|
||||
: super(TrackType.AUDIO, name, track);
|
||||
|
||||
Future<LocalAudioTrack> createTrack(LocalAudioTrackOptions? options) async {
|
||||
try {
|
||||
var stream = await navigator.mediaDevices.getUserMedia({
|
||||
"audio": true,
|
||||
"video": false,
|
||||
});
|
||||
|
||||
if (stream.getAudioTracks().length == 0) {
|
||||
return Future.error(TrackCreateError());
|
||||
}
|
||||
|
||||
return LocalAudioTrack("", stream.getVideoTracks().first, stream);
|
||||
} catch (e) {
|
||||
return Future.error(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,32 @@
|
||||
import 'package:flutter_webrtc/flutter_webrtc.dart';
|
||||
|
||||
import '../errors.dart';
|
||||
import 'options.dart';
|
||||
import 'video_track.dart';
|
||||
|
||||
class LocalVideoTrack extends VideoTrack {
|
||||
LocalVideoTrack(String name, MediaStreamTrack mediaTrack)
|
||||
: super(name, mediaTrack);
|
||||
LocalVideoTrack(String name, MediaStreamTrack mediaTrack, MediaStream stream)
|
||||
: super(name, mediaTrack, stream);
|
||||
|
||||
Future<LocalVideoTrack> createCameraTrack(
|
||||
LocalVideoTrackOptions? options) async {
|
||||
if (options == null) {
|
||||
options = LocalVideoTrackOptions(params: VideoPresets.qhd);
|
||||
}
|
||||
|
||||
try {
|
||||
var stream = await navigator.mediaDevices.getUserMedia({
|
||||
"audio": false,
|
||||
"video": options.mediaConstraints,
|
||||
});
|
||||
|
||||
if (stream.getVideoTracks().length == 0) {
|
||||
return Future.error(TrackCreateError());
|
||||
}
|
||||
|
||||
return LocalVideoTrack("", stream.getVideoTracks().first, stream);
|
||||
} catch (e) {
|
||||
return Future.error(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
class LocalVideoTrackOptions {
|
||||
CameraPosition position = CameraPosition.FRONT;
|
||||
VideoParameter params;
|
||||
|
||||
LocalVideoTrackOptions({
|
||||
required VideoParameter params,
|
||||
CameraPosition? position,
|
||||
}) : this.params = params {
|
||||
if (position != null) {
|
||||
this.position = position;
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, dynamic> get mediaConstraints {
|
||||
return {
|
||||
"mandatory": params.mediaConstraints,
|
||||
"facingMode": position == CameraPosition.FRONT ? "user" : "environment",
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
enum CameraPosition {
|
||||
FRONT,
|
||||
BACK,
|
||||
}
|
||||
|
||||
class VideoParameter {
|
||||
int width;
|
||||
int height;
|
||||
int fps;
|
||||
int? bitrate;
|
||||
|
||||
VideoParameter(
|
||||
this.width,
|
||||
this.height,
|
||||
this.fps, {
|
||||
int? bitrate,
|
||||
}) : this.bitrate = bitrate;
|
||||
|
||||
Map<String, dynamic> get mediaConstraints {
|
||||
return {
|
||||
"minWidth": this.width,
|
||||
"minHeight": this.height,
|
||||
"minFrameRate": this.fps,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
class VideoPresets {
|
||||
static final qvga = VideoParameter(320, 180, 15);
|
||||
static final vga = VideoParameter(640, 360, 30);
|
||||
static final qhd = VideoParameter(960, 540, 30);
|
||||
static final hd = VideoParameter(1280, 720, 30);
|
||||
static final fhd = VideoParameter(1920, 1080, 30);
|
||||
|
||||
static final List<VideoParameter> all = [
|
||||
qvga,
|
||||
vga,
|
||||
qhd,
|
||||
hd,
|
||||
fhd,
|
||||
];
|
||||
}
|
||||
|
||||
class LocalAudioTrackOptions {}
|
||||
@@ -11,6 +11,8 @@ class TrackDimension {
|
||||
}
|
||||
|
||||
class Track {
|
||||
static const ScreenShareName = "screen";
|
||||
|
||||
String name;
|
||||
TrackType kind;
|
||||
MediaStreamTrack mediaTrack;
|
||||
|
||||
@@ -19,6 +19,9 @@ class TrackPublication {
|
||||
updateFromInfo(info);
|
||||
}
|
||||
|
||||
bool get isScreenShare =>
|
||||
kind == TrackType.VIDEO && name == Track.ScreenShareName;
|
||||
|
||||
updateFromInfo(TrackInfo info) {
|
||||
muted = info.muted;
|
||||
simulcasted = info.simulcast;
|
||||
|
||||
@@ -4,14 +4,8 @@ import '../proto/livekit_models.pb.dart';
|
||||
import 'track.dart';
|
||||
|
||||
class VideoTrack extends Track {
|
||||
VideoTrack(String name, MediaStreamTrack mediaTrack)
|
||||
MediaStream mediaStream;
|
||||
|
||||
VideoTrack(String name, MediaStreamTrack mediaTrack, this.mediaStream)
|
||||
: super(TrackType.VIDEO, name, mediaTrack);
|
||||
|
||||
// TODO: keep list of video renderers
|
||||
|
||||
@override
|
||||
stop() {
|
||||
super.stop();
|
||||
// TODO: remove renderer
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user