webrtc采集视频并设置视频滤镜效果

滤镜介绍

浏览器中设置视频滤镜使用的是CSS filter,不同浏览器中设置特效的关键字不一样,Chrome、Safari、Opera、Filefox等用的是-webkit-filter,IE使用的filter。(对于百分比的滤镜参数可以是百分比也可以是小数。)

滤镜 设置方式 说明
默认 none 默认值,没有效果
高斯模糊 blur(px) 给图像设置高斯模糊。设置屏幕上以多少像素融在一起, 所以值越大越模糊;如果没有设定值,则默认是0;这个参数可设置css长度值,但不接受百分比值。
明暗度 brightness(%) 如果值是0%,图像会全黑。值是100%,则图像无变化。其他的值对应线性乘数效果。值超过100%也是可以的,图像会比原来更亮。如果没有设定值,默认是1。
对比度 contrast(%) 值是0%的话,图像会全黑。值是100%,图像不变。值可以超过100%,意味着会运用更低的对比。若没有设置值,默认是1。
阴影 drop-shadow(h-shadow v-shadow blur spread color) 设置一个阴影效果,h-shadow(必须)设置阴影水平偏移量,为负时阴影出现在元素左边;v-shadow(必须)设置阴影水平偏移量,为负时阴影出现在元素上边;blur(可选)设置模糊度,值越大,越模糊,则阴影会变得更大更淡,不允许负值 若未设定,默认是0 (则阴影的边界很锐利);spread(可选)设置阴影大小,正值会使阴影扩张和变大,负值会是阴影缩小,若未设定,默认是0 (阴影会与元素一样大小);color(可选)设置颜色,若省略则阴影是透明的。
灰度 grayscale(%) 将视频图像转换为灰度图像,值为100%则完全转为灰度图像,值为0%图像无变化。值在0%到100%之间,则是效果的线性乘子。若未设置,值默认是0。
色相旋转 hue-rotate(deg) 给视频图像应用色相旋转。deg设定图像会被调整的色环角度值。值为0则图像无变化。若值未设置,默认值是0deg。该值虽然没有最大值,超过360deg的值相当于又绕一圈。
反转 invert(%) 反转视频图像,100%是完全反转。值为0%则无变化。值在0%和100%之间,则是效果的线性乘子。 若值未设置,值默认是0。
透明度 opacity(%) 转化视频的透明程度。值为0%则是完全透明,值为100%则图像无变化。值在0%和100%之间, 若值未设置,值默认是1。
饱和度 saturate(%) 转换视频饱和度,值为0%则是完全不饱和,值为100%则图像无变化。超过100%的值是允许的,则有更高的饱和度。 若值未设置,值默认是1。
深褐色 sepia(%) 将视频转换为深褐色,值为100%则完全是深褐色的,值为0%图像无变化。值在0%到100%之间,若未设置,值默认是0;

代码实现

首先通过nodejs搭建web服务器,搭建好后将服务启动。然后在public目录下新建一个filter目录,在filter目录下创建一个index.html文件,代码内容如下(各个滤镜效果的参数值是写死的,想看其他参数值的效果直接在代码中更改后刷新看效果)。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>webrtc设置视频滤镜</title>
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <script type="text/javascript" src="https://webrtc.github.io/adapter/adapter-latest.js"></script>

    <style>
            .none {
                -webkit-filter: none;
                filter: none;
            }

            .blur {
                -webkit-filter: blur(4px);
                filter: blur(4px);
            }

            .brightness {
                -webkit-filter: brightness(0.30);
                filter: brightness(0.30);
            }

            .contrast {
                -webkit-filter: contrast(180%);
                filter: contrast(180%);
            }

            .grayscale {
                -webkit-filter: grayscale(100%);
                filter: grayscale(100%);
            }

            .huerotate {
                -webkit-filter: hue-rotate(180deg);
                filter: hue-rotate(180deg);
            }

            .invert {
                -webkit-filter: invert(100%);
                filter: invert(100%);
            }

            .opacity {
                -webkit-filter: opacity(50%);
                filter: opacity(50%);
            }

            .saturate {
                -webkit-filter: saturate(7);
                filter: saturate(7);
            }

            .sepia {
                -webkit-filter: sepia(100%);
                filter: sepia(100%);
            }

            .shadow {
                -webkit-filter: drop-shadow(8px 8px 10px green);
                filter: drop-shadow(8px 8px 10px green);
            }

        </style>
</head>
<body>
    <!-- playsinline表示直接在浏览器内播放 -->
    <video autoplay playsinline id="player"></video>

    <div>
        <label>滤镜:</label>
        <select id="filter">
            <option value="none">无</option>
            <option value="blur">高斯模糊</option>
            <option value="brightness">明暗度</option>
            <option value="contrast">对比度</option>
            <option value="grayscale">灰度</option>
            <option value="huerotate">色相旋转</option>
            <option value="invert">反转</option>
            <option value="opacity">透明度</option>
            <option value="saturate">饱和度</option>
            <option value="sepia">深褐色</option>
            <option value="shadow">阴影</option>
        </select>
    </div>

    <script type="text/javascript" src="js/client.js"></script>
</body>
</html> 

如果要使用多个滤镜,每个滤镜使用空格分隔,要注意不同的顺序会产生不同的效果。

// 同时使用多个滤镜示例
.myfilter {
    -webkit-filter: contrast(200%) brightness(150%); 
    filter: contrast(200%) brightness(150%);
}

然后在filter目录下新建一个js目录,在js目录下创建一个client.js文件,代码内容如下:

'use strict'

const player = $("#player")[0];
const filterSelect = $("#filter")[0];

start();

// 选择不同的滤镜效果
filterSelect.onchange = function(){
    player.className = filterSelect.value;
}

function start(){
    if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
        console.log('不支采集音视频数据!');
    }else{
        // 采集音视频数据
        var constrants = {
            video:true,
            audio:true
        };
        navigator.mediaDevices.getUserMedia(constrants).then(gotMediaStream).catch(handleError);
    }
}

// 采集音视频数据成功时调用的方法
function gotMediaStream(stream){
    
    player.srcObject = stream;
}

// 采集音视频数据失败时调用的方法
function handleError(err){
    console.log(err.name+':'+err.message);
}

然后打开浏览器在地址栏输入https://192.168.20.242:8081/filter/index.html,如果是第一次运行,会弹出摄像头和麦克风的授权弹框,允许就可以了。通过下拉框选择不同的选项可以查看不同的滤镜效果。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,168评论 0 3
  • 有哪3个工具或者方法是极大程度提高你的工作效率的利器? 【三】个工具 1.印象笔记,我可以自由的将一些知识收集、整...
    FenbyYY阅读 184评论 0 2
  • 《美国传教士与晚清中国现代化:近代基督教新教传教士在华在华社会文化和教育活动研究》之最后一章:传教士对晚清中国现代...
    劳拉很忙阅读 142评论 0 0
  • 明月别枝惊鹊,清风半夜鸣蝉。稻花香里说丰年,听取蛙声一片。 七八个星天外,两三点雨山前。旧时茅店社林边,路转溪桥忽见。
    史介鸿阅读 372评论 0 0
  • 今天朋友圈看到一篇文章《你买过的东西,藏着你的气质》,篇头讲的是姑娘男朋友送自己一只香奈儿的包包拿出去被同事说成假...
    文小沫阅读 1,736评论 0 0