react-native-video

作者: 雪脩 | 来源:发表于2018-09-19 11:31 被阅读72次

    简介

    一个react-native视频组件,可以实现视频播放的效果。
    要求的react-native版本 >= 0.40.0;对于RN支持0.19.0-0.39.0,请使用1.0之前的版本。

    一、安装

    使用npm安装依赖库:
    npm install --save react-native-video
    或者yarn:
    yarn add react-native-video

    IOS环境下:

    直接运行下面命令来链接react-native-video库:
    react-native link
    如果你想允许其他应用在你的视频组件上播放音乐,请打开AppDelegate.m文件并且添加:
    AppDelegate.m

    #import <AVFoundation/AVFoundation.h>  // import
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
      ...
      [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];  // allow
      ...
    }
    

    Android环境下:

    直接运行下面命令来链接react-native-video库:
    react-native link
    如果上面的方式失败了,那么你可以尝试手动添加配置,这步比较麻烦。

    android/settings.gradle
    较新的ExoPlayer库适用于大多数人。(推荐使用这个库)

    include ':react-native-video'
    project(':react-native-video').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-video/android-exoplayer')
    

    如果您需要使用旧的基于Android MediaPlayer的播放器,请改用以下内容:

    include ':react-native-video'
    project(':react-native-video').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-video/android')
    

    android/app/build.gradle

    dependencies {
       ...
       compile project(':react-native-video')
    }
    

    MainApplication.java
    在java文件顶部位置记得添加import:

    import com.brentvatne.react.ReactVideoPackage;
    

    将ReactVideoPackage类添加到导出的包列表中:

    @Override
    protected List<ReactPackage> getPackages() {
        return Arrays.asList(
                new MainReactPackage(),
                new ReactVideoPackage()
        );
    }
    

    二、使用

    1、可配置属性

    • muted(iOS 、Android)
      控制音频是否静音。
      false(默认) - 不要静音
      true - 静音

    • volume (iOS、Android)
      调整音量
      1.0 - 满音量
      0.0 - 将音频静音
      其他值 - 减小音量

    • rate
      视频播放的速率。
      0.0 - 暂停播放
      1.0 - 正常速率播放
      其他值 - 自定义速率,例如0.5慢速播放或者2.0快速播放
      注意:对于Android的播放器,rate属性仅在Android6.0或者更高版本中生效。

    • paused (iOS 、Android)
      控制播放器是否暂停。
      false(默认) - 暂停播放
      true - 不要暂停播放

    repeat (iOS、Android)
    确定在到达结尾时是否重复播放视频。
    flase(默认) - 不重复播放
    true - 重复播放


    • allowsExternalPlayback(iOS)
      指示播放器是否允许切换到AirPlay或HDMI等外部播放模式。
      true(默认)-运行切换到其他外部播放模式
      false-不允许切换到其他外部播放模式

    • audioOnly(iOS 、 Android)
      指示播放器是否应仅播放音轨而不是显示视频轨道,而是显示视频poster(海报)。
      false(默认) - 仅正常播放视频
      true - 展示海报和播放视频
      如果audioOnly设置为true,那么poster属性必须有值设置进去。

    • ignoreSilentSwitch(iOS)
      控制iOS静默开关行为。
      inherit(默认) - 使用默认的AVPlayer开关行为
      ignore - 设置了静音开关,也要播放音频
      obey - 如果设置了静音开关,请勿播放音频

    • playInBackground(iOS、Android ExoPlayer、 Android MediaPlayer)
      确定应用程序在后台是是否应继续播放媒体。这允许客户继续收听音频。
      false (默认) - 不继续播放视频
      true - 后台继续播放视频

    注意:要在IOS适用此功能,你还必须:


    playWhenInactive (iOS)
    在通知或控制中心位于视频前面时是否应继续播放媒体。
    false(默认) - 不继续播放视频
    true - 继续播放视频



    posterResizeMode(iOS、Android)
    确定当帧与原始视频尺寸不匹配时如何调整海报图像的大小。
    contain(默认) - 均匀缩放图像(保持图像的纵横比),使图像的尺寸(宽度和高度)等于或小于视图的相应尺寸(减去填充)。
    center - 使图像沿两个维度居中。 如果图像大于视图,请将其均匀缩小以使其包含在视图中
    cover - 均匀缩放图像(保持图像的纵横比),使图像的尺寸(宽度和高度)等于或大于视图的相应尺寸(减去填充)
    none - 不调整大小
    repeat - 重复图像以覆盖视图的框架。 图像将保持其大小和纵横比 (仅限iOS)
    stretch - 独立缩放宽度和高度,这可能会改变src的宽高比


    resizeMode(IOS、 Android ExoPlayer、Android MediaPlayer)
    确定当帧与原始视频尺寸不匹配时如何调整视频大小。
    none(默认) - 不匹配大小
    contain - 均匀缩放视频(保持视频的宽高比),使视频的尺寸(宽度和高度)等于或小于视图的相应尺寸(减去填充)
    cover - 均匀缩放视频(保持视频的宽高比),使图像的尺寸(宽度和高度)等于或大于视图的相应尺寸(减去填充)
    stretch - 独立缩放宽度和高度,这可能会改变src的宽高比


    • progressUpdateInterval(iOS、Android)
      onProgress事件之间的毫秒延迟(以毫秒为单位)。
      默认: 250.0

    • stereoPan(iOS、Android)
      调整左右音频通道的平衡。 接受-1.0和1.0之间的任何值。
      -1.0 - 满左音频
      0.0(默认) - 居中
      1.0 - 满右音频

    • textTracks (Android ExoPlayer)
      加载一个或多个“sidecar”文本轨道。 这需要一组表示每个轨道的对象。 每个对象应具有以下格式:
    Property Description
    title 文本轨道的名称
    language 代表语言的2个字母ISO 639-1代码
    type Mime类型的轨道 :TextTrackType.SRT - .srt SubRip Subtitle、TextTrackType.TTML - .ttml TTML、TextTrackType.VTT - .vtt WebVTT(这个也一般用不到)
    uri 文本轨道的URL。目前,仅支持在网络服务器上托管的种类

    例子:

    import { TextTrackType }, Video from 'react-native-video';
    
    textTracks={[
      {
        title: "English CC",
        language: "en",
        type: "text/vtt", TextTrackType.VTT,
        uri: "https://bitdash-a.akamaihd.net/content/sintel/subtitles/subtitles_en.vtt"
      },
      {
        title: "Spanish Subtitles",
        language: "es",
        type: "application/x-subrip", TextTrackType.SRT,
        uri: "https://durian.blender.org/wp-content/content/subtitles/sintel_es.srt"
      }
    ]}
    

    这不支持iOS,因为AVPlayer不支持它。 必须将文本轨道作为HLS播放列表的一部分加载。


    • selectedTextTrack
      配置显示那个文本轨道(标题或副标题)(如果有)
    Type Value Description
    system(默认) N/A 仅在启用了字幕的系统首选项时显示标题
    disable N/A 不显示文本轨道
    title string 显示标题为值的文本轨道,例如 “法国1”
    “language” string 显示指定为值的语言显示文本轨道,例如“FR”
    “index” number 显示指定为值的索引的文本轨道,例如0

    iOS和Android(仅限4.4及更高版本)均提供设置,以便为听障人士提供字幕。 如果选择“系统”并启用了字幕设置,iOS / Android将查找与该客户的语言匹配的标题并显示它。
    如果匹配指定类型(和值,如果适用)的轨道不可用,则不会显示任何文本轨道。 如果多个曲目符合条件,则将使用第一个匹配。

    selectedTextTrack={{
       type: Type,
       value: Value
    }}
    

    例子:

    selectedTextTrack={{
      type: "title",
      value: "English Subtitles"
    }}
    

    • useTextureView
      输出到TextureView而不是默认的SurfaceView。 通常,您需要使用SurfaceView,因为它更高效并提供更好的性能。 但是,SurfaceViews有两个限制:
      它无法使用动画,转换或缩放
      你无法覆盖多个SurfaceView

    useTextureView只能在设置源的同时进行设置。
    false(默认) - 使用SurfaceView
    true - 使用TextureView

    2、事件属性

    • onLoad(iOS、Android)
      加载媒体并准备播放时调用的回调函数。
      Payload(有效负载):
    Property Value Desctiption
    currentPosition number 视频开始播放的时间(以秒为单位)
    duration number 视频时间长度(以秒为单位)
    natural object 属性:width - 视频编码的宽度(以像素为单位);height - 视频编码的高度(以像素为单位);orientation - “portrait”或者”landscape”
    textTracks array 一组文本跟踪信息对象,具有以下属性:index,title,language,type
     {
      canPlaySlowForward: true,     //可以慢速播放
      canPlayReverse: false,        //可以反向播放
      canPlaySlowReverse: false,    //可以慢速反向播放
      canPlayFastForward: false,    //可以快进播放
      canStepForward: false,        //可以前进
      canStepBackward: false,       //可以后退
      currentTime: 0,
      duration: 5910.208984375,
      naturalSize: {
         height: 1080
         orientation: 'landscape'
         width: '1920'
      },
      textTracks: [
        { title: '#1 French', language: 'fr', index: 0, type: 'text/vtt' },
        { title: '#2 English CC', language: 'en', index: 1, type: 'text/vtt' },
        { title: '#3 English Director Commentary', language: 'en', index: 2, type: 'text/vtt' }
      ]
    }
    
    • onLoadStart(iOS、Android)
      媒体开始加载时调用的回调函数
      Payload(有效负载):
    Property Description
    isNetwork boolean
    type string
    uri string
    {
      isNetwork: true,
      type: '',
      uri: 'https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8'
    }
    

    • onProgress
      视频播放过程中每个间隔进度单位(通常不足一秒,你可以打印日志测试下)调用的回调,其中包含有关媒体当前正在播放的位置的信息。
    Property Description
    currentTime number
    playableDuration number
    seekableDuration number
    {
      currentTime: 5.2,
      playableDuration: 34.6,   //可玩的持续时间
      seekableDuration: 888    //可寻找的持续时间
    }
    
    • onTimedMetadata(iOS、Android ExoPlayer)
      当定时元数据可用时调用的回调函数.
    Property Type Description
    metadata array Array of metadata objects

    例子

    {
      metadata: [
        { value: 'Streaming Encoder', identifier: 'TRSN' },
        { value: 'Internet Stream', identifier: 'TRSO' },
        { value: 'Any Time You Like', identifier: 'TIT2' }
      ]
    }
    

    4、方法

    方法对引用Video元素的ref引用进行操作。你可以使用以下代码创建应用:

    return(
        <Video source={···}
            ref => (this.player = ref) />
    
    • seek(seconds)(iOS、Android)
      seek(这里翻译成定位)到由秒表示的位置。seconds是一个浮点值。
      注意:seel()只能在onLoad事件触发后调用。
      例子:
    this.player.seek(200)  //将开始播放时间定为3min20
    s处
    

    • seek(seconds, tolerance) - 精确的seek(iOS)
      默认情况下,iOS在目标位置的100毫秒内寻找。 如果您需要更高的准确度,可以使用搜索公差方法:
    seek(seconds, tolerance)
    

    tolerance是允许的秒位置的最大距离(以毫秒为单位)。 使用更精确的公差可能导致寻求更长时间。 如果要精确搜索,请将容差设置为0。
    例子:

    this.player.seek(120, 50); // 定位到2分钟精度 +/- 50毫秒处
    

    相关文章

      网友评论

        本文标题:react-native-video

        本文链接:https://www.haomeiwen.com/subject/btmhbftx.html