Потоковое видео из хранилища Firebase в флаттер - PullRequest
0 голосов
/ 22 июня 2019

Чтобы воспроизвести видео во Flutter, вы должны создать его URL в методе init (). Итак, как получить список видео Url из Firestore? Если я получаю URL-адрес из Firestore в форме Future, то видеоплеер не принимает его, потому что он принимает только объекты String, а не объекты Future.

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
import 'package:chewie/chewie.dart';


class VideoScreen extends StatefulWidget {
  VideoScreen({this.studentName});
  final String studentName;
  @override
  _VideoScreenState createState() => _VideoScreenState();
}

class _VideoScreenState extends State<VideoScreen> {

  VideoPlayerController videoPlayerController;
  @override
  void initState() {
   videoPlayerController = VideoPlayerController.network('${getU()}');

    super.initState();
  }


  @override
  Widget build(BuildContext context) {
    final chewieController = ChewieController(
      videoPlayerController: videoPlayerController,
      aspectRatio: 3 / 2,
      autoPlay: true,
      looping: true,
    );
    final playerWidget = Chewie(
      controller: chewieController,
    );
    return playerWidget;
  }
  Future<String> getU() async {
    var document = await Firestore.instance.collection('Students')
        .document('Badri');
    var url = document.get().then((documents) {
      print('video url: ${documents['video']}');
      return documents['video'];
    }
    );
    return url;
  }
}

ошибка приходит -

W/ykiddypijourna(28557): Accessing hidden method Landroid/media/AudioTrack;->getLatency()I (light greylist, reflection)
I/ExoPlayerImpl(28557): Init 77e7389 [ExoPlayerLib/2.9.6] [beryllium, POCO F1, Xiaomi, 28]
E/ExoPlayerImplInternal(28557): Source error.
E/ExoPlayerImplInternal(28557): com.google.android.exoplayer2.upstream.HttpDataSource$HttpDataSourceException: Unable to connect to Instance of 'Future<String>'
E/ExoPlayerImplInternal(28557):     at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:281)
E/ExoPlayerImplInternal(28557):     at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:83)
E/ExoPlayerImplInternal(28557):     at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractingLoadable.load(ExtractorMediaPeriod.java:885)
E/ExoPlayerImplInternal(28557):     at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:381)
E/ExoPlayerImplInternal(28557):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
E/ExoPlayerImplInternal(28557):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
E/ExoPlayerImplInternal(28557):     at java.lang.Thread.run(Thread.java:764)
E/ExoPlayerImplInternal(28557): Caused by: java.net.MalformedURLException: no protocol: Instance of 'Future<String>'
E/ExoPlayerImplInternal(28557):     at java.net.URL.<init>(URL.java:601)
E/ExoPlayerImplInternal(28557):     at java.net.URL.<init>(URL.java:498)
E/ExoPlayerImplInternal(28557):     at java.net.URL.<init>(URL.java:447)
E/ExoPlayerImplInternal(28557):     at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.makeConnection(DefaultHttpDataSource.java:426)
E/ExoPlayerImplInternal(28557):     at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:279)
E/ExoPlayerImplInternal(28557):     ... 6 more

1 Ответ

0 голосов
/ 22 июня 2019

То, как вы написали getU, выглядит немного странно для меня. Вы можете попробовать это?

Future<String> getU() async {
  var docRef = Firestore.instance.collection('Students').document('Badri');
  var doc = await docRef.get();
  return doc['video'];
}

Изменения:

  • Нет необходимости await при создании ссылки на документ. Это синхронная операция, поскольку там еще не читаются данные.
  • Я использую await при вызове get(), чтобы развернуть Future.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...