用react-native-video向React Native添加视频

2,131 阅读7分钟

React Native可能是目前使用最广泛的混合应用程序框架,因为它使开发人员能够通过编写React代码来创建原生应用程序,这在网站和应用程序之间提供了类似的开发人员体验。创建应用程序从未如此简单。

但这是否意味着你可以通过将所有React代码复制到React Native应用中,直接将你的网站变成一个应用?不,不幸的是,这不是那么简单。即使React Native应用的代码看起来与用React编写的网络应用的代码相似,但还是有一些微小但关键的区别。

与网站和浏览器相比,移动应用程序有许多原生界面和功能。虽然React Native应用被编译成iOS或Android的原生应用,但一些简单元素的实现与我们在React的网页版中看到的不同。例如,<div> 变成<view><p> 变成<text> ,等等。

这使得React Native与所有基于Cordova的混合应用框架不同。但是,听起来是一个主要的缺点,实际上使应用程序有可能编译成本地代码,而不是模拟的网络视图。

与原生网络元素不同的一个元素是视频。在HTML和网络的世界里,观看视频就像使用本地HTML元素<video>

在应用程序的背景下,实现视频并不像在网络上那样容易。好在React Native社区已经为这个问题开发了非常流行的解决方案。

这篇文章强调了最常见的包,react-native-video,用于在你的React Native应用中使用视频。你还会学到如何在你的React Native应用中实现它。

前提条件

由于安装和使用可能因你开发的设备而不同,我们将专注于iOS版本,并在基于Mac的开发者环境中开发所有的例子。

为各种类型的设备或平台(如Android)进行开发是类似的,但你需要注意的差异在软件包的文档中会有非常详细的描述。

什么是react-native-video?

截至目前,在使用最广泛的软件包react-native-video之外,还没有真正的替代品。

虽然我喜欢比较不同的包,但这在这里没有意义,所以我们只强调这个库的用法、优点和缺点,然后学习如何使用它。react-native-video包的大小为500kB,可以在React Native世界的所有设备上使用。

安装该包

在你使用这个库之前,你必须在你项目的根目录下安装这个包。

npm install --save react-native-video

如果你在Mac上运行你的本地React应用程序,你还必须运行以下命令。

npx pod-install

对于其他环境和应用环境,请参考你所在平台的官方安装指南

使用 react-native-video

在我解释如何使用这个包之前,让我们先举个例子说明我们想用它来实现什么。视频在应用程序中的一个常见用例是动态背景,这就是我们的应用程序在登录屏幕中想要实现的。

它看起来应该是这样的。

Login Page On Mobile Device Screen With Dynamic Animation Playing In The Background

首先,我们将视频组件从库中导入到我们想要显示视频的组件中。

当然,为了使视频组件能够显示任何东西,我们需要一个视频文件。这可以是你项目中的一个文件,也可以是一个外部资源的链接。

现在,让我们把一切放在一起。

import Video from 'react-native-video';
import video from '../test-video.mp4';

const MyComponent = () => {
    return (
        <Video  
            source={video}                  // the video file
            paused={false}                  // make it start    
            style={styles.backgroundVideo}  // any style you want
            repeat={true}                   // make it a loop
        />
    )
}

正如你所看到的,我们把从我们的项目中导入的视频文件直接传给了该组件。如果你喜欢一个外部视频文件的链接,你也可以使用源道具,像这样。

<Video  
    source={{ url: 'http://link-to-your-video.mp4'}}
    ...
/>

为了实现背景视频的外观,我们还向组件传递了一些React Native风格。此外,我们将道具pause 设置为false ,这告诉组件紧接着开始播放视频。我们还将道具repeat 设置为true ,使视频循环播放。

在react-native-video中使用的其他组件道具

我们只用了该组件的四个道具,就很快实现了我们的用例。然而,还有很多方法可以使用道具。你可以查看文档以看到完整的列表,但让我向你展示一些我认为非常有用的选择。

