Flutter better_player: Как воспроизводить видео из папки локальных ресурсов

#flutter #video #flutter-video-player

Вопрос:

Q) Кто-нибудь знает, как ссылаться на файл локально как для iOS, так и для Android с помощью better_player?

Я не могу найти способ сделать это с их документами, я знаю, что это можно сделать с помощью встроенного плагина видеоплеера Flutter, но вместо этого я хочу использовать better_player.

Это работает со стандартным видео плагином:

 _videoController = VideoPlayerController.asset('assets/intro.mp4');
 

например, загрузите видео в корневой каталог проекта по адресу /assets/intro.mp4

Я пробовал это с better_player, но он не находит файл:

     BetterPlayerDataSource betterPlayerDataSource = BetterPlayerDataSource(
        BetterPlayerDataSourceType.file, "assets/sample.mp4");
 

Комментарии:

1. github.com/jhomlala/betterplayer/issues/463

2. @TirthPatel Спасибо, я не знал об этом, глядя на github github.com/jhomlala/betterplayer/blob/master/example/lib/pages/… — Теперь я вижу, как это сделать.

Ответ №1:

мой пример:

Видеозапись.дротик

 import 'package:better_player/better_player.dart';
import 'package:better_player_example/utils.dart';
import 'package:flutter/material.dart';

return Scaffold(
          appBar: AppBar(
            title: Text("better player example"),
          ),
          body: Column(
            children: [
              FutureBuilder<String>(
                future: Utils.getFileUrl("testvideo.mp4"),
                builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
                  if (snapshot.data != null) {
                    return BetterPlayer.file(snapshot.data!);
                  } else {
                    return const SizedBox();
                  }
                },
              )
            ],
          ),
        );
 

утилис.дротик

 import 'package:path_provider/path_provider.dart';

class Utils {
  static Future<String> getFileUrl(String fileName) async {
    final directory = await getApplicationDocumentsDirectory();
    return "${directory.path}/$fileName";
  }
}
 

Комментарии:

1. Это в принципе правильно, за исключением того, что в нем опущена первая часть, которая заключается в том, чтобы сначала скопировать файл в каталог Applicationdocument, как в примере приложения на github. Спасибо

Ответ №2:

Поэтому сначала мне пришлось скопировать файл в ApplicationDocuments каталог

   void _copyAssetToLocal() async {
    try {
      var content = await rootBundle.load("assets/intro.mp4");
      final directory = await getApplicationDocumentsDirectory();
      var file = File("${directory.path}/intro.mp4");
      file.writeAsBytesSync(content.buffer.asUint8List());
      _loadIntroVideo(file.path);
    } catch (e) {
      print("crap");
    }
  }
 

Тогда я мог бы загрузить его из fullPath только что созданного нового.

   void _loadIntroVideo(String fullPath) {
    var config = BetterPlayerConfiguration(
      fit: BoxFit.cover,
      autoPlay: true,
      fullScreenByDefault: false,
      // ...
    );

    BetterPlayerDataSource betterPlayerDataSource =
          BetterPlayerDataSource(BetterPlayerDataSourceType.file, fullPath);

    // etc
  }