Coder Social home page Coder Social logo

a-aning / react-native-rn-videoplayer Goto Github PK

View Code? Open in Web Editor NEW
93.0 4.0 40.0 429 KB

基于react-native-video的视频播放器(上下滑动改变音量屏幕亮度,缓冲进度,双击暂停等ios Android)

Java 10.34% JavaScript 87.19% Objective-C 1.70% Ruby 0.78%
react-native video react-native-rn-videoplayer brightness react-native-video player gesture slide

react-native-rn-videoplayer's Introduction

已废弃不会更新,不推荐使用(由于没有mac设备等问题)

已废弃不会更新,不推荐使用(由于没有mac设备等问题)

已废弃不会更新,不推荐使用(由于没有mac设备等问题)

已废弃不会更新,不推荐使用(由于没有mac设备等问题)

react-native-rn-videoplayer

  • 视频上下滑动调节音量、屏幕亮度、长按左右两边快进退、左右滑动以及拖动进度条调节视频进度,视频控件锁定,全屏切换,缓冲进度,双击视频暂停,等功能,基于react-native-video

  • ps:Android改变亮度无需获取高级权限,只改变当前active也就是当前页面的亮度,改变亮度后,返回进入到其他页面会恢复到原来的亮度。

  • 如果你的视频全屏后尺寸没发生改变,参考全屏尺寸问题18

  • Version 2.x requires react-native >= 0.60.0

  • Version 1.3.2 requires react-native <= 0.59.9

gif预览 iosandroid 不是最新版

    

增加功能

  • v2.2.10 支持左右两边长按快进退,返回按钮右边显示视频名字、自定义缓冲提示图标和文字、暂停文字、快进退的文字!

    

  • v2.2.9 showSmallCont={false}小屏是否显示返回按钮,默认为true; 自定义进度条颜色(见api)

  • v2.2.8 当ios设备为iPhone X以上,全屏时隐藏底部小横条

  • v2.2.5 autoPlay={false}是否自动播放,默认为true

  • v2.2.1 增加手势左右滑动视频区域(非进度条上的点)来调整视频进度

  • v2.0.8 自定义小屏状态栏 类型fun 默认状态栏为沉浸式,黑底白字,有状态栏高度,可查看view/index.js 的Header组件

    <VideoPlayer
    statusBar={()=>null}//不使用默认状态栏 跟当前app保持一致
    statusBar={()=><Component/>}//自定义
    />
    
  • v2.0.6 增加锁定视频控件,锁定用户操作(调节音量/亮度,展示隐藏控件)

    lockControl (true/false 默认关闭)

    

Getting started

npm install react-native-rn-videoplayer --save

- - android

Open up android/app/src/main/java/[...]/MainActivity.java

+import android.content.Intent; 
+import android.content.res.Configuration;
public class MainActivity extends ReactActivity {

   ...
         
+ @Override
+      public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        Intent intent = new Intent("onConfigurationChanged");
+        intent.putExtra("newConfig", newConfig);
+        this.sendBroadcast(intent);
+    }
    ...
}

- - iOS

Add the following to your project's AppDelegate.m:

+#import "Orientation.h"
+#import <RNIndicator.h>

@implementation AppDelegate

// ...

+- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
+  return [Orientation getOrientation];
+}

//找到这行
UIViewController *rootViewController = [UIViewController new];

//改为
UIViewController *rootViewController = [HomeIndicatorView new];


@end

RN >= 0.60

ios

  cd ios 

  pod install

Android.

Most of them are automatically linked. If you can’t find XX, you should link manually

  • settings.gradle
  rootProject.name = 'TestPack622'
  apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings)

+    include ':react-native-linear-gradient'
+    project(':react-native-linear-gradient').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-linear-gradient/android')
+    include ':react-native-svg'
+    project(':react-native-svg').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-svg/android')
+    include ':react-native-orientation-locker'
+    project(':react-native-orientation-locker').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-orientation-locker/android')
+    include ':react-native-video'
+    project(':react-native-video').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-video/android-exoplayer')
+    include ':react-native-system-setting'
+    project(':react-native-system-setting').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-system-setting/android')

  include ':app'
  • MainApplication.java
