第80篇 webrtc一对一研究(九)及php

关键词:webrtc数据回调机制,webrtc传图片机制,php比较字符串

一、webrtc

1.1 梳理老师回放代码

1首先有一个按钮,用于新建白板,如下:

<buttonid="btn-getDataURL1" style="width:220px;font-size:36px;">新建白板</button></span>

2这个按钮有一个单击事件:

          $('#btn-getDataURL1').click( function(){

               arr_base64_img_i =$("#picWrap").children().length;

        saveCanvas(globelId);

            designer.undo('all');

            globelId = null;

          });

单击会执行一个函数,第一句:

a) arr_base64_img_i= $("#picWrap").children().length;

这一句:计算放回放图片的div内已经放了几张图片。

注:会看到两个问题,一是窗口记录不连续:01245678;二是出现了很多空白页。

b) saveCanvas(globelId)(2-1);

  这一句调用一个函数,作用是保存图像到下方。

c) designer.undo('all');

   这一句用于清空白板,就是说,老师写完一板,保存到下方之后,要清空白板。

d)globelId=null;

  这一句,置变量globelId为空。

3)在 2)中调用了一个函数saveCanvas(globelId)(函数2-1),代码如下:

          function saveCanvas(imgId){

               designer.saveImg('image/png',imgId,function(dataURL,imgId) {

                getArrBase64(dataURL,imgId);

                $(".tea_base64").off("click");

            $(".tea_base64").on("click",onImgClick);

            });

          }

这个函数需要传入一个参数imgId:

a) designer.saveImg('image/png',imgId,function(dataURL,imgId) {

  这一句调用了一个函数designer.saveImg()(函数3-1),用于保存图像。

b) getArrBase64(dataURL,imgId);

  在a)中调用了另一个函数getArrBase64()(函数3-2),用于获取一个图片的base64位码。

c) $(".tea_base64").off("click");

  这一句的作用是:解绑click事件。

d) $(".tea_base64").on("click",onImgClick);

  这一句的作用是,给类.tea_base64绑定click事件,并且调用一个函数onImgClick(函数3-3)。

4在3)中,引入了三个函数designer.saveImg()(函数3-1)、getArrBase64()(函数3-2)、onImgClick(函数3-3),分别分析:

  4-1) designer.saveImg()

     designer.saveImg= function(format,imgId,callback) {

       saveImgListener = callback;

       if (!designer.iframe) return;

       designer.postMessage({

           saveImg: true,

           format: format,

           imgId:imgId

       });

      };

      这个函数需要传三个参数format,imgId,callback:

a)saveImgListener = callback;

  这一句用于回传。

b)if (!designer.iframe) return;

 这一句说明,如果designer.iframe(函数4-1-1)不成立,就返回。

c) designer.postMessage({(函数4-1-2

   这一句是webrtc中用于消息传递,它需要三个参数saveImg,format,imgId,应对其分别设置。

  4-2) getArrBase64()

  function getArrBase64(dataURL,imgId) {

             if(imgId!= null && $("#arr_base64_img"+imgId).length>0){

           $("#arr_base64_img"+imgId).attr("src",  dataURL);

             }else{

            varpicWrap=document.getElementById('picWrap');

            picWrap.innerHTML+=' <img  id= "arr_base64_img'+arr_base64_img_i+'"class="tea_base64" style=" border:1pxsolid red; width:100px; height:150px;" src="'+dataURL +'"'+"<br>";

        }

};

这个函数getArrBase64需要两个参数:dataURL及imgId:

a) if(imgId != null &&$("#arr_base64_img"+imgId).length>0){

        $("#arr_base64_img"+imgId).attr("src",  dataURL);

  }

 这个判断是说如果imgId非空,并且图片id存在,就把执行if里面的内容,这一句话是说:如果老师点下面的回放图片,修改之后,点保存的话,图像id存在,就替换原来的那张图片。里面的语句,就是替换原有的dataURL,.attr就是返回标签属性,本程序中,就是把dataURL赋给属性src.

b) else{

            varpicWrap=document.getElementById('picWrap');

            picWrap.innerHTML+=' <img  id= "arr_base64_img'+arr_base64_img_i+'"class="tea_base64" style=" border:1pxsolid red; width:100px; height:150px;" src="'+dataURL +'"'+"<br>";

        }

上述几句话是说:如果老师保存的图像id不存在,就追加到后面去。

4-3) onImgClick()

       function onImgClick(){

               if(globelId == null){

                   arr_base64_img_i =$("#picWrap").children().length;

               }

           saveCanvas(globelId);

           designer.undo('all');

           globelId = this.id.substr(14);

           designer.addImgByUrl(this.src,true);

       }

