@@ -16,14 +16,28 @@ import 'package:video_player/video_player.dart';
16
16
17
17
const Duration _playDuration = Duration (seconds: 1 );
18
18
19
+ // Use WebM for web to allow CI to use Chromium.
20
+ final String _videoAssetKey =
21
+ kIsWeb ? 'assets/Butterfly-209.webm' : 'assets/Butterfly-209.mp4' ;
22
+
23
+ // Returns the URL to load an asset from this example app as a network source.
24
+ String getUrlForAssetAsNetworkSource (String assetKey) {
25
+ return 'https://github.com/flutter/plugins/blob/'
26
+ // This hash can be rolled forward to pick up newly-added assets.
27
+ 'cba393233e559c925a4daf71b06b4bb01c606762'
28
+ '/packages/video_player/video_player/example/'
29
+ '$assetKey '
30
+ '?raw=true' ;
31
+ }
32
+
19
33
void main () {
20
34
IntegrationTestWidgetsFlutterBinding .ensureInitialized ();
21
35
late VideoPlayerController _controller;
22
36
tearDown (() async => _controller.dispose ());
23
37
24
38
group ('asset videos' , () {
25
39
setUp (() {
26
- _controller = VideoPlayerController .asset ('assets/Butterfly-209.mp4' );
40
+ _controller = VideoPlayerController .asset (_videoAssetKey );
27
41
});
28
42
29
43
testWidgets ('can be initialized' , (WidgetTester tester) async {
@@ -32,48 +46,11 @@ void main() {
32
46
expect (_controller.value.isInitialized, true );
33
47
expect (_controller.value.position, const Duration (seconds: 0 ));
34
48
expect (_controller.value.isPlaying, false );
49
+ // The WebM version has a slightly different duration than the MP4.
35
50
expect (_controller.value.duration,
36
- const Duration (seconds: 7 , milliseconds: 540 ));
51
+ Duration (seconds: 7 , milliseconds: kIsWeb ? 544 : 540 ));
37
52
});
38
53
39
- testWidgets (
40
- 'reports buffering status' ,
41
- (WidgetTester tester) async {
42
- VideoPlayerController networkController = VideoPlayerController .network (
43
- 'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4' ,
44
- );
45
- await networkController.initialize ();
46
- // Mute to allow playing without DOM interaction on Web.
47
- // See https://developers.google.com/web/updates/2017/09/autoplay-policy-changes
48
- await networkController.setVolume (0 );
49
- final Completer <void > started = Completer ();
50
- final Completer <void > ended = Completer ();
51
- networkController.addListener (() {
52
- if (! started.isCompleted && networkController.value.isBuffering) {
53
- started.complete ();
54
- }
55
- if (started.isCompleted &&
56
- ! networkController.value.isBuffering &&
57
- ! ended.isCompleted) {
58
- ended.complete ();
59
- }
60
- });
61
-
62
- await networkController.play ();
63
- await networkController.seekTo (const Duration (seconds: 5 ));
64
- await tester.pumpAndSettle (_playDuration);
65
- await networkController.pause ();
66
-
67
- expect (networkController.value.isPlaying, false );
68
- expect (networkController.value.position,
69
- (Duration position) => position > const Duration (seconds: 0 ));
70
-
71
- await expectLater (started.future, completes);
72
- await expectLater (ended.future, completes);
73
- },
74
- skip: ! (kIsWeb || defaultTargetPlatform == TargetPlatform .android),
75
- );
76
-
77
54
testWidgets (
78
55
'live stream duration != 0' ,
79
56
(WidgetTester tester) async {
@@ -221,23 +198,78 @@ void main() {
221
198
skip: kIsWeb || // Web does not support local assets.
222
199
// Extremely flaky on iOS: https://github.com/flutter/flutter/issues/86915
223
200
defaultTargetPlatform == TargetPlatform .iOS);
201
+ });
224
202
225
- testWidgets ('test video player using static file() method as constructor' ,
226
- (WidgetTester tester) async {
203
+ group ('file-based videos' , () {
204
+ setUp (() async {
205
+ // Load the data from the asset.
227
206
String tempDir = (await getTemporaryDirectory ()).path;
228
- ByteData bytes = await rootBundle.load ('assets/Butterfly-209.mp4' );
207
+ ByteData bytes = await rootBundle.load (_videoAssetKey );
229
208
230
- File file = File ('$tempDir /Butterfly-209.mp4' );
209
+ // Write it to a file to use as a source.
210
+ final String filename = _videoAssetKey.split ('/' ).last;
211
+ File file = File ('$tempDir /$filename ' );
231
212
await file.writeAsBytes (bytes.buffer.asInt8List ());
232
213
233
- VideoPlayerController fileController = VideoPlayerController .file (file);
234
- await fileController. initialize ( );
214
+ _controller = VideoPlayerController .file (file);
215
+ } );
235
216
236
- await fileController.play ();
237
- expect (fileController.value.isPlaying, true );
217
+ testWidgets ('test video player using static file() method as constructor' ,
218
+ (WidgetTester tester) async {
219
+ await _controller.initialize ();
238
220
239
- await fileController.pause ();
240
- expect (fileController.value.isPlaying, false );
221
+ await _controller.play ();
222
+ expect (_controller.value.isPlaying, true );
223
+
224
+ await _controller.pause ();
225
+ expect (_controller.value.isPlaying, false );
241
226
}, skip: kIsWeb);
242
227
});
228
+
229
+ group ('network videos' , () {
230
+ setUp (() {
231
+ // TODO(stuartmorgan): Remove this conditional and update the hash in
232
+ // getUrlForAssetAsNetworkSource as a follow-up, once the webm asset is
233
+ // checked in.
234
+ final String videoUrl = kIsWeb
235
+ ? 'https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.webm'
236
+ : getUrlForAssetAsNetworkSource (_videoAssetKey);
237
+ _controller = VideoPlayerController .network (videoUrl);
238
+ });
239
+
240
+ testWidgets (
241
+ 'reports buffering status' ,
242
+ (WidgetTester tester) async {
243
+ await _controller.initialize ();
244
+ // Mute to allow playing without DOM interaction on Web.
245
+ // See https://developers.google.com/web/updates/2017/09/autoplay-policy-changes
246
+ await _controller.setVolume (0 );
247
+ final Completer <void > started = Completer ();
248
+ final Completer <void > ended = Completer ();
249
+ _controller.addListener (() {
250
+ if (! started.isCompleted && _controller.value.isBuffering) {
251
+ started.complete ();
252
+ }
253
+ if (started.isCompleted &&
254
+ ! _controller.value.isBuffering &&
255
+ ! ended.isCompleted) {
256
+ ended.complete ();
257
+ }
258
+ });
259
+
260
+ await _controller.play ();
261
+ await _controller.seekTo (const Duration (seconds: 5 ));
262
+ await tester.pumpAndSettle (_playDuration);
263
+ await _controller.pause ();
264
+
265
+ expect (_controller.value.isPlaying, false );
266
+ expect (_controller.value.position,
267
+ (Duration position) => position > const Duration (seconds: 0 ));
268
+
269
+ await expectLater (started.future, completes);
270
+ await expectLater (ended.future, completes);
271
+ },
272
+ skip: ! (kIsWeb || defaultTargetPlatform == TargetPlatform .android),
273
+ );
274
+ });
243
275
}
0 commit comments