美文网首页
React Native视频加字幕(内加外)

React Native视频加字幕(内加外)

作者: Volon | 来源:发表于2019-06-25 17:30 被阅读0次

直接贴代码吧:

import React from 'react';
import {View, ScrollView} from 'react-native';
import axios from "axios"
import {Header} from "../common/ItemHeader";
import Video, {TextTrackType} from 'react-native-video';
import {width,height} from "../../util/functions";
import {Text} from "react-native-elements";


let textTracks = [
    {
        title: "English CC",
        language: "en",
        type: TextTrackType.VTT,
        uri: "https://wordcreed.app/zimu.vtt"
    }
]


class VideoContainer extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            data: "",
            currentTime: 0,
        }
    }


    componentDidMount(): void {

        // 时间转换并计算
        CreateTime = (base) => {
            let ms = parseInt(base.split(".")[1])
            let time = base.split(".")[0].split(":")
            let h = parseInt(time[0])
            let min = parseInt(time[1])
            let s = parseInt(time[2])
            return min * 60 + s + ms / 1000
        }
        // 获取在线字幕并处理
        axios.get("https://wordcreed.app/zimu.vtt").then(res => {
            let lryAry = res.data.split(/[\r\n]/)
            lryAry.splice(0, 1)

            let Data = []
            lryAry.forEach((val, index) => {
                if (val === "") {
                    lryAry.splice(index, 1)
                }
            })
            for (let i = 0; i < lryAry.length; i++) {
                if (lryAry[i] === "") {
                    lryAry.splice(i, 1)
                }
                if (/^[0-9]+$/.test(lryAry[i])) {
                    lryAry.splice(i, 1)
                }
                // 处理本句开始与结束的时间
                let timeList = lryAry[i].indexOf('-->')
                if (timeList !== -1) {
                    let fist = lryAry[i].split("-->")[0]
                    let last = lryAry[i].split("-->")[1]

                    let item = {
                        FirstTime: CreateTime(fist),
                        LastTime: CreateTime(last),
                        en: lryAry[i + 1],
                        cn: lryAry[i + 2]
                    }
                    Data.push(item)

                }
            }

            Data.splice(Data.length-1, 1)
            this.setState({data: Data})
        })
    }


    CreateTheTxt = (data, currentTime) => {
        let Txt = []
        for (let i = 0; i < data.length; i++) {
            if (data[i].FirstTime< currentTime && data[i].LastTime > currentTime) {
                this._scrollView.scrollTo({x: 0, y: (50 * i), animated: true});
            }
            Txt.push(<View key={i} style={{width: width, height: 50, justifyContent: "center", alignItems: "center"}}>
                <Text
                    style={{color: data[i].FirstTime < currentTime && data[i].LastTime > currentTime ? "red" : null}}>{data[i].en}</Text>
                <Text
                    style={{color: data[i].FirstTime < currentTime && data[i].LastTime > currentTime ? "red" : null}}>{data[i].cn}</Text>
            </View>)

        }
        return Txt
    }


    render() {
        let {currentTime, data} = this.state
        return (
            <View style={{flex: 1}}>
                <Header navigation={this.props.navigation} context={"Video"}/>
                <Video
                    style={{
                        width: width - 10,
                        height: 200,
                        margin: 5,
                        marginBottom: 0
                    }}
                    source={require('../../img/video.mp4')}
                    controls={true}
                    paused={true}
                    onProgress={(data) => {
                        this.setState({currentTime: data.currentTime.toFixed(3)})
                    }}
                    textTracks={textTracks}
                    selectedTextTrack={{
                        type: "title",
                        value: "English CC"
                    }}
                />
                <ScrollView
                    style={{width: width, height: height-340}}
                    ref={(scrollView) => {
                        this._scrollView = scrollView
                    }}>
                    {this.state.data ? this.CreateTheTxt(data, Number(currentTime)) : null}
                </ScrollView>
            </View>
        )
    }
}

export default VideoContainer

效果图:


WX20190625-172743@2x.png

相关文章

  • React Native视频加字幕(内加外)

    直接贴代码吧: 效果图:

  • 剪辑大神都在用的加字幕神器,你知道嘛!

    ​给视频加字幕,是一个苦逼的活儿。相信很多做视频的小伙伴,对加字幕“深恶痛绝”,拍视频 30分钟,加字幕两小时,搞...

  • 给视频加字幕

    好久没做视频了,十多年前我做视频那会,做字幕是件很费劲的事,需要在PR中一句一句的敲击,然后拖动到时间轴的合适位置...

  • React Native加阴影shadow

    React Native加阴影shadow,主要用到了组件react-native-shadow。 安装步骤1:y...

  • ReactNative系列【视频支持】

    项目需要实现简单视频编辑(如合并、划线、字幕等),视频播放功能。 项目使用React Native + expo,...

  • react native 常用命令

    注意:在 Windows 中 gradlew 前面要加 ./ 新建 react native 项目react-na...

  • React Native加虚线

    介绍两种加虚线的方法 1.组件方法: 使用: backgroundColor-->虚线颜色,width-->虚线宽...

  • AE视频加字幕回顾

    1.安装软件 2.AE基础教程 3.加字幕 4.剪切音视频 5.渲染导出 6.压缩视频 7.剪切视频为10s 8....

  • PR给视频加字幕

    1、将录好的MP4拖入PR中,若有必要,在序列-序列设置中修改画布大小【从四周裁切】 2、准备一个txt文件,第一...

  • FFmpeg滤镜(8)

    FFmpeg为视频加字幕 为视频添加字幕的方式有很多种,大概可以分为:1、将字幕编码进视频流中。2、在封装容器中加...

网友评论

      本文标题:React Native视频加字幕(内加外)

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