[allowsExternalPlayback](https://github.com/react-native-video/react-native-video#allowsexternalplayback)

这个道具允许视频由外部资源控制,如AirPlay或HDMI,但这只在iOS上可用。

[playInBackground](https://github.com/react-native-video/react-native-video#playinbackground)

使用这个选项来指定当应用程序被关闭时,视频是否应该继续播放。当然,只有音频会继续播放,但对于某些用例来说,即使应用程序已经关闭,保持视频播放也是有帮助的。

[poster](https://github.com/react-native-video/react-native-video#poster)

这个道具创建了一个图像,在视频正在加载或尚未开始时显示,例如通常在YouTube上看到的缩略图。此外,你可以通过以下方式调整图像 [posterResizeMode](https://github.com/react-native-video/react-native-video#posterresizemode).

[controls](https://github.com/react-native-video/react-native-video#controls)

在我们上面的例子中,我们不想显示视频的控件,因为它只是在后台运行,这是该组件的默认行为。如果你想让用户控制视频,你可以简单地把controls 设为true ,控件就会自动显示。

注意:在iOS上,即使这个标志被设置为false,控件也会以全屏模式显示。

创建外部视频控件

该组件还提供了你从外部控制视频所需的一切,因此可以创建你自己独特的用户界面来控制它。

这些属性包括 [paused](https://github.com/react-native-video/react-native-video#paused), [muted](https://github.com/react-native-video/react-native-video#muted), [volume](https://github.com/react-native-video/react-native-video#volume), [onprogress](//github.com/react-native-video/react-native-video#onprogress), , 或 [rate](https://github.com/react-native-video/react-native-video#rate)是你可以使用React状态定制的道具,你可以让任何其他元素控制它们。下面是一个简单的例子,说明我的意思。

function Home(props) {  
    const [isPlaying, setIsPlaying] = React.useState(false);  
    const [isMuted, setIsMuted] = React.useState(false);  

    const togglePlaying = () => {};  

    return (  
        <View>  
            <Video
                source={video}  
                paused={!isPlaying}  
                controls={true}  
                style={styles.backgroundVideo}  
                muted={isMuted}  
            />  
            <Button
                onPress={() => setIsPlaying(p => !p)}  
                title={isPlaying ? 'Stop' : 'Play'}  
            />  
            <Button
                onPress={() => setIsMuted(m => !m)}  
                title={isMuted ? 'Unmute' : 'Mute'}  
            />  
        </View> 
    );  
}

正如你所看到的,通过一个简单的状态和使用按钮,我们可以以我们想要的方式控制视频,这使我们有能力拥有一个完全自定义的视频用户界面。

在视频元素中调用方法

你也可以在视频元素中调用一些方法来对其进行更多的控制,比如使用像save ,将视频保存到你的设备照片中,或者控制视频的全屏模式。

为了实现这一点,你需要创建一个对videoPlayer 的引用,并将其存储在例如useRef

import Video from 'react-native-video';
import video from '../test-video.mp4';

const MyComponent = () => {
    const videoPlayer = React.useRef();

    const goFullScreen = () => {  
        if (videoPlayer.current) {  
            videoPlayer.current.presentFullscreenPlayer();  
        }  
    };

    return (
        <Video  
            ref={ref => (videoPlayer.current = ref)}
            source={video}                  // the video file
            paused={false}                  // make it start    
            style={styles.backgroundVideo}  // any style you want
            repeat={true}                   // make it a loop
        />
    )
}

结论

React Native是一个强大的工具,因为它提供了使用React编写应用程序的可能性,这与网络上使用的非常相似。

唯一的区别是,我们不写HTML元素。然而,我们确实包括本地元素。其中一些元素已经包含在框架中,但像视频这样的元素也必须安装。

虽然视频的行为与网页类似,但开发者需要考虑构建一些功能,如全屏模式或应用最小化时恢复播放的选项。

React-native-video库为你提供了所有这些选项,这样你就可以轻松地将视频添加到你的应用中并进行定制,确保你的用户在你的应用中观看视频时有一个很好的体验!

The postAdding videos to React Native with react-native-videoappeared first onLogRocket Blog.