+  import com.horcrux.svg.SvgPackage;
+  import com.BV.LinearGradient.LinearGradientPackage; // <--- This!
+  import org.wonday.orientation.OrientationPackage;
+  import com.ninty.system.setting.SystemSettingPackage;
+  import com.brentvatne.react.ReactVideoPackage;


  ···
 @Override
      protected List<ReactPackage> getPackages() {
        @SuppressWarnings("UnnecessaryLocalVariable")
        List<ReactPackage> packages = new PackageList(this).getPackages();
        // Packages that cannot be autolinked yet can be added manually here, for example:
+          packages.add(new LinearGradientPackage());
+          packages.add(new SvgPackage());
+          packages.add(new OrientationPackage());
+          packages.add(new SystemSettingPackage());
+          packages.add(new ReactVideoPackage());
        return packages;
      }
      ···
  • app/build.gradle
dependencies {
+    implementation project(':react-native-svg')
+    implementation project(':react-native-linear-gradient')
+    implementation project(':react-native-orientation-locker')
+    implementation project(':react-native-system-setting')
+    implementation project(':react-native-video')
}

RN <= 0.59

react-native link react-native-linear-gradient
react-native link react-native-orientation-locker
react-native link react-native-svg
react-native link react-native-system-setting
react-native link react-native-video

Android

  1. Append the following lines to android/settings.gradle:

    include ':react-native-rn-videoplayer'
    project(':react-native-rn-videoplayer').projectDir = new File(rootProject.projectDir, 	'../node_modules/react-native-rn-videoplayer/android')
  2. Insert the following lines inside the dependencies block in android/app/build.gradle:

      compile project(':react-native-rn-videoplayer')
    
  3. Open up android/app/src/main/java/[...]/MainApplication.java

    • Add
import com.ngxu.videoplayer.RNVideoplayerPackage;

new RNVideoplayerPackage() //to the list returned by the `getPackages()` method

Usage

import VideoPlayer from 'react-native-rn-videoplayer';

<VideoPlayer
url={"xxxxx.mp4"}
autoPlay={false}//是否自动播放,默认为true v2.2.5增加
poster={"http://XXX.jpg"}//视频封面
ref={(ref)=>this.player=ref}
lockControl={true}//控件锁定功能 v2.0.6增加
moreSetting={() => null}//右上角更多按钮 输出null则不显示
onSmallBack={()=>{this.props.navigation.goBack()}}
/>

api

  • url 视频地址

  • showSmallCont={bool} 小屏是否隐藏返回按钮 默认false;

  • changeWindows() 切换全屏或者小屏

    changeWindows(boolean) true 全屏, false 小屏

    Example:

      <VideoPlayer ref={(ref)=>this.player=ref}/>
      this.player.changeWindows(true); // 全屏
  • storeComponent 右上角收藏按钮的图标

      storeComponent={()=><Image/>}
  • moreSetting 右上角更多按钮的图标

      moreSetting={()=><Image/>}
  • speedColor 当前播放进度条颜色 "#e54602"

  • dotColor 进度条上的圆点颜色 "#e54602"

  • dotBorderColor 进度条上的圆点被按下时的边框颜色 "rgba(255,255,255,0.3)"

  • bottomSpeedColor 最底部播放进度的颜色 "#e54602"

  • cachColor 缓冲进度条颜色 "#ffffff"

  • allSpeedColor 整个进度条颜色 "rgba(0,0,0,0.4)

  • backVideoName 返回按钮旁的文字 string

  • pausedTipText 已暂停的文字 string

  • loadingText 正在缓冲的文字 string

  • loadingIcon 加载的图标 loadingIcon={<></>}

  • solText 快退中的文字 string

  • fastText 快进中的文字 string

  • setPaused 播放暂停

      this.player.setPaused(true)//true暂停;false播放;
    
      <VideoPlayer
       ref={(ref)=>this.player=ref}
      >
  • reLoad 重新加载

      this.player.reLoad()
    
      <VideoPlayer
       ref={(ref)=>this.player=ref}
      >
  • rePlay 重置进度为0

    this.player.reLoad(false)
    //false 不自动播放
    //默认为true 自动播放
  • onSmallBack 当视频是小窗口时 点击返回按钮的回调 可以在此添加返回上个页面的功能 func

  • onStore 点击右上角收藏按钮的回调 func

  • onMoreFun 点击右上角更多按钮的回调 func

  • onWindowChange 窗口改变的回调 func

      <VideoPlayer
        onWindowChange={(e)=>{}}//e:"full"全屏 "small"小屏 
      >
  • continuous 是否开启全屏时的选集功能 适合连续剧 默认 false

      continuous={true}
  • renderAllSeenList 点击选集后显示的集数列表

    ···
    <VideoPlayer
      url={"https://xxxxx.mp4"}
      ref={(ref)=>this.player=ref}
      renderAllSeenList={this.renderAllSeenList}
    />
      
    ···
      renderAllSeenList = () => (
      <View style={{ width: height / 2.5, backgroundColor: "rgba(0,0,0,0.6)", position: "absolute", top: 0, bottom: 0, right: 0, }}>
          <ScrollView>
            <Button 
              onPress={()=>{
                  const newdata = this.state.data
                        newdata.index = newindex//集数
                  //更新集数 并重新开始播放
                  this.setState({ data: newdata }, () => { this.player.rePlay() })
              }}
              
            />  
          </ScrollView>      
    
        </View>
      )
  • nextBtnFun 全屏时下一集按钮的方法 当是最后一集的时候应将值变为false,将按钮置灰

    const {data} = this.state
    //data.index为集数
    //当当前播放的集数和总集数相同时,将nextBtnFun重置为false
    nextBtnFun={
      data.index == data.datalist[data.datalist.length - 1].num - 1 ? false : this.nextBtnFun
      }
  • onLoad 视频加载成功可以开始播放的回调 继承react-native-veideo

  • onSeek 调整进度后的回调 继承react-native-video的onSeek

  • onEnd 播放完的回调 继承react-native-video的onSeek

  • onBuffer 是否处于等待加载时 这里可以取到视频卡住展示loading或者是视频可以播放隐藏loading的回调 继承react-native-video的onBuffer

  • poster 视频封面图 视频还不能播放的时候展示的封面图 并不是loading框 继承react-native-video的poster eg:poster={"http://xudaxianer.cn/artcover/2020-12-11/1607675992959.jpg"}

  • ..... 继承全部的react-native-video的方法及属性