a)          if(globelId == null){

                   arr_base64_img_i =$("#picWrap").children().length;

               }

 如果globelId为空,则会重新计算arr_base64_img_i的长度,这是导致arr_base64_img_i不存在的原因。

 b) saveCanvas(globelId);

 保存图像

 c) globelId = this.id.substr(14);

 通过截取的方式,获得globelId的值。

d) designer.addImgByUrl(this.src,true);

 调用函数designer.addImgByUrl()(函数4-3-1),用于把下面的回放图片展示到白板上。

这个函数onImgClick()的作用是,点击下面的图像,会先保存白板上的内容到一个新的图像。

5 在4中),用到了三个函数designer.iframe(函数4-1-1)、designer.postMessage({(函数4-1-2)、designer.addImgByUrl()(函数4-3-1),分别进行分析如下:

5-1designer.iframe

designer.iframe= document.createElement('iframe');

  这个好像是一个变量,具体作用还不明了。

5-2designer.postMessage

    designer.postMessage = function(message) {

        if (!designer.iframe) return;

 

        message.uid = designer.uid;

        designer.iframe.contentWindow.postMessage(message,'*');

};

这个函数用于传递消息,用于消息回传。

 

5-3designer.addImgByUrl()

    designer.addImgByUrl =function(url,restore){

        if (!designer.iframe) return;

              

             designer.postMessage({

            addImgByUrl: true,

            url: url,

                            restore :restore?restore:false

        });

}

这个函数用于把base64位码,放到白板上。

1.2 把老师回放代码放到正式服上并对bug进行调试,增加理解

bug1:放到正式服上,arr_base64_img_i为空。

结果:

这一步是对的,因为在本地测,也没值,本来,当时div中的,还没生成图片,不可能有值。

bug2:

这两个警告没有弹出来,在本地就能弹出来。说明函数designer.saveImg()出错了。

imgId没有传进去:在widget.min.js中加入如下程序段:

另外:canvas-designer-widget.js中两个地方也需要改 一下:

二、php

2.1 比较字符串

1)strcmp()

两个字符串进行比较,如果字符串1和字符串2相等,则返回0;

                    如果字符串1<字符串2,则返回-1;

                    如果字符串1>字符串2,则返回1;

看个例子:

注:就是说如果字符串1,仅是长度小于字符串2,则返回-1;如果能从前到后比较出字符串1比字符串2小多少个,则返回具体的数目。要想比较时不区分大小写,可以用strcasecmp()进行比较。要想按自然数进行比较,可以用strnatcmp().

2) strncmp()

这个函数主要对数据进行比较,并且可以指定比较的位数,看个例子:

注:可以用于数据,也可以用于字符串进行比较。

3)similar_text()

比较两个字符串的相似度,看个例子:

注:它会比较两个字符串中,相同的字母有几个。这个函数可以有最三个参数$v,它会返回两个字符串相似度的百分比。看个例子:

上述字符串:baidu和baiDu都有5个字符,有4个字符是一样的,所以有80%的相似度。

2016年10月26日星期三

 

网页视频开发 webrtc ;(function () { var logger = { log: function (){}, warn: function (){}, error: function (){} }; // normalize environment var RTCPeerConnection = null, getUserMedia = null, attachMediaStream = null, reattachMediaStream = null, browser = null, webRTCSupport = true; if (navigator.mozGetUserMedia) { logger.log("This appears to be Firefox"); browser = "firefox"; // The RTCPeerConnection object. RTCPeerConnection = mozRTCPeerConnection; // The RTCSessionDescription object. RTCSessionDescription = mozRTCSessionDescription; // The RTCIceCandidate object. RTCIceCandidate = mozRTCIceCandidate; // Get UserMedia (only difference is the prefix). // Code from Adam Barth. getUserMedia = navigator.mozGetUserMedia.bind(navigator); // Attach a media stream to an element. attachMediaStream = function(element, stream) { element.mozSrcObject = stream; element.play(); }; reattachMediaStream = function(to, from) { to.mozSrcObject = from.mozSrcObject; to.play(); }; // Fake get{Video,Audio}Tracks MediaStream.prototype.getVideoTracks = function() { return []; }; MediaStream.prototype.getAudioTracks = function() { return []; }; } else if (navigator.webkitGetUserMedia) { browser = "chrome"; // The RTCPeerConnection object. RTCPeerConnection = webkitRTCPeerConnection; // Get UserMedia (only difference is the prefix). // Code from Adam Barth. getUserMedia = navigator.webkitGetUserMedia.bind(navigator); // Attach a media stream to an element. attachMediaStream = function(element, stream) { element.autoplay = true; element.src = webkitURL.createObjectURL(stream); }; reattachMediaStream = function(to, from) { to.src = from.src; }; // The representation of tracks in a stream is changed in M26. // Unify them for e
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值