Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 同时显示视频元素的多个帧_Javascript_Glsl_Webgl_Three.js - Fatal编程技术网

Javascript 同时显示视频元素的多个帧

Javascript 同时显示视频元素的多个帧,javascript,glsl,webgl,three.js,Javascript,Glsl,Webgl,Three.js,一些背景:这里的图形新手,刚刚用mrdoob的优秀three.js在浏览器中体验了3D世界。我打算尽快完成所有的测试:) 我想知道一个人将如何大致重新创建类似于: 我对Yooouube如何工作的天真理解如下: 创建大量位图数据(大于任何合理的浏览器窗口大小) 根据目标视频帧的宽度/高度确定所需的行/列数(跨整个BitmapData平面,而不仅仅是可见区域) 将像素从最近的视频帧复制到BitmapData上的某个位置(基于移动方向) 迭代BitmapData中的每个单元格,从其前面的单元格复制

一些背景:这里的图形新手,刚刚用mrdoob的优秀three.js在浏览器中体验了3D世界。我打算尽快完成所有的测试:)


我想知道一个人将如何大致重新创建类似于:

我对Yooouube如何工作的天真理解如下:

  • 创建大量位图数据(大于任何合理的浏览器窗口大小)
  • 根据目标视频帧的宽度/高度确定所需的行/列数(跨整个BitmapData平面,而不仅仅是可见区域)
  • 将像素从最近的视频帧复制到BitmapData上的某个位置(基于移动方向)
  • 迭代BitmapData中的每个单元格,从其前面的单元格复制像素
  • 以相反方向滚动整个位图数据,以创建具有Zoetrope类型效果的移动错觉
  • 我想在WebGL中这样做,而不是使用画布,这样我就可以利用着色器的后处理(噪声和颜色通道分离来模拟色差)

    以下是我目前拥有的屏幕截图:

    • 将三个视频(相同的视频,但分为R、G和B通道)绘制到画布2D上下文中。每个视频都会稍微偏移,以伪造色差外观
    • 将在Three.JS中创建一个纹理,该纹理引用此画布。此纹理将在每个绘制周期更新
    • 在Three.JS中创建着色器材质,该材质链接到片段着色器(创建噪波/扫描线)
    • 然后将该材质应用于多个三维平面
    这对于显示单帧视频来说效果很好,但我想看看是否可以一次显示多帧而不需要添加额外的几何体

    完成这项任务的最佳方式是什么?有什么概念需要我进一步详细研究吗?

    
    
    <html>
        <body>
            <script>
    
                var video = document.createElement( 'video' );
                video.autoplay = true;
                video.addEventListener( 'loadedmetadata', function ( event ) {
    
                    var scale = 0.5;
                    var width = video.videoWidth * scale;
                    var height = video.videoHeight * scale;
                    var items_total = ( window.innerWidth * window.innerHeight ) / ( width * height );
    
                    for ( var i = 0; i < items_total - 1; i ++ ) {
    
                        var canvas = document.createElement( 'canvas' );
                        canvas.width = width;
                        canvas.height = height;
    
                        canvas.context = canvas.getContext( '2d' );
                        canvas.context.scale( scale, scale );
    
                        document.body.appendChild( canvas );
    
                    }
    
                    setInterval( function () {
    
                        var child = document.body.insertBefore( document.body.lastChild, document.body.children[ 1 ] ); // children[ 0 ] == <script>
                        child.context.drawImage( video, 0, 0 );
    
                    }, 1000 / 30 );
    
                }, false );
                video.src = 'video.ogv';
    
            </script>
        </body>
    </html>
    
    var video=document.createElement('video'); video.autoplay=true; video.addEventListener('loadedmetadata',函数(事件){ var标度=0.5; 变量宽度=video.videoWidth*比例; var高度=video.videoHeight*刻度; var items_total=(window.innerWidth*window.innerHeight)/(width*height); 对于(变量i=0;i
    
    var video=document.createElement('video');
    video.autoplay=true;
    video.addEventListener('loadedmetadata',函数(事件){
    var标度=0.5;
    变量宽度=video.videoWidth*比例;
    var高度=video.videoHeight*刻度;
    var items_total=(window.innerWidth*window.innerHeight)/(width*height);
    对于(变量i=0;i
    哦,我刚读了一部分,说你想用WebGL做后期处理。嗯,我认为这应该是一个很好的基础。同样的技巧:每一帧只更新一个纹理,然后重新交换所有平面。我想我肯定是想错了——我希望找到一个解决方案,可以包含在一个着色器材质中,然后应用于一个平面几何体,就是这样。(…这可能吗?)我将尝试使用您提供的作为基础,并使用多个平面来代替。谢谢你的帮助。@RobinPyon是的,这是可能的。哦,我刚读了那部分,说你想要WebGL做后期处理。嗯,我认为这应该是一个很好的基础。同样的技巧:每一帧只更新一个纹理,然后重新交换所有平面。我想我肯定是想错了——我希望找到一个解决方案,可以包含在一个着色器材质中,然后应用于一个平面几何体,就是这样。(…这可能吗?)我将尝试使用您提供的作为基础,并使用多个平面来代替。谢谢你的帮助。@RobinPyon是的,这是可能的。