-
Notifications
You must be signed in to change notification settings - Fork 42
/
Copy pathmedia_recorder_impl.dart
77 lines (70 loc) · 2.21 KB
/
media_recorder_impl.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import 'dart:async';
import 'dart:js_interop';
import 'dart:js_interop_unsafe';
import 'package:web/web.dart' as web;
import 'package:webrtc_interface/webrtc_interface.dart';
import 'media_stream_impl.dart';
class MediaRecorderWeb extends MediaRecorder {
late web.MediaRecorder _recorder;
late Completer<String> _completer;
@override
Future<void> start(
String path, {
MediaStreamTrack? videoTrack,
RecorderAudioChannel? audioChannel,
MediaStreamTrack? audioTrack,
int rotationDegrees = 0,
}) {
throw 'Use startWeb on Flutter Web!';
}
@override
void startWeb(
MediaStream stream, {
Function(dynamic blob, bool isLastOne)? onDataChunk,
String mimeType = 'video/webm',
int timeSlice = 1000,
}) {
var _native = stream as MediaStreamWeb;
_recorder = web.MediaRecorder(
_native.jsStream, web.MediaRecorderOptions(mimeType: mimeType));
if (onDataChunk == null) {
var _chunks = <web.Blob>[];
_completer = Completer<String>();
final void Function(web.Event event) callback = (web.Event event) {
final blob = event.getProperty('data'.toJS) as web.Blob;
if (blob.size > 0) {
_chunks.add(blob);
}
if (_recorder.state == 'inactive') {
final blob =
web.Blob(_chunks.toJS, web.BlobPropertyBag(type: mimeType));
_completer.complete(web.URL.createObjectURL(blob));
}
};
final void Function(JSAny) onError = (JSAny error) {
_completer.completeError(error);
};
_recorder.addEventListener('dataavailable', callback.toJS);
_recorder.addEventListener('error', onError.toJS);
} else {
final void Function(web.Event event) callback = (web.Event event) {
onDataChunk(
event.getProperty('data'.toJS),
_recorder.state == 'inactive',
);
};
_recorder.addEventListener('dataavailable', callback.toJS);
}
_recorder.start(timeSlice);
}
@override
Future<dynamic> stop({String? albumName}) {
_recorder.stop();
return _completer.future;
}
@override
Future<void> changeVideoTrack(MediaStreamTrack videoTrack) {
// TODO: implement changeVideoTrack
throw UnimplementedError();
}
}