three.js开发全景视频播放器的现实方法

2023-11-20

业余弄弄three.js。想用three.js实现播放全景视频。研究了一段。搜索很多资料。感觉这一遍很棒。搜藏分享下。

原理:将video标签拉伸显示在three.js场景的一个球模型上,用相机在中间播放渲染。

基础:基于three.js官方案例中的全景视频播放(three.js webgl - equirectangular video panorama)

操作过程:对官方demo进行视频播放/暂停、视频进度条、音频控制、全屏等功能进行添加。

 

视频播放/暂停

function stop() {
                video.pause();
            }
function start() {
                video.play();
            }

视频进度条

    

       样式

标题

       作用:控制视频的播放点,实时显示视频播放位置

     html:

<div class="coll">
            <span name="progress">
                <b></b>
                <b></b>
                <b></b>
            </span>
</div>

    css:

.coll{position: absolute;bottom: 20px;left: 20px;width: 52%;}
    .coll span{display: block;height: 4px;width: 52%;margin-left: 2%;background-color: #505050;border-radius: 4px;margin-top: 11px;float:left;}
    .coll span b:nth-child(1){z-index:1;float:left;position:relative;width: 0%;background-color: #b4b4b4;display: block;height: 100%;border-radius: 4px;}
    .coll span b:nth-child(2){z-index:2;position:relative;float: left;width: 8px;height: 8px;background-color: white;border-radius: 8px;margin-top: -2px;margin-left: -8px;}
    .coll span b:nth-child(3){position: relative;background-color: white;display: block;height: 4px;border-radius: 4px;}

js:

var initProgressBar = function(){        //进度条相关操作
        var main_div = $(".coll");
        var timeDrag = false;   /* Drag status */
        $("span[name='progress']",main_div).mousedown(function(e) {     //进度条的按下操作
            timeDrag = true;
            updatebar(e.pageX);
        });
        $(document).mouseup(function(e) {               //松开
            if(timeDrag) {
                timeDrag = false;
                updatebar(e.pageX);
            }
        });
        $(document).mousemove(function(e) {  //鼠标移动事件
            if(timeDrag) {
                updatebar(e.pageX);
            }
        });


        var updatebar = function(x) {  //更新时间与播放条进度
            var progress = $("span[name='progress']",main_div);
            var maxduration = video.duration; //Video duraiton 返回视频长度
            var position = x - progress.offset().left; //Click pos
            var percentage = 100 * position / progress.width();

            if(percentage > 100) {
                percentage = 100;
            }
            if(percentage < 0) {
                percentage = 0;
            }
            //   更新进度条和视频时间
            $("span b:eq(0)",main_div).css('width', percentage+'%');
            video.currentTime = maxduration * percentage / 100;

        };

    };

    var initVideo = function(player){
        var main_div = $(".coll");

        video.ontimeupdate= function() {           //实时更新播放进度条和时间
            var currentPos = video.currentTime; //Get currenttime    //当前时间
            var maxduration = video.duration; //Get video duration   //总时间
            var percentage = 100 * currentPos / maxduration; //算出进度条此时的百分比
            $("span b:eq(0)",main_div).css("width",percentage+"%");
        };
        initProgressBar();
    };

使用注意事项:

  1. 1.$("span[name='progress']",main_div) 中为父节点main_div中找子节点 span[name='progress'],同时也限制方法的作用位置
  2. 2.video.οntimeupdate= function()   为video对象的方法,作用为实时返回视频对象当前的播放位置等参数。
  3. 3.该视频进度条的控制在tomcat中可正常使用,实测webstrom编辑打开时,火狐可正常使用,谷歌、搜狗进度条点击后视频播放位置置0。

音频控制

 音频控制同样使用视频控制相同的进度条,主要方法在与,音频的属性 video.volume,该属性值范围为0~1。通过进度条控制该属性大小即可。

全屏

    div的全屏与退出全屏:

                作用:将div全屏与退出全屏,一般播放器使用较多。

                html按钮:

<button  onclick="showFull();">
                全屏
            </button>
<button  onclick="delFull();">
                退出全屏
            </button>

                js调用:

function showFull(){
               var full=document.getElementById("container");
               launchIntoFullscreen(full);
            }

function delFull() {
                exitFullscreen();
            }

               全屏方法封装:

 function launchIntoFullscreen(element) {
                if(element.requestFullscreen){
                    element.requestFullscreen();
                }
                else if(element.mozRequestFullScreen) {
                    element.mozRequestFullScreen();
                }
                else if(element.webkitRequestFullscreen) {
                    element.webkitRequestFullscreen();
                }
                else if(element.msRequestFullscreen) {
                    element.msRequestFullscreen();
                }
            }

               退出全屏方法封装:

function exitFullscreen() {
                if(document.exitFullscreen) {
                    document.exitFullscreen();
                } else if(document.mozCancelFullScreen) {
                    document.mozCancelFullScreen();
                } else if(document.webkitExitFullscreen) {
                    document.webkitExitFullscreen();
                }
            }

总代码:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>three.js webgl - equirectangular video panorama</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
        <style>
            body,html{width: 100%;}

            body {background-color: #000000;margin: 0px;overflow: hidden;}
            #info {position: absolute;top: 0px; width: 100%;color: #ffffff;padding: 5px;font-family:Monospace;font-size:13px;font-weight: bold;text-align:center;}
            a {color: #ffffff;}


            /*控制器*/
            .controll{width: 900px;padding: 10px;position: absolute;bottom:10px;left:50%;margin-left: -450px;height: 20px;background: rgba(0,0,0,0.8)}

            /*按钮组*/
            .btns>button{z-index: 100;position:absolute;bottom: 5px;border: 0;background: 0;width: 30px;height: 30px;background-size: 100% 100%;padding: 0}

            /*视频控制条样式*/
            .coll{position: absolute;bottom: 17px;left: 80px;width: 500px;}
            .coll span{display: block;height: 4px;width: 100%;margin-left: 2%;background-color: #505050;border-radius: 4px;margin-top: 11px;float:left;}
            .coll span b:nth-child(1){z-index:1;float:left;position:relative;width: 0%;background-color: #b4b4b4;display: block;height: 100%;border-radius: 4px;}
            .coll span b:nth-child(2){z-index:2;position:relative;float: left;width: 8px;height: 8px;background-color: white;border-radius: 8px;margin-top: -2px;margin-left: -8px;}
            .coll span b:nth-child(3){position: relative;background-color: white;display: block;height: 4px;border-radius: 4px;}
            /*音频控制条样式*/
            .voicecoll{position: absolute;bottom: 17px;left:680px;width:150px;}
            .voicecoll span{display: block;height: 4px;width: 100%;margin-left: 2%;background-color: #505050;border-radius: 4px;margin-top: 11px;float:left;}
            .voicecoll span b:nth-child(1){z-index:1;float:left;position:relative;width: 0%;background-color: #b4b4b4;display: block;height: 100%;border-radius: 4px;}
            .voicecoll span b:nth-child(2){z-index:2;position:relative;float: left;width: 8px;height: 8px;background-color: white;border-radius: 8px;margin-top: -2px;margin-left: -8px;}
            .voicecoll span b:nth-child(3){position: relative;background-color: white;display: block;height: 4px;border-radius: 4px;}


        </style>
    </head>
    <body>
        <script src="jquery-3.1.0.min.js"></script>
        <div id="container">
            <div class="controll">
                <div class="btns">
                    <!--<button style="right: 20px;" onclick="stop()">
                        暂停
                    </button>-->
                    <button id="video_start_btn" style="left: 30px;background-image: url('img/stop.png')" onclick="start()">

                    </button>

                    <div class="coll">
                        <span name="progress">
                            <b></b>
                            <b></b>
                            <b></b>
                        </span>
                    </div>

                    <button id="video_mutedoff_btn" style="left:620px;background-image: url('img/voice.png')" onclick="mutedoff();">

                    </button>

                    <div class="voicecoll">
                        <span name="vprogress">
                            <b></b>
                            <b></b>
                            <b></b>
                        </span>
                    </div>

                    <!--全屏-->
                    <button id="video_full_btn" style="left: 860px;background-image: url('img/full.png')" onclick="showFull();">

                    </button>
                </div>
            </div>

        </div>
        <video src=""></video>
        <script src="three.js"></script>
        <script>
            /*参数*/
            /*相机、场景、渲染器*/
            var camera, scene, renderer,video,flag,flagvoice;

            var fillbool=false;

            var texture_placeholder,
            isUserInteracting = false,
            onMouseDownMouseX = 0, onMouseDownMouseY = 0,
            lon = 0, onMouseDownLon = 0,
            lat = 0, onMouseDownLat = 0,
            phi = 0, theta = 0,
            distance = 50,
            onPointerDownPointerX = 0,
            onPointerDownPointerY = 0,
            onPointerDownLon = 0,
            onPointerDownLat = 0;

            init();
            animate();

            function init() {

                var container, mesh;
                /*绑定div*/
                container = document.getElementById( 'container' );
                /*创建相机*/
                camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 1, 1100 );
                camera.target = new THREE.Vector3( 0, 0, 0 );/*相机目标*/
                /*创建场景*/
                scene = new THREE.Scene();
                /*创建一个球*/
                var geometry = new THREE.SphereBufferGeometry( 500, 60, 40 );
                // invert the geometry on the x-axis so that all of the faces point inward
                geometry.scale( - 1, 1, 1 );/*球的大小*/
                /*创建一个video*/
                video = document.createElement( 'video' );
                video.width = 640;
                video.height = 360;
                video.loop = true;
                video.muted = false;
                video.autoplay=true;
                video.src = 'mv1.mp4';
                video.setAttribute( 'webkit-playsinline', 'webkit-playsinline' );
                video.play();
                /*video.addEventListener("canplay",function() { video.currentTime = 50;});*/

                var texture = new THREE.VideoTexture( video );
                texture.minFilter = THREE.LinearFilter;
                texture.format = THREE.RGBFormat;

                var material   = new THREE.MeshBasicMaterial( { map : texture } );

                mesh = new THREE.Mesh( geometry, material );

                scene.add( mesh );

                renderer = new THREE.WebGLRenderer();
                renderer.setPixelRatio( window.devicePixelRatio );
                renderer.setSize( window.innerWidth, window.innerHeight );
                container.appendChild( renderer.domElement );

                document.addEventListener( 'mousedown', onDocumentMouseDown, false );
                document.addEventListener( 'mousemove', onDocumentMouseMove, false );
                document.addEventListener( 'mouseup', onDocumentMouseUp, false );
                document.addEventListener( 'wheel', onDocumentMouseWheel, false );

                //

                window.addEventListener( 'resize', onWindowResize, false );

            }

            function onWindowResize() {

                camera.aspect = window.innerWidth / window.innerHeight;
                camera.updateProjectionMatrix();

                renderer.setSize( window.innerWidth, window.innerHeight );

            }

            function onDocumentMouseDown( event ) {

                event.preventDefault();

                isUserInteracting = true;

                onPointerDownPointerX = event.clientX;
                onPointerDownPointerY = event.clientY;

                onPointerDownLon = lon;
                onPointerDownLat = lat;

            }

            function onDocumentMouseMove( event ) {

                if ( isUserInteracting === true ) {

                    lon = ( onPointerDownPointerX - event.clientX ) * 0.1 + onPointerDownLon;
                    lat = ( event.clientY - onPointerDownPointerY ) * 0.1 + onPointerDownLat;

                }

            }

            function onDocumentMouseUp( event ) {

                isUserInteracting = false;

            }

            function onDocumentMouseWheel( event ) {

                distance += event.deltaY * 0.05;

                distance = THREE.Math.clamp( distance, 1, 50 );

            }

            function animate() {

                requestAnimationFrame( animate );
                update();

            }

            function update() {

                lat = Math.max( - 85, Math.min( 85, lat ) );
                phi = THREE.Math.degToRad( 90 - lat );
                theta = THREE.Math.degToRad( lon );

                camera.position.x = distance * Math.sin( phi ) * Math.cos( theta );
                camera.position.y = distance * Math.cos( phi );
                camera.position.z = distance * Math.sin( phi ) * Math.sin( theta );

                camera.lookAt( camera.target );

                renderer.render( scene, camera );

            }
            /*开始/暂停*/
            function start() {
                if(video.paused==false){
                    video.pause();
                    $("#video_start_btn").css("background-image"," url('img/start.png')")
                }else{
                    video.play();
                    $("#video_start_btn").css("background-image"," url('img/stop.png')")
                }
            }
            function mutedoff(){
                if(video.muted==true){
                    video.muted=false;
                    $("#video_mutedoff_btn").css("background-image"," url('img/voice.png')")
                }else{
                    video.muted=true;
                    $("#video_mutedoff_btn").css("background-image"," url('img/voicess.png')")
                }

            }

           function showFull(){
               var full=document.getElementById("container");
               if(fillbool==false){
                   launchIntoFullscreen(full);
                   fillbool=true;
                   $("#video_full_btn").css("background-image"," url('img/fullss.png')")
               }else{
                   exitFullscreen();
                   fillbool=false;
                   $("#video_full_btn").css("background-image"," url('img/full.png')")
               }
            }


            function launchIntoFullscreen(element) {
                if(element.requestFullscreen){
                    element.requestFullscreen();
                }
                else if(element.mozRequestFullScreen) {
                    element.mozRequestFullScreen();
                }
                else if(element.webkitRequestFullscreen) {
                    element.webkitRequestFullscreen();
                }
                else if(element.msRequestFullscreen) {
                    element.msRequestFullscreen();
                }
            }

            function exitFullscreen() {
                if(document.exitFullscreen) {
                    document.exitFullscreen();
                } else if(document.mozCancelFullScreen) {
                    document.mozCancelFullScreen();
                } else if(document.webkitExitFullscreen) {
                    document.webkitExitFullscreen();
                }
            }


            //视频进度条相关操作
            var initProgressBar = function(){
                var main_div = $(".coll");
                var timeDrag = false;   /* Drag status */
                $("span[name='progress']",main_div).mousedown(function(e) {     //进度条的按下操作
                    timeDrag = true;

                    updatebar(e.pageX);
                    e.stopPropagation();
                });
                $(document).mouseup(function(e) {               //松开
                    if(timeDrag) {
                        timeDrag = false;
                        updatebar(e.pageX);
                        e.stopPropagation();
                    }
                });
                $(document).mousemove(function(e) {  //鼠标移动事件
                    if(timeDrag) {

                        updatebar(e.pageX);
                        e.stopPropagation();
                    }
                });

                //update Progress Bar control
                var updatebar = function(x) {  //更新时间与播放条进度
                    var progress = $("span[name='progress']",main_div);
                    var maxduration = video.duration; //Video duraiton 返回视频长度
                    /*alert(progress.offset().left)*/
                    var position = x - progress.offset().left; //Click pos
                    var percentage = 100 * position / progress.width();
                    /*alert(percentage)*/
                    //Check within range    检查范围内
                    if(percentage > 100) {
                        percentage = 100;
                    }
                    if(percentage < 0) {
                        percentage = 0;
                    }
                    //Update progress bar and video currenttime   更新进度条和视频时间
                    $("span b:eq(0)",main_div).css('width', percentage+'%');
                    video.currentTime = maxduration * percentage / 100;

                };

            };

            //声音进度条相关操作
            var initvoiceBar = function(){
                var main_voicediv = $(".voicecoll");
                var voicetimeDrag = false;   /* Drag status */
                $("span[name='vprogress']",main_voicediv).mousedown(function(e) {     //进度条的按下操作
                    voicetimeDrag = true;
                    voiceupdatebar(e.pageX);
                    e.stopPropagation();
                });
                $(document).mouseup(function(e) {               //松开
                    if(voicetimeDrag) {
                        voicetimeDrag = false;
                        voiceupdatebar(e.pageX);
                        e.stopPropagation();
                    }
                });
                $(document).mousemove(function(e) {  //鼠标移动事件
                    if(voicetimeDrag) {
                        voiceupdatebar(e.pageX);
                        e.stopPropagation();
                    }
                });

                //update Progress Bar control
                var voiceupdatebar = function(x) {  //更新时间与播放条进度
                    var progress = $("span[name='vprogress']",main_voicediv);
                    var maxduration = 1; //Video duraiton 返回视频长度
                    /*alert(progress.offset().left)*/
                    var position = x - progress.offset().left; //Click pos
                    var percentage = 100 * position / progress.width();
                    /*alert(percentage)*/
                    //Check within range    检查范围内
                    if(percentage > 100) {
                        percentage = 100;
                    }
                    if(percentage < 0) {
                        percentage = 0;
                    }
                    //Update progress bar and video currenttime   更新进度条和视频时间
                    $("span b:eq(0)",main_voicediv).css('width', percentage+'%');
                    video.volume = maxduration * percentage / 100;

                };
            };

            var initVideo = function(player){
                flag = true;
                flagvoice = true;

                var main_div = $(".coll");
                var main_voicediv = $(".voicecoll");

                //实时更新播放进度条和时间
                video.ontimeupdate= function() {
                    //视频进度条控制
                    var currentPos = video.currentTime; //Get currenttime    //当前时间
                    var maxduration = video.duration; //Get video duration   //总时间
                    var percentage = 100 * currentPos / maxduration; //in %
                    $("span b:eq(0)",main_div).css("width",percentage+"%");
                   //音频进度条控制
                    var currentPosvoice = video.volume; //Get currenttime    //当前时间
                    var maxdurationvoice = 1; //Get video duration   //总时间
                    var percentagevoice = 100 * currentPosvoice / maxdurationvoice; //in %
                    $("span b:eq(0)",main_voicediv).css("width",percentagevoice+"%");
                };
                initProgressBar();
                initvoiceBar();
            };

            initVideo();

        </script>
    </body>
</html>

图片文件:(图片有6张,为png白色图标)

 

样式:

three.js版本:r89

 

参考自:https://www.cnblogs.com/s313139232/p/8371295.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

three.js开发全景视频播放器的现实方法 的相关文章

  • Three.js 通过 Gui 阻止 Raycast

    我想通过光线投射选择对象 但每次我想在 Three js GUI 上选择某些内容时 Mousdown 事件都会被触发 我怎么说 如果 Gui 在对象前面 则不触发 之类的话 document addEventListener mousedo
  • 使用 OrbitControls 时锁定 x 轴旋转 - Three.js

    使用 OrbitControls 时锁定 x 轴旋转是否可行 目前我有一个挂在绳子上的圣诞星的对象模型 我希望它仅水平旋转 对于您的 OrbitControls 实例集 controls minPolarAngle Math PI 2 co
  • 将几何图形转换为 BufferGeometry

    据我了解 Geometry 存储顶点和面的 javascript 对象结构 而 BufferGeometry 仅通过 Float32Arrays 等存储原始 gl 数据 有没有什么方法可以将标准 Geometry 转换为 BufferGeo
  • 如何将 SketchUp 模型导出到 Three.js?

    我通过谷歌创建了一个模型SketchUp 我想将其导出到three js节省一些时间 因为我想使用SketchUp比three js 那么有人可以告诉我该怎么做吗 非常感谢 您可以从 SketcUp 导出 collada DAE 然后使用
  • 使用 Three.js 在片段着色器中手动选择 mipmap 的 lod

    我正在使用 Three js 中的 glsl es 编写一个基于物理的着色器 为了添加镜面全局照明 我使用内部带有 mipmap 链的立方体贴图 dds 纹理 按照 CubeMapGen 的说明进行预先计算here http seblaga
  • THREE.JS 加载 STL 网格数组

    因此 我有一个数据库 其中包含文件引用列以及对其所需的子 STL 文件的任何引用 我可以将一两个模型加载到 THREE js 查看器中 因此所有这些都可以正常工作 但是当我加载四个左右的数组时 事情开始变得毛茸茸的 分配的网格 ID 开始变
  • Three.js 支持波斯语/阿拉伯语文本

    我需要以波斯语 阿拉伯语显示一些文本 我加载了包含字符的字体 并使用 TextGeometry 在场景上创建文本 var loader new THREE FontLoader loader load B Zar Regular js fu
  • Threejs + Vanilla JS 和 React-Three-Fiber + Create-React-App 之间的颜色差异

    这已经困扰我一段时间了 为什么 React Three Fiber 中的材质颜色看起来比 Threejs 中暗淡 两种实现中的对象及其属性是相同的 Threejs 版本相同 在新引导中实施 create react app 没有额外的依赖项
  • 如何在 Three.js 中从三角面获取多边形?

    我在网上查了一下是否有人遇到同样的问题 我正在使用 Three js 我有一个 3DObject 其中可能包含孔 面是三角形的 假设我想从上面看到它 我的目标是获得一个代表顶面周长的多边形 这对我来说意味着不再有三角面 而只有 1 个多边形
  • 如何沿着简单的路径移动相机

    如何沿着简单的路径 由顶点 点数组创建 移动相机 我需要自动移动它 而不是像第一人称射击游戏那样通过键盘 鼠标事件来移动它 找了这个例子 http trijs org examples webgl geometry extrude spli
  • 星系模拟:更改点的颜色并在鼠标悬停时显示文本

    我正在尝试创建模拟 https riteshsingh github io galaxies 4673 个最近星系的位置 星系是点 我想为鼠标悬停时的点着色并加载星系的名称 我花了很多天试图实现它 我可以更改颜色以及进行基本的光线投射 但是
  • THREE.js 导入的模型不应用面部纹理

    我正在尝试导入使用 THREEJS 导出器从搅拌机导出的模型 到目前为止 模型已加载并出现在我的场景中 并且正确应用了材质 汽车应为黄色 玻璃应为透明 但它并没有将我的纹理应用到以 tga 形式保存的汽车上 如果我不将纹理包含在模型所在的服
  • 无法让 raycaster.intersectObjects() 从远处返回相交的对象

    我有一个包含几个随机数的散点图Sprite用作数据点的对象 我想检测鼠标指针 光标 和Sprite对象 我用来检测交叉点的设置如下 var projector new THREE Projector window addEventListe
  • 一次性渲染阴影

    考虑到阴影投射的成本 我想知道对于动态定位的静态对象 例如 程序城市 是否有一个功能或可能 实验性的方法可以在 Three js 中仅渲染一次阴影贴图 甚至在 webgl 中 因此 结果可以在静态对象的下一帧中免费使用 仅当物体移动时才会进
  • 将颜色渐变应用于网格上的材质 - Three.js

    我有一个 STL 文件加载到我的场景中 并将单一颜色应用于 phong 材质 我想要一种方法 将两种颜色应用于该网格物体的材质 并在 Z 轴上应用渐变效果 如下例所示 渐变花瓶 https i stack imgur com Ty9gq j
  • 在 Three.js 中获取 Object3D 的大小

    我的场景中有这个 3D 对象 var icon new THREE Object3D var iconTexture THREE ImageUtils loadTexture images icon png iconMaterial new
  • 在 Three.js 中使用多种材质来合并几何体

    我想使用 2 个网格创建一棵松树 其中 1 个用于树干 另一个用于灌木 这就是我所做的 var pine geometry new THREE Geometry var pine texture 1 THREE ImageUtils loa
  • Three.js 对象的“中心”是什么?

    当我使用 Blender 对对象进行建模时 我能够明确定义其发生平移和旋转的中心位置 当使用 Three js 对象时 我似乎没有找到等效的对象 Three js 对象是否具有定义其 中心 位置的属性 如果不是 物体的中心是如何确定的 在
  • 如何在 Three.js 场景中包含 OVRManager?

    我创建了几个 Three js Javascript 演示应用程序 正在我的新 Oculus Go 中进行试验 我正在尝试让 Go 控制器在我的应用程序中执行某些操作 根据 Oculus 开发人员中心的说法 最好的办法是将 OVRManag
  • 无面点云 (PLY) 文件的 Web 查看器

    我在尝试Three Js https github com mrdoob three js 用于通过网络查看 PLY 文件 使用这个例子 http threejs org examples webgl loader ply html作为参考

随机推荐

  • Linux内核驱动之GPIO子系统(一)GPIO的使用

    分类 Linux内核驱动 2012 10 31 21 12 162人阅读 评论 1 收藏 举报 目录 一 概述 Linux内核中gpio是最简单 最常用的资源 和 interrupt dma timer一样 驱动程序 应用程序都能够通过相应
  • Subwords Tokenizer方法介绍: BPE, Byte-level BPE, WordPiece, Unigram, SentencePiece

    参考于transformers tokenizer的文档 目录 Byte Pair Encoding BPE 1 出发点 原理 应用 Byte level BPE 2 出发点 原理 应用 WordPiece 3 原理 应用 Unigram
  • 一种踩内存的定位方法(C++)

    在嵌入式应用开发过程中 踩内存的问题常常让人束手无策 使用gdb调试工具 可以大幅加快问题的定位 不过 对于某些踩内存的问题 它的表现是间接的 应用崩溃的位置也是不固定的 这就给问题定位带来了更大的困难 笔者见过带有虚函数C 的类对象在试图
  • 2021春招已正式开启,阿里巴巴企业智能事业部内推,有意者看下文!

    前言 说一说已经拿到内推的两个朋友的面试经验 你们可以看一下准备一下 同事A阿里巴巴一面 55分钟 先介绍一下自己吧 说一下自己的优缺点 具体讲一下之前做过的项目 你觉得项目里给里最大的挑战是什么 Hashmap为什么不用平衡树 AQS知道
  • 程序员要不断学习

    2016 10 20 计算机技术的发展速度还是很快的 当个人电脑赶上10年前的超算时 我们不得不感叹硬件的发展编程开发带来了很大的影响 对世界带来了很大的影响 知识和工具的更新速度还是比较快的 这就要求程序员始终需要学习 我在知乎上看到一个
  • redis 配置与优化

    目录 一 关系数据库和非关系型数据库 二 关系型数据库和非关系型数据库区别 三 非关系型数据库产生背景 四 redis 1 概念 2 redis的优点 3 redis为什么这么快 五 redis安装与配置 一 关系数据库和非关系型数据库 关
  • Scrapy爬取图片自定义图片文件名时出现的问题

    目录 出现的问题 只下载了一张图片 图片的名称为最后一张图片的名称 但内容并不是最后一张图片的内容 在打印时 最后一张图片的相关信息出现多次 对应文件的相关信息 Items文件相关内容 Spider文件内容 Settings文件内容 Pip
  • 静态类(static class)、成员类(member class)、局部类(local class)、匿名类   (anonymous class)

    内部类定义 在一个类的内部定义一个类 内部类分为 静态类 static class 成员类 member class 局部类 local class 匿名类 anonymous class static class 作为类的静态成员存在于某
  • DDD专家张逸:构建领域驱动设计知识体系

    张逸 读完需要 5分钟 速读仅需 2 分钟 领域驱动设计专家 曾就职于 ThoughtWorks 作为 Lead Consultant 为客户提供架构设计 大数据分析 持续交付 代码质量 敏捷管理等咨询服务 著译作包括 软件设计精要与模式
  • 线性模型和非线性模型的区别,以及激活函数的作用

    线性模型和非线性模型的区别 以及激活函数的作用 线性模型和非线性模型的区别 a 线性模型可以用曲线拟合样本 线性模型可以是用曲线拟合样本 但是分类的决策边界一定是直线的 例如logistics模型 广义线性模型 将线性函数进行了一次映射 b
  • 华为OD机试(JAVA)真题 -- 数据分类

    对一个数据a进行分类 分类方法为 此数据a 四个字节大小 的四个字节相加对一个给定的值b取模 如果得到的结果小于一个给定的值c 则数据a为有效类型 其类型为取模的值 如果得到的结果大于或者等于c 则数据a为无效类型 比如一个数据a 0x01
  • 从《数学之美》中我想到的

    吴军老师作为NLP领域的专家 在 数学之美 中把各种高大上的技术介绍得如此通俗易懂 抛去了冗杂的公式 呈现出最原始的数学思想 能够把复杂的问题用最简单易懂的语言表达出来 看来吴军老师的数学功底 工程实践水平非同一般 在 数学之美 里面 谈到
  • 立创EDA(专业版)画PCB怎么开窗?

    阻焊层是开窗 助焊层是开钢网用的 大概的步骤 1 选择图层 顶层阻焊层 如果是想在顶层开窗 2 画个矩形框框 3 右击点击属性 选择顶层阻焊 4 利用3D PCB 观察 如果选择区域和有类似焊盘上的没有覆膜的管脚的那个黄铜的部分 成功了
  • 跨域与跨域访问

    什么是跨域 跨域是指从一个域名的网页去请求另一个域名的资源 比如从www baidu com 页面去请求 www google com 的资源 跨域的严格一点的定义是 只要 协议 域名 端口有任何一个的不同 就被当作是跨域 为什么浏览器要限
  • 两种接入微信小程序智能客服对话的方式

    微信小程序 此处提供两种接入微信小程序的方式 方式一 扫码将机器人绑定至指定小程序 通过小程序内的客服组件开启智能对话功能 方式二 通过小程序插件接入 方式一 后台扫码绑定 流程示意 效果展示 使用页面 小程序页面中 点击 客服按钮 官方组
  • QT 打印/输出 的 3种方法

    1 cout输出 include
  • 【复变函数】常用公式大全

    文章目录 基本公式 几个高斯的公式 其实都是留数法 留数法 一些公式 一些积分 欢迎纠错 基本公式 f z u
  • 华为5500v3多路径linux6,CentOS7 DM-Multipath+HUAWEI OceanStor存储多路径配置

    在参看了网上他人的配置 结合RedHat的技术白皮书实现后 自己亲身在CentOS7 HUAWEI OceanStore S2600T的基础上配置了一个DM Multipath存储多路径的实现 其中碰到了一些小问题和不明白的地方 书上感觉也
  • 5. TypeScript 接口

    TypeScript 接口 接口可以在面向对象编程中表示行为的抽象 也可以描述对象的形状 接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约 接口中不能含有具体的实现逻辑 1 函数接口参数 没有接口的写法 const fullNa
  • three.js开发全景视频播放器的现实方法

    业余弄弄three js 想用three js实现播放全景视频 研究了一段 搜索很多资料 感觉这一遍很棒 搜藏分享下 原理 将video标签拉伸显示在three js场景的一个球模型上 用相机在中间播放渲染 基础 基于three js官方案