WebRTC音视频开发:React+Flutter+Go实战
上QQ阅读APP看书,第一时间看更新

4.7 视频滤镜

视频滤镜主要是给视频加上特殊效果,如模糊、灰度、反转等。WebRTC的视频滤镜是通过设置video标签的fiter属性来达到不同的滤镜效果的。常用属性如下所示。

·none:没有滤镜。

·blur:模糊。

·grayscale:灰度。

·invert:反转。

·sepia:深褐色。

接下来通过一个示例来展示滤镜的使用效果。具体步骤如下所示。

步骤1 打开h5-samples工程下的styles/css目录,添加video-filter.scss样式文件,添加上述几种滤镜属性。


//没有滤镜
.none {
    -webkit-filter: none;
    filter: none;
}
//模糊
.blur {
    -webkit-filter: blur(3px);
    filter: blur(3px);
}
//灰度
.grayscale {
    -webkit-filter: grayscale(1);
    filter: grayscale(1);
}
//反转
.invert {
    -webkit-filter: invert(1);
    filter: invert(1);
}
//深褐色
.sepia {
    -webkit-filter: sepia(1);
    filter: sepia(1);
}

步骤2 打开src目录并添加VideoFilter.jsx文件。添加约束条件,启用视频并禁用音频,然后根据约束获取视频。获取视频后将视频渲染至视频对象上。大致处理代码如下所示。


const constraints = {
    //禁用音频
    audio: false,
    //启用视频
    video: true
};

//根据约束获取视频流
navigator.mediaDevices.getUserMedia(constraints)

...

//获取视频成功
handleSuccess = (stream) => {
    ...
    //将视频源指定为视频流
    video.srcObject = stream;
}

步骤3 添加下拉列表框,根据选中的值来设置video的样式,从而达到设置video的滤镜的目的。处理代码如下所示。


handleChange = (value) => {
    //设置滤镜
    video.className = value;
}

步骤4 将video-filter.scss文件引入VideoFilter.jsx里,然后在src目录下的App.jsx及Samples.jsx里加上链接及路由绑定,这可参考第3章。完整的代码如下所示。


import React from "react";
import { Select } from "antd";
import '../styles/css/video-filter.scss';

const { Option } = Select;

//视频
let video;

/**
 * 视频滤镜示例
 */
class VideoFilter extends React.Component {
    componentDidMount() {
        //获取video对象
        video = this.refs['video'];
        //约束条件
        const constraints = {
            //禁用音频
            audio: false,
            //启用视频
            video: true
        };
        //根据约束获取视频流

        navigator.mediaDevices.getUserMedia(constraints).then(this.handleSuccess).
catch(this.handleError);
    }

    //获取视频成功
    handleSuccess = (stream) => {
        window.stream = stream;
        //将视频源指定为视频流
        video.srcObject = stream;
    }

    //错误处理
    handleError(error) {
        console.log('navigator.MediaDevices.getUserMedia error: ', error.message, 
error.name);
    }

    //下拉列表框中的选项改变
    handleChange = (value) => {
        console.log(`selected ${value}`);
        //设置滤镜
        video.className = value;
    }

    render() {

        return (
            <div className="container">
                <h1>
                    <span>视频滤镜示例</span>
                </h1>
                {/* 视频渲染 */}
                <video ref='video' playsInline autoPlay></video>
                {/* 滤镜属性选择 */}
                <Select defaultValue="none" style={{ width: '100px' }} onChange= 
{this.handleChange}>
                    <Option value="none">没有滤镜</Option>
                    <Option value="blur">模糊</Option>
                    <Option value="grayscale">灰度</Option>
                    <Option value="invert">反转</Option>
                    <Option value="sepia">深褐色</Option>
                </Select>
            </div>
        );
    }
}
//导出组件
export default VideoFilter;

运行示例工程,打开“视频滤镜”示例,选择不同的滤镜属性,例如模糊效果,如图4-7所示。

图4-7 视频滤镜效果(模糊)