暴露方法

import {NgxuSetting} from 'react-native-rn-videoplayer'

显示或者隐藏安卓底部虚拟按键

const Setting = new NgxuSetting()
Setting.hideAndroidBottom()
Setting.showAndroidBottom()

获取手机系统亮度

const Setting = new NgxuSetting()
Setting.getBrightness((e)=>{consoloe.log(e)})

改变ios系统亮度 android 当前app亮度

  • android仅仅只改变当前active亮度,不会修改系统亮度,修改系统亮度是非常麻烦的事情,需要用户手动打开手机设置,app权限设置,手动打开“允许修改系统设置“的高级权限
  • ios则是改变系统亮度你可以
   const Setting = new NgxuSetting()
   Setting.SetBrightness(1)//0-1之间

react-native-rn-videoplayer's People

Contributors

a-aning 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

Watchers

 avatar  avatar  avatar  avatar

react-native-rn-videoplayer's Issues

Could not resolve com.android.tools.build:gradle:3.3.1

您好,我是原安卓原生开发了解不是很多,在yarn add react-native-rn-videoplayer加入包手,
yarn android出现以下编译错误,我了解到应该是访问编译相关的远程文件报错了,但不知道用什么办法去解决。谢谢。

FAILURE: Build failed with an exception.

  • What went wrong:
    A problem occurred configuring project ':react-native-rn-videoplayer'.

Could not resolve all artifacts for configuration ':react-native-rn-videoplayer:classpath'.
Could not resolve com.android.tools.build:gradle:3.3.1.
Required by:
project :react-native-rn-videoplayer
> Could not resolve com.android.tools.build:gradle:3.3.1.
> Could not get resource 'https://jcenter.bintray.com/com/android/tools/build/gradle/3.3.1/gradle-3.3.1.pom'.
> Could not GET 'https://jcenter.bintray.com/com/android/tools/build/gradle/3.3.1/gradle-3.3.1.pom'. Received status code 502 from server: Bad Gateway

image

install进来之后按照文档配置完,开始run发现卡死在这里

使用版本:
"react": "17.0.1",
"react-native": "0.64.0",
"react-native-rn-videoplayer": "^2.2.10",

在我npm install进来之后,按照文档配置完,开始react-native run-android运行,发现卡死在解析依赖这里。
Err:
:react-native-rn-videoplayer > Resolve dependencies of :react-native-rn-videoplayer:classpath

微信图片_20210517175501

在ScrollView中使用,全屏模式下 手势、进度条控制失效

我又来了。。

