#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
}