GithubHelp home page GithubHelp logo

chudongvip / awesome_video_player Goto Github PK

View Code? Open in Web Editor NEW
194.0 194.0 36.0 5.76 MB

This is a flutter package of video player. it's a very simple and easy to use.

License: MIT License

Kotlin 3.43% Objective-C 1.07% Swift 1.32% Ruby 6.09% Dart 88.10%
dart video-player

awesome_video_player's Introduction

Hi there 👋

This is ChuDong, There are some my favorite products, is about how to process video or image, another is a flutter player.

look here:

  • process_image_demo

    This product is a tutorial about how to get image pixel color and process image. such as add a Mosaic to the image、make image color binarization.

  • face-detect-demo

    detect video or image face and add some interesting text and pictrue overlay the origin video or image. like replace the animal's face.

  • awesome_video_player

    This is a flutter player, developer can customize UI, such as replace play or pause button icon、control-bar buttons which you wan to display.

If you like? give me a 👍 Thumbs Up. Good lucks for you!

awesome_video_player's People

Contributors

dyncmark avatar jeromexiong avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

awesome_video_player's Issues

[Bug Report]全屏报错

系统:安卓8.0.0
插件版本:1.0.8

E/flutter ( 4166): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: MissingPluginException(No implementation found for method SystemChrome.forceOrientation on channel sososdk.github.com/orientation)

E/flutter ( 4166): #0      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:319:7)

E/flutter ( 4166):  < asynchronous suspension >

E/flutter ( 4166): #1      OrientationPlugin.forceOrientation (package:orientation/orientation.dart:35:26)

E/flutter ( 4166): #2      _AwsomeVideoPlayerState.toggleFullScreen (package:awsome_video_player/src/video.dart:342:25)

E/flutter ( 4166): #3      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)

next branch issue

hey bro i m using ontimeupdate same as master branch in your next branch and this give me error
type '(VideoPlayerValue) => Null' is not a subtype of type '(dynamic) => void'
Another exception was thrown: type '(VideoPlayerValue) => Null' is not a subtype of type '(dynamic) => void'
and my code is
ontimeupdate: (value) {
print("timeupdate $value");
var position = value.position.inMilliseconds / 1000;
print(position);
},

视频可以在浏览器上播放,但是在flutter app 上不可以