在ScrollScoView中嵌套使用,点击全屏后,
全屏模式下手势、进度条控制失效了,上下滑动时ScrollScoView优先响应了,造成了页面的上下滚动

我是个小白,个人猜测是,是否在全屏模式中,video的手势响应优先级应该高于ScrollScoView?

Getting console warnings

  • ComponentWillMount has been renamed and is not recommended for use
  • Please update the following components: % VideoPlayer
  • Can't perform a React state update on an unmounted component. Indicates a memory leak. To fix cancel all subscriptions and asynchronous tasks in a UseEffect cleanup. in TipsPaused(at react-native-rn-videoplayer/index.js:1273)
  • Then the last, the video player doesn't play sometimes, it shows paused and the video won't load

null is not an object (evaluating 'event.nativeEvent.pageX)

"react-native": "0.63.2",

会报错:
null is not an object (evaluating 'event.nativeEvent.pageX)
因为
onLongPress={this.speedLongTouch}
onPressOut={this.speedLongTouchOut}
var speedStartX = evt.nativeEvent.pageX
中的nativeEvent不存在。

官方文档:
https://reactnative.dev/docs/pressevent
example:
{
changedTouches: [PressEvent],
identifier: 1,
locationX: 8,
locationY: 4.5,
pageX: 24,
pageY: 49.5,
target: 1127,
timestamp: 85131876.58868201,
touches: []
}
不需要nativeEvent吧。直接pageX就行。我理解没错吧

在安卓下有bug,播放时的视频尺寸不对

安卓加载时尺寸是对的,播放时尺寸就不对了
全屏时,视频是侧过来了,实际上视频的宽高并没有改变,导致了横过来时时依然是小屏幕播放,只是横着的

发现个致命问题,这串代码在render里执行

if (this.url && this.url != this.props.url) { this.onchangeUrl() }
切换视频时报错,最后排查得到onchangeUrl 这个方法里面带有this.setState
而onchangeUrl 的调用位置却是在render处 这样会到导致死循环

大佬要判断地址是否和上一次的一样 可以在生命周期componentDidUpdate 里完成哦

老哥,用不了啊

好容易安装完了,调用直接GG

import Videoplayer from 'react-native-rn-videoplayer';

export default ({ navigation }) => {
  return (
    <>
      <StatusBar barStyle="dark-content" hidden={false} />
      <SafeAreaView>
        <ScrollView
          contentInsetAdjustmentBehavior="automatic"
          style={styles.scrollView}>          
          <View style={styles.body}>
            <Text style={styles.sectionTitle}>Step One</Text>
            <Button
              title="Jump to Video"
              onPress={() => navigation.navigate('Video')}
            />
            <VideoPlayer
              url="https://jingdian.qincai-zuida.com/20200609/8136_0462c8a7/index.m3u8"
            />
          </View>
        </ScrollView>
      </SafeAreaView>
    </>
  );
}

报错如下:
image
在线等,挺急的

全屏后,无法退出全屏

求助,为啥全屏后点击 退出全屏的icon没有反应,日志显示

unknown:ReactNative: Got DOWN touch before receiving UP or CANCEL from last gesture

增强:返回上一个页和左右滑动视频手势冲突

当导航返回手势的滑动宽度值比较大时,左右滑动视频区域手势转换成返回上一页手势效果;
导航:react-navigation

gestureResponseDistance: { horizontal: Dimensions.get('window').width };//手势返回滑动区域为屏幕宽度

CONFIGURING一直卡60

WARNING: Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'.
It will be removed in version 5.0 of the Android Gradle plugin.
For more information, see http://d.android.com/r/tools/update-dependency-configurations.html.
<=======------> 60% CONFIGURING [7m 8s]
<=======------> 60% CONFIGURING [7m 9s]e dependencies of :react-native-rn-videoplayer:classpath
<=======------> 60% CONFIGURING [7m 51s]

Android视频无法全屏,参考issues/2046修改settings.gradle,启动时Gradle报错

版本信息:
"react-native": "0.63.3",
"react-native-rn-videoplayer": "^2.2.9",

已参考https://github.com/A-ANing/react-native-rn-videoplayer/issues/11#issuecomment-719136928 
将react-native-rn-videoplayer中dependencies依赖手动添加到项目package.json

启动后发现视频在Android设备中无法全屏,
参考https://github.com/react-native-video/react-native-video/issues/2046 修改settings.gradle后,项目启动报错

报错日志:

> Task :app:mergeDexDebug FAILED

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.2/userguide/command_line_interface.html#sec:command_line_warnings
272 actionable tasks: 2 executed, 270 up-to-date
D8: Cannot fit requested classes in a single dex file (# fields: 68274 > 65536)
com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:
The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html
        at com.android.builder.dexing.D8DexArchiveMerger.getExceptionToRethrow(D8DexArchiveMerger.java:131)
        at com.android.builder.dexing.D8DexArchiveMerger.mergeDexArchives(D8DexArchiveMerger.java:118)
        at com.android.build.gradle.internal.transforms.DexMergerTransformCallable.call(DexMergerTransformCallable.java:102)
        at com.android.build.gradle.internal.tasks.DexMergingTaskRunnable.run(DexMergingTask.kt:444)
        at com.android.build.gradle.internal.tasks.Workers$ActionFacade.run(Workers.kt:335)
        at org.gradle.workers.internal.AdapterWorkAction.execute(AdapterWorkAction.java:57)
        at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62)
        at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:98)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62)
        at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)
        at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)
        at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59)
        at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$2(DefaultWorkerExecutor.java:198)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:215)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164)
        at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:131)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
        at java.lang.Thread.run(Thread.java:748)
Caused by: com.android.tools.r8.CompilationFailedException: Compilation failed to complete
        at com.android.tools.r8.utils.t.a(:55)
        at com.android.tools.r8.D8.run(:11)
        at com.android.builder.dexing.D8DexArchiveMerger.mergeDexArchives(D8DexArchiveMerger.java:116)
        ... 33 more
Caused by: com.android.tools.r8.utils.AbortException: Error: null, Cannot fit requested classes in a single dex file (# fields: 68274 > 65536)
        at com.android.tools.r8.utils.Reporter.a(:21)
        at com.android.tools.r8.utils.Reporter.a(:7)
        at com.android.tools.r8.dex.VirtualFile.a(:33)
        at com.android.tools.r8.dex.VirtualFile$h.a(:5)
        at com.android.tools.r8.dex.ApplicationWriter.a(:13)
        at com.android.tools.r8.dex.ApplicationWriter.write(:35)
        at com.android.tools.r8.D8.d(:44)
        at com.android.tools.r8.D8.b(:1)
        at com.android.tools.r8.utils.t.a(:23)
        ... 35 more


FAILURE: Build failed with an exception.

need update for react native 0.73.1

update this on gradle
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'com.android.support:appcompat-v7:1.3.0'
implementation 'com.facebook.react:react-native:+'

视频全屏后,手势,播放按钮,进度条异常

1:视频全屏后,手势,播放按钮,进度条异常
2:增加场景:播放地址在点击播放后后才获取并且才开始播放
3:在场景2的情况下没有url的情况进度条手势必须失效,点击播放获取播放地址后才重新生效

如果能在加个播放速率,那就简直完美了

这个组件非常符合我的需求
1、就是差个播放速率(像短视频可能不需要),像教学课程这种一般学生都喜欢快进的看 (可能会面临大家的播放速率不一样 0.7 ,1, 1.5 ,2这种 )
2、还有个是vip展示页 有的需求是播放到几分钟(只免费几分钟) 就要求停止播放了 要求开通会员 (作者好像在里面有实现,只是把那个组件删了,其实可以提供一个自定义方法 方便自定义布局)
{(showOpenVip && this.props.VIPCONTS) ?
this.props?.showNoVipView() : null }
还有一种是播放视频个数,比如用户 一天只能免费3个视频 这一天就只能显示那个开通会员的页面了,和上面的有点不一样,上面的是播放中,后者是一开始就不给播放 只是展示个自定义界面。
作者真是用心了

Full screen Landscape issue

Hi This library is awesome,
The only problem is i am not able to turn player into the full screen. when i am clicking on full-screen icon..
the screen is not rotating to Landscape.
even tried manually

Here is what i tried so far

const onEnterFullscreen =async () => {
        if (Platform.OS === "android") {
            RNOrientation.lockToLandscape()
        } else {
            //Orientation.lockToLandscapeRight()

            await  Orientation.lockToLandscape(); 

        }

    }
    const onExitFullscreen = () => {
        if (Platform.OS === "android") {
            RNOrientation.lockToPortrait();
            RNOrientation.unlockAllOrientations()
        } else {
            Orientation.lockToPortrait();
            Orientation.unlockAllOrientations()
        }

    }

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.