视频可以在浏览器上播放,但是在flutter app 上不可以
报错如下
flutter: 日志拦截: http://192.168.100.8:8081/file?p=/video/2020/05/IMG_3761.mp4
[VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: 'package:flutter/src/foundation/stack_frame.dart': Failed assertion: line 113 pos 12: 'match != null': Expected to match RegExp: pattern=^(.+) (\d+):(\d+)\s+(.+)$ flags=.
#0 _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:42:39)
#1 _AssertionError._throwNew (dart:core-patch/errors_patch.dart:38:5)
#2 StackFrame._parseWebDebugFrame (package:flutter/src/foundation/stack_frame.dart:113:12)
#3 StackFrame._parseWebFrame (package:flutter/src/foundation/stack_frame.dart:99:14)
#4 StackFrame.fromStackTraceLine (package:flutter/src/foundation/stack_frame.dart:193:14)
#5 MappedListIterable.elementAt (dart:_internal/iterable.dart:417:31)
#6 ListIterator.moveNext (dart:_internal/iterable.dart:346:26)
#7 SkipWhileIterator.moveNext (dart:_internal/iterable.dart:669:24)
#8 new List.from (dart:core-patch/array_patch.dart:47:19)
#9 Iterable.toList (dart:core/iterable.dart:400:12)
#10 StackFrame.fromStackString (package:flutter/src/foundation/stack_frame.dart:94:10)
#11 FlutterError.defaultStackFilter (package:flutter/src/foundation/assertions.dart:820:54)
#12 new DiagnosticsStackTrace (package:flutter/src/foundation/assertions.dart:958:59)
#13 FlutterErrorDetails.debugFillProperties (package:flutter/src/foundation/assertions.dart:575:22)
#14 DiagnosticableNode.builder. (package:flutter/src/foundation/diagnostics.dart:2926:18)
#15 DiagnosticableNode.builder (package:flutter/src/foundation/diagnostics.dart:2929:8)
#16 _FlutterErrorDetailsNode.builder (package:flutter/src/foundation/assertions.dart:996:55)
#17 DiagnosticableNode.getProperties (package:flutter/src/foundation/diagnostics.dart:2943:105)
#18 TextTreeRenderer._debugRender (package:flutter/src/foundation/diagnostics.dart:1238:63)
#19 TextTreeRenderer.render (package:flutter/src/foundation/diagnostics.dart:1116:14)
#20 DiagnosticsNode.toStringDeep. (package:flutter/src/foundation/diagnostics.dart:1730:9)
#21 DiagnosticsNode.toStringDeep (package:flutter/src/foundation/diagnostics.dart:1737:6)
#22 FlutterErrorDetails.toString (package:flutter/src/foundation/assertions.dart:590:65)
#23 _StringBase._interpolateSingle (dart:core-patch/string_patch.dart:823:17)
#24 print (dart:core/print.dart:11:26)
#25 AppInit.reportErrorAndLog (package:iCloud/init/app_init.dart:44:5)
#26 AppInit.catchException. (package:iCloud/init/app_init.dart:32:9)
#27 _rootRunBinary (dart:async/zone.dart:1208:13)
#28 _CustomZone.runBinary (dart:async/zone.dart:1093:19)
#29 runZonedGuarded. (dart:async/zone.dart:1591:19)
#30 _CustomZone.handleUncaughtError (dart:async/zone.dart:1059:19)
#31 Future._propagateToListeners (dart:async/future_impl.dart:598:16)
#32 Future._completeError (dart:async/future_impl.dart:534:5)
#33 Future._asyncCompleteError. (dart:async/future_impl.dart:582:7)
#34 _rootRun (dart:async/zone.dart:1184:13)
#35 _CustomZone.run (dart:async/zone.dart:1077:19)
#36 _CustomZone.runGuarded (dart:async/zone.dart:979:7)
#37 _CustomZone.bindCallbackGuarded. (dart:async/zone.dart:1019:23)
#38 _microtaskLoop (dart:async/schedule_microtask.dart:43:21)
#39 _startMicrotaskLoop (dart:async/schedule_microtask.dart:52:5)

代码如下:

import 'package:flutter/material.dart';
import 'package:awsome_video_player/awsome_video_player.dart';
import 'package:iCloud/page/fintness_app_theme.dart';

class VideoPlayPage extends StatefulWidget {
const VideoPlayPage(
{Key key, this.url,this.name,this.index})
: super(key: key);
final String url;
final String name;
final int index;

@OverRide
_VideoPlayPageState createState() => new _VideoPlayPageState(this.url,this.name,this.index);
}

class _VideoPlayPageState extends State {
_VideoPlayPageState(this.url,this.name,this.index);

final String url;
final String name;
final int index;

String mainSubtitles = ""; //主字幕
String subSubtitles = ""; //辅字幕
bool _isPlaying = false;
bool _isFullscreen = false;

bool showAdvertCover = false; //是否显示广告

bool get isPlaying => _isPlaying;
set isPlaying(bool playing) {
print("playing $playing");
_isPlaying = playing;
}

@OverRide
void initState() {
super.initState();
}

@OverRide
Widget build(BuildContext context) {
print(url);
return MaterialApp(
home: Container(
color: FintnessAppTheme.background,
child: Scaffold(
backgroundColor: Colors.transparent,
appBar: !_isFullscreen
? AppBar(
leading: IconButton(icon: new Icon(Icons.chevron_left)),
backgroundColor: FintnessAppTheme.background,
automaticallyImplyLeading: true,
title: Text(name,style: TextStyle(
color: Colors.black38
),),

          ): null,
          body: Column(children: <Widget>[
            url != ""
                ? AwsomeVideoPlayer(
              "http://192.168.100.8:8081/file?p=/video/2020/05/IMG_3761.mp4",
              /// 视频播放配置
              playOptions: VideoPlayOptions(
                  seekSeconds: 30,
                  //左侧垂直手势调节视频亮度的单位(0~1之间,不能小于0,不能大于1)
                  brightnessGestureUnit: 0.05,
                  //右侧垂直手势调节视频音量的单位(0~1之间,不能小于0,不能大于1)
                  volumeGestureUnit: 0.05,
                  //横行手势调节视频进度的单位秒数
                  progressGestureUnit: 2000,
                  aspectRatio: 16 / 9,
                  loop: false,
                  autoplay: true,
                  allowScrubbing: true,
                  startPosition: Duration(seconds: 0)),

              /// 自定义视频样式
              videoStyle: VideoStyle(
                /// 自定义视频暂停时视频中部的播放按钮
                playIcon: Icon(
                  Icons.play_circle_outline,
                  size: 80,
                  color: Colors.white,
                ),

                /// 暂停时是否显示视频中部播放按钮
                showPlayIcon: true,

                videoLoadingStyle: VideoLoadingStyle(
                  /// 重写部分(二选一)
                  // 重写Loading的widget
                  // customLoadingIcon: CircularProgressIndicator(strokeWidth: 2.0),
                  // 重写Loading 下方的Text widget
                  // customLoadingText: Text("加载中..."),
                  /// 设置部分(二选一)
                  // 设置Loading icon 下方的文字
                  loadingText: "Loading...",
                  // 设置loading icon 下方的文字颜色
                  loadingTextFontColor: Colors.white,
                  // 设置loading icon 下方的文字大小
                  loadingTextFontSize: 20,
                ),

                /// 自定义顶部控制栏
                videoTopBarStyle: VideoTopBarStyle(
                  show: true, //是否显示
                  height: 40,
                  padding:
                  EdgeInsets.symmetric(vertical: 8, horizontal: 10),
                  barBackgroundColor: Color.fromRGBO(0, 0, 0, 0.5),
                  popIcon: Icon(
                    Icons.arrow_back,
                    size: 16,
                    color: Colors.white,
                  ),

// contents: [
// Center(
// child: Container(
// margin: EdgeInsets.symmetric(horizontal: 10),
// child: Text(
// '返回',
// style: TextStyle(
// color: Colors.white, fontSize: 14),
// ),
// ),
// )
// ], //自定义顶部控制栏中间显示区域
// actions: [
// GestureDetector(
// onTap: () {
// ///1. 可配合自定义拓展元素使用,例如广告
// setState(() {
// showAdvertCover = true;
// });
//
// ///
// },
// child: Icon(
// Icons.more_horiz,
// size: 16,
// color: Colors.white,
// ),
// )
// ], //自定义顶部控制栏右侧显示区域
/// 设置cusotmBar之后,以上属性均无效(除了show之外)
// customBar: Positioned(
// top: 0,
// left: 0,
// right: 0,
// child: Container(
// width: double.infinity,
// height: 50,
// color: Colors.yellow,
// child: Text("12312312"),
// ),
// ),
// customBar: Align(
// alignment: Alignment.topLeft,
// child: Container(
// width: double.infinity,
// height: 30,
// color: Colors.yellow,
// child: GestureDetector(
// onTap: () {
// print("yes");
// },
// child: Text("123123132")
// )
// ),
// ),
),

                /// 自定义底部控制栏
                videoControlBarStyle: VideoControlBarStyle(
                  /// 自定义颜色
                  // barBackgroundColor: Colors.blue,

                  ///添加边距
                  padding:
                  EdgeInsets.symmetric(vertical: 8, horizontal: 10),

                  ///设置控制拦的高度,默认为30,如果图标设置过大但是高度不够就会出现图标被裁剪的现象
                  height: 30,

                  /// 自定义进度条样式
                  // progressStyle: VideoProgressStyle(
                  //     // padding: EdgeInsets.all(0),
                  //     padding: EdgeInsets.symmetric(
                  //         vertical: 0,
                  //         horizontal: 10), //vertical不能设置太大,不然被把进度条压缩肉眼无法识别
                  //     playedColor: Colors.red,
                  //     bufferedColor: Colors.yellow,
                  //     backgroundColor: Colors.green,
                  //     dragBarColor: Colors
                  //         .white, //进度条为`progress`时有效,如果时`basic-progress`则无效
                  //     height: 4,
                  //     progressRadius:
                  //         2, //进度条为`progress`时有效,如果时`basic-progress`则无效
                  //     dragHeight:
                  //         5 //进度条为`progress`时有效,如果时`basic-progress`则无效
                  //     ),

                  /// 更改进度栏的播放按钮
                  playIcon: Icon(Icons.play_arrow,
                      color: Colors.white, size: 16),

                  /// 更改进度栏的暂停按钮
                  pauseIcon: Icon(
                    Icons.pause,
                    color: Colors.white,
                    size: 16,
                  ),

                  /// 更改进度栏的快退按钮
                  rewindIcon: Icon(
                    Icons.replay_30,
                    size: 16,
                    color: Colors.white,
                  ),

                  /// 更改进度栏的快进按钮
                  forwardIcon: Icon(
                    Icons.forward_30,
                    size: 16,
                    color: Colors.white,
                  ),

                  /// 更改进度栏的全屏按钮
                  fullscreenIcon: Icon(
                    Icons.fullscreen,
                    size: 20,
                    color: Colors.white,
                  ),

                  /// 更改进度栏的退出全屏按钮
                  fullscreenExitIcon: Icon(
                    Icons.fullscreen_exit,
                    size: 20,
                    color: Colors.red,
                  ),

                  /// 决定控制栏的元素以及排序,示例见上方图3
                  itemList: [
                    "rewind",
                    "play",
                    "forward",
                    "position-time", //当前播放时间
                    "progress", //线条形进度条(与‘basic-progress’二选一)
                    // "basic-progress",//矩形进度条(与‘progress’二选一)
                    "duration-time", //视频总时长
                    // "time",//格式:当前时间/视频总时长
                    "fullscreen"
                  ],
                ),

                /// 自定义字幕
                videoSubtitlesStyle: VideoSubtitles(
                  mianTitle: Align(
                    alignment: Alignment.bottomCenter,
                    child: Container(
                      padding: EdgeInsets.fromLTRB(10, 0, 10, 30),
                      child: Text(mainSubtitles,
                          maxLines: 2,
                          textAlign: TextAlign.center,
                          style: TextStyle(
                              color: Colors.white, fontSize: 14)),
                    ),
                  ),
                  subTitle: Align(
                    alignment: Alignment.bottomCenter,
                    child: Container(
                      padding: EdgeInsets.all(10),
                      child: Text(subSubtitles,
                          maxLines: 2,
                          textAlign: TextAlign.center,
                          style: TextStyle(
                              color: Colors.white, fontSize: 14)),
                    ),
                  ),
                ),
              ),

              /// 自定义拓展元素
              children: [
                /// DEMO1 自定义视频播放状态Toast
                /// 待完善

                /// DEMO2 这个将会覆盖的视频内容,因为这个层级是最高级,因此手势会失效(慎用)
                /// 这个可以用来做视频广告
                showAdvertCover
                    ? Align(
                  alignment: Alignment.center,
                  child: Container(
                    width: 200,
                    height: 100,
                    color: Colors.blue[500],
                    child: Stack(
                      fit: StackFit.expand,
                      children: <Widget>[
                        //关闭广告
                        Align(
                          alignment: Alignment.topRight,
                          child: GestureDetector(
                            onTap: () {
                              setState(() {
                                showAdvertCover = false;
                              });
                            },
                            child: Icon(
                              Icons.cancel,
                              size: 16,
                              color: Colors.white,
                            ),
                          ),
                        ),
                        Container(
                          alignment: Alignment.center,
                          child: Text(
                            "一个广告封面",
                            style: TextStyle(color: Colors.white),
                          ),
                        )
                      ],
                    ),
                  ),
                )
                    : Align(),
              ],

              /// 视频暂停回调
              onpause: (value) {
                print("video paused");
                setState(() {
                  isPlaying = false;
                });
              },

              /// 视频播放回调
              onplay: (value) {
                print("video played");
                setState(() {
                  isPlaying = true;
                });
              },

              /// 视频播放结束回调
              onended: (value) {
                print("video ended");
              },

              /// 视频播放进度回调
              /// 可以用来匹配字幕
              ontimeupdate: (value) {
                // print("timeupdate ${value}");
                // var position = value.position.inMilliseconds / 1000;
                //根据 position 来判断当前显示的字幕
              },

              onprogressdrag: (position, duration) {
                print("进度条拖拽的时间节点: ${position}");
                print("进度条总时长: ${duration}");
              },

              onvolume: (value) {
                print("onvolume ${value}");
              },

              onbrightness: (value) {
                print("onbrightness ${value}");
              },

              onfullscreen: (fullscreen) {
                print("is fullscreen $fullscreen");
                setState(() {
                  _isFullscreen = fullscreen;
                });
              },

              /// 顶部控制栏点击返回按钮
              onpop: (value) {
                print("返回上一页");
                Navigator.of(context).pop(0);
              },
            )
                : AspectRatio(
              aspectRatio: 16 / 9,
              child: Center(
                child: CircularProgressIndicator(strokeWidth: 2.0),
              ),
            ),
          ])),
    ));

}
}

无法构建插件。。最新版

使用的是vscode

FAILURE: Build failed with an exception.

  • What went wrong:
    Execution failed for task ':awsome_video_player:packageDebugAssets'.

Failed to create directory 'H:\helloworld\build\awsome_video_player\intermediates\incremental\packageDebugAssets'

  • Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

  • Get more help at https://help.gradle.org

BUILD FAILED in 7s

播放结束会出现bug

在视频播放结束后,暂停的icon不会出现,当点击屏幕之后会显示出来。这个时候如果点击进度条则视频会继续播放,但暂停的按钮依然存在。

Cannot use the package!

Hi,

I have successfully add this package to my project, however when I try to run the install command the following error was occurred:

FAILURE: Build failed with an exception.

  • What went wrong:
    A problem occurred configuring project ':screen'.

Could not resolve all artifacts for configuration ':screen:classpath'.
Could not find gradle.jar (com.android.tools.build:gradle:3.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.3.1/gradle-3.3.1.jar
Could not find builder.jar (com.android.tools.build:builder:3.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/build/builder/3.3.1/builder-3.3.1.jar
Could not find tracker.jar (com.android.tools.analytics-library:tracker:26.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library/tracker/26.3.1/tracker-26.3.1.jar
Could not find shared.jar (com.android.tools.analytics-library:shared:26.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library/shared/26.3.1/shared-26.3.1.jar
Could not find crash.jar (com.android.tools.analytics-library:crash:26.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library/crash/26.3.1/crash-26.3.1.jar
Could not find lint-gradle-api.jar (com.android.tools.lint:lint-gradle-api:26.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/lint/lint-gradle-api/26.3.1/lint-gradle-api-26.3.1.jar
Could not find gradle-api.jar (com.android.tools.build:gradle-api:3.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-api/3.3.1/gradle-api-3.3.1.jar
Could not find databinding-compiler-common.jar (androidx.databinding:databinding-compiler-common:3.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/androidx/databinding/databinding-compiler-common/3.3.1/databinding-compiler-common-3.3.1.jar
Could not find manifest-merger.jar (com.android.tools.build:manifest-merger:26.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/build/manifest-merger/26.3.1/manifest-merger-26.3.1.jar
Could not find sdk-common.jar (com.android.tools:sdk-common:26.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/sdk-common/26.3.1/sdk-common-26.3.1.jar
Could not find builder-test-api.jar (com.android.tools.build:builder-test-api:3.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-test-api/3.3.1/builder-test-api-3.3.1.jar
Could not find ddmlib.jar (com.android.tools.ddms:ddmlib:26.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/ddms/ddmlib/26.3.1/ddmlib-26.3.1.jar
Could not find sdklib.jar (com.android.tools:sdklib:26.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/sdklib/26.3.1/sdklib-26.3.1.jar
Could not find layoutlib-api.jar (com.android.tools.layoutlib:layoutlib-api:26.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/layoutlib/layoutlib-api/26.3.1/layoutlib-api-26.3.1.jar
Could not find dvlib.jar (com.android.tools:dvlib:26.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/dvlib/26.3.1/dvlib-26.3.1.jar
Could not find repository.jar (com.android.tools:repository:26.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/repository/26.3.1/repository-26.3.1.jar
Could not find common.jar (com.android.tools:common:26.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/common/26.3.1/common-26.3.1.jar
Could not find builder-model.jar (com.android.tools.build:builder-model:3.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-model/3.3.1/builder-model-3.3.1.jar
Could not find protos.jar (com.android.tools.analytics-library:protos:26.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/analytics-library/protos/26.3.1/protos-26.3.1.jar
Could not find apkzlib.jar (com.android.tools.build:apkzlib:3.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/build/apkzlib/3.3.1/apkzlib-3.3.1.jar
Could not find apksig.jar (com.android.tools.build:apksig:3.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/build/apksig/3.3.1/apksig-3.3.1.jar
Could not find annotations.jar (com.android.tools:annotations:26.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/tools/annotations/26.3.1/annotations-26.3.1.jar
Could not find databinding-common.jar (androidx.databinding:databinding-common:3.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/androidx/databinding/databinding-common/3.3.1/databinding-common-3.3.1.jar
Could not find baseLibrary.jar (com.android.databinding:baseLibrary:3.3.1).
Searched in the following locations:
https://dl.google.com/dl/android/maven2/com/android/databinding/baseLibrary/3.3.1/baseLibrary-3.3.1.jar
Could not get unknown property 'android' for project ':screen' of type org.gradle.api.Project.

  • Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

  • Get more help at https://help.gradle.org

BUILD FAILED in 10s
The built failed likely due to AndroidX incompatibilities in a plugin. The tool is about to try using Jetfier to solve the incompatibility.
Building plugin awsome_video_player...
Running Gradle task 'assembleAarRelease'...
Unzipping /Users/alireza/.gradle/wrapper/dists/gradle-5.4.1-all/3221gyojl5jsh0helicew7rwx/gradle-5.4.1-all.zip to /Users/alireza/.gradle/wrapper/dists/gradle-5.4.1-all/3221gyojl5jsh0helicew7rwx

Exception in thread "main" java.util.zip.ZipException: error in opening zip file
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.(ZipFile.java:225)
at java.util.zip.ZipFile.(ZipFile.java:155)
at java.util.zip.ZipFile.(ZipFile.java:169)
at org.gradle.wrapper.Install.unzip(Install.java:214)
at org.gradle.wrapper.Install.access$600(Install.java:27)
at org.gradle.wrapper.Install$1.call(Install.java:74)
at org.gradle.wrapper.Install$1.call(Install.java:48)
at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:65)
at org.gradle.wrapper.Install.createDist(Install.java:48)
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128)
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)

Exception: The plugin awsome_video_player could not be built due to the issue above.

PLEASE ADD THIS FUNCTIONALITY

1-ADD A COVER LOCK
2-GESTURE ANIMATION UI FOR BRIGHTNESS AND VOLUME
3-DEFAULT FULLSCREEN
4-WHEN PLAYER IS LOADING THEN SHOW A INTERNET SPEED FOR USER

PLEASE ADD THESE FUNCTIONALITY BY THE WAY YOUR PACKAGE IS VERY COOL....THANKS & LOVE FROM INDIA

How to add request header?

Hi,
This video player is truly awesome. Thanks for sharing.
I have m3u8 videos that only plays with a particular header request. Is there a way to add request headers to this video player?

Thanks

增加onTap和onDoubleTap事件

感谢版主开发的plugin,在使用过程希望能增加以下功能:

  1. 在视频播放过程中,可以增加onTap和onDoubleTap事件
  2. 默认双击暂停的功能是否可以开放,由用户来控制(比如通过onTap和onDoubleTap来控制)
  3. videoControlBarStyle增加一个show属性,控制是否显示
  4. 单击显示底部控制栏是否可以开放,比如通过onTap和onDoubleTap来控制

谢谢

这个package有点屌哦。

请问目前支持哪些视频格式。m3u8是否支持,用了原生的video+chewie感觉很痛苦,希望作者的package能满足需求

Looking up a deactivated widget's ancestor is unsafe

════════ Exception caught by scheduler library ═════════════════════════════════════════════════════
The following assertion was thrown during a scheduler callback:
Looking up a deactivated widget's ancestor is unsafe.

At this point the state of the widget's element tree is no longer stable.

To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.

When the exception was thrown, this was the stack:
#0 Element._debugCheckStateIsActiveForAncestorLookup. (package:flutter/src/widgets/framework.dart:3508:9)
#1 Element._debugCheckStateIsActiveForAncestorLookup (package:flutter/src/widgets/framework.dart:3522:6)
#2 Element.dependOnInheritedWidgetOfExactType (package:flutter/src/widgets/framework.dart:3564:12)
#3 MediaQuery.of (package:flutter/src/widgets/media_query.dart:793:38)
#4 _AwsomeVideoPlayerState.initState.. (package:awsome_video_player/src/video.dart:113:38)
...
════════════════════════════════════════════════════════════════════════════════════════════════════

暂停播放

在页面切换时,如何能主动暂停播放呢?看了所有的API貌似没有对应的功能

修改项目名称

awsome 应该是拼写错误,能不能修正一下改成 awesome,有点强迫症犯了 😆

Video Cover

Can we get cover video for video? Or a cover I set? There is no problem at the beginning of the video, but I want the cover to appear when the video ends.

Subtile mkv file

Hello,

Is it possible to read the subtitles embedded in an mkv file?

切换dataSource 视频url地址无效

您好,
当我在

...省略部分代码
AwsomeVideoPlayer(
      url,
);
...省略部分代码
setState(() {
      url = "https://other_video.mp4";
});

切换url之后 视频并没有重新播放,而是接着播放之前的url链接的视频.
请问怎么操作可以切换当前的视频

大佬 把控制器暴露出来啊

image


  @override
  AwsomeVideoPlayerState createState() => AwsomeVideoPlayerState();
}

class AwsomeVideoPlayerState extends State<AwsomeVideoPlayer>
    with SingleTickerProviderStateMixin {
  /// 控制器 - 快进 seekTo 暂停 pause 播放 play 摧毁 dispose
  VideoPlayerController controller;

有些操作要在其他地方做。不暴露出控制器 怎么搞

No srt/vtt for Subtitle

This plugin has everything except the option to use srt/vtt subtitles from the network/assets. (which is the deal-breaker for me) .
Any thought of implementing that?

Please support error handling

Hello,

Is it possible to add the error handling mechanism if video player failed to load source? Currently, It'll stay in loading state forever.
I read your code & found that maybe you can define a new variable "errorCatched" like initialized variable, and set its value in your listener method like below:

if (!mounted) {
      return;
}
if (controller != null) {
      if (controller.value.initialized) {
        ...
      }
      else if (controller.value.hasError) {
        setState(() {
          errorCatched = true;
        });
      }
}

And then use this value to change the loading state & notify the parent widget.
Please let me know if I'm wrong.
Thanks.

Question

I have a list of video urls as a listview and onTap i want to load the player with new url, i tried setstate, changeNotifier, but its not working, can you help please?

设置禁止进度条拖拽,但是播放的时候还是能拖拽

这个是界面代码:
return Scaffold(
backgroundColor: AppColors.videoBackground,
body: Container(
alignment: Alignment.center,
child: AwsomeVideoPlayer(
state.item.videoUrl,
playOptions: VideoPlayOptions(
seekSeconds: 30,
//左侧垂直手势调节视频亮度的单位(0~1之间,不能小于0,不能大于1)
brightnessGestureUnit: 0.05,
//右侧垂直手势调节视频音量的单位(0~1之间,不能小于0,不能大于1)
volumeGestureUnit: 0.05,
//横行手势调节视频进度的单位秒数
progressGestureUnit: 0,
allowScrubbing:false,
loop: false,
autoplay: true,
startPosition: Duration(seconds: state.item.learnTime)),
/// 自定义视频样式
videoStyle: VideoStyle(/// 自定义顶部控制栏
videoTopBarStyle: VideoTopBarStyle(
height: 40,
show: true, //是否显示
padding:
EdgeInsets.symmetric(vertical: 8, horizontal: 10),
popIcon: Icon(
Icons.arrow_back_ios,
size: 16,
color: Colors.white,
),
contents: [
Center(
child: Container(
padding: EdgeInsets.only(bottom: 4,left: 5),
child: Text(
state.item.name,
style: whiteTextStyle()
),
),
)
], //自定义顶部控制栏中间显示区域
),// 部控制栏右侧显示区域

      /// 自定义视频暂停时视频中部的播放按钮
      playIcon: Icon(
        Icons.play_circle_outline,
        size: 100,
        color: Colors.white,
      ),
      /// 暂停时是否显示视频中部播放按钮
      showPlayIcon: true,
      /// 自定义底部控制栏
      videoControlBarStyle: VideoControlBarStyle(
        /// 更改进度栏的播放按钮
        playIcon: Icon(
            Icons.play_arrow,
            color: Colors.white,
            size: 20
        ),
        /// 更改进度栏的暂停按钮
        pauseIcon: Icon(
          Icons.pause,
          color: Colors.red,
          size: 20,
        ),
        /// 更改进度栏的全屏按钮
        fullscreenIcon: Icon(
          Icons.fullscreen,
          size: 20,
          color: Colors.white,
        ),
        /// 更改进度栏的退出全屏按钮
        fullscreenExitIcon: Icon(
          Icons.fullscreen_exit,
          size: 20,
          color: Colors.red,
        ),
        /// 决定控制栏的元素以及排序,示例见上方图3
        itemList: [
          "play",
          "position-time", //当前播放时间
          "progress",//线形进度条

//"basic-progress",//矩形进度条
"duration-time", //视频总时长
// "time", //格式:当前时间/视频总时长
"fullscreen"
],
),

      videoLoadingStyle: VideoLoadingStyle(
        /// 重写部分(二选一)
        // 重写Loading的widget
        // customLoadingIcon: CircularProgressIndicator(strokeWidth: 2.0),
        // 重写Loading 下方的Text widget
        // customLoadingText: Text("加载中..."),
        /// 设置部分(二选一)
        // 设置Loading icon 下方的文字
        loadingText: "正在加载...",
        // 设置loading icon 下方的文字颜色
        loadingTextFontColor: Colors.white,
        // 设置loading icon 下方的文字大小
        loadingTextFontSize: 20,
      ),
    ),

    /// 视频初始化完成回调
    oninit: (controller) {
      dispatch(VideoDetailsActionCreator.initController(controller));
    },
    /// 视频播放进度回调
    ontimeupdate: (value) {
      dispatch(VideoDetailsActionCreator.recordPlayTime(value.position.inMilliseconds / 1000));
    },
    /// 顶部控制栏点击返回按钮
    onpop: (value) {
      dispatch(VideoDetailsActionCreator.onBackClick());
    },
  ),
),

);
}
视频格式 m3u8

建议

用了一下大佬的库, 给几点建议:

  1. 取消播放键, 因为双击就是播放键, 三个键占用的位子太挤了, 经常点不到自己想点的键, 目前我用的是改变按钮大小, 直接给播放键的size为1;
  2. 播放进度条点击的时候经常点击不到, 主要是太窄了,建议点击阴影部分也触发, 因为那部分不是经常点击,所以修改后不会影像整体的体验,反而更加方便用户想要快进到哪个点.或者直接可以自定义进度条的宽度.让用户自己控制宽度;
  3. 给是否全屏播放一个回调, 因为在一个有appBar的情况全屏播放会出现appBar,如果有回调可以隐藏appBar.

整体感觉这个库很棒. 谢谢作者!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.