SuperMap WebGL视频投放

一、streamedian配置

首先参考如下链接配置streamedian,
https://blog.csdn.net/u014547027/article/details/102521597?spm=1001.2014.3001.5501
确保http://127.0.0.1:8088/地址能播放RTSP视频流,RTSP地址比如:
rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov

二、WebGL视频投放

视频投放基于该示例代码进行更改http://support.supermap.com.cn:8090/webgl/examples/webgl/editor.html#RTSP
更改后的代码把streamedian.js替换为了free.player.1.8.4.js,也做了部分其它更改,关注以下代码的第17行、18行、257行,282-284行,290-292行。free.player.1.8.4.js文件来自于WS RTSP Proxy Server的安装目录,如C:\Program Files\Streamedian\WS RTSP Proxy Server\Example\free.player.1.8.4.js

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
    <title>RTSP视频投放</title>
    <link href="../../Build/Cesium/Widgets/widgets.css" rel="stylesheet">
    <link href="./css/pretty.css" rel="stylesheet">
    <script src="./js/echarts.min.js"></script>
    <script src="js/polyfill.js"></script>
    <script src="./js/jquery.min.js"></script>
    <script src="./js/slider.js"></script>
    <script type="text/javascript" src="http://www.supermapol.com/earth/Build/Cesium/Cesium.js"></script>
    <script src="./js/config.js"></script>
<!--    <script src="./js/streamedian.js"></script>-->
    <script src="./js/free.player.1.8.4.js"></script>
    <style>
        #trailer {
            width: 720px;
        }
    </style>
</head>

<body>
<div id="cesiumContainer"></div>
<div id="toolbar" class="param-container tool-bar">
    <button type="button" id="active" class="button black">视频投放</button>
    <button type="button" id="clear" class="button black">清除</button><br />
    <input type="checkbox" id="visibleLine" checked>
    <b>视频投放线</b>
    <video id="trailer" style="visibility: hidden;position:absolute;top:0px;left:0px;width: 200px;height:200px;" autoplay loop crossorigin controls>
        <source src="rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov" type="application/x-rtsp">
    </video>
    <div style="margin: 10px 0px;">
        <b>宽度:</b>
        <input type="number" id="horizontal" min="1" step="1" value="20">
    </div>
    <div style="margin: 10px 0px;">
        <b>高度:</b>
        <input type="number" id="vertical" min="1" step="1" value="10">
    </div>
    <div style="margin: 10px 0px;">
        <b>距离:</b>
        <input type="number" id="distance" min="100" step="1" value="200">
    </div>
</div>
</div>
<div style="position: absolute;right: 20px; top: 120px;">
    <div id="msChart" style="width: 300px;height: 150px"></div>
</div>
<div style="position: absolute;right: 20px; top: 320px;">
    <div id="fpsChart" style="width: 300px;height: 150px"></div>
</div>

<script type="text/javascript">
    /*示范代码说明:
     *本示范程序为RTSP视频投放案列
     *
     *主要涉及接口:
     * ProjectionImage
     * DrawHandler
     *
     * 示范代码:
     */
    function onload(Cesium) {
        var viewer = new Cesium.Viewer('cesiumContainer');
        viewer.imageryLayers.addImageryProvider(new Cesium.BingMapsImageryProvider({
            url: 'https://dev.virtualearth.net',
            mapStyle: Cesium.BingMapsStyle.AERIAL,
            key: URL_CONFIG.BING_MAP_KEY
        }));
        var scene = viewer.scene;
        var msData = [];
        var fpsData = [];
        var date = [];
        var step = 0;
        var myDate = new Date();
        var msChart = echarts.init(document.getElementById('msChart'));
        var fpsChart = echarts.init(document.getElementById('fpsChart'));
        scene.debugShowFramesPerSecond = true;
        scene.shadowMap.darkness = 1.275; //设置第二重烘焙纹理的效果(明暗程度)
        scene.skyAtmosphere.brightnessShift=0.4;  //修改大气的亮度
        scene.hdrEnabled = false;
        scene.sun.show = false;
        // 01设置环境光的强度-新处理CBD场景
        scene.lightSource.ambientLightColor = new Cesium.Color(0.65, 0.65, 0.65, 1);
        // 添加光源
        var position1 = new Cesium.Cartesian3.fromDegrees(116.261209157595,  39.3042238956531, 480);
        //光源方向点

        var targetPosition1 = new Cesium.Cartesian3.fromDegrees(116.261209157595, 39.3042238956531,430);
        var dirLightOptions = {
            targetPosition: targetPosition1,
            color: new Cesium.Color(1.0, 1.0, 1.0, 1),
            intensity: 0.55
        };
        directionalLight_1 = new Cesium.DirectionalLight(position1, dirLightOptions);
        scene.addLightSource(directionalLight_1);
        setInterval(function() {
            if(step <= 6) {
                var ms = document.getElementsByClassName("cesium-performanceDisplay-ms")[0].innerHTML;
                msData[step] = parseFloat(ms.substring(0, ms.length - 3));
                var fps = document.getElementsByClassName("cesium-performanceDisplay-fps")[0].innerHTML
                fpsData[step] = parseFloat(fps.substring(0, fps.length - 4));
                date[step] = myDate.getMilliseconds();
                step += 1;
            } else {
                step = 0;
            }
        }, 200);
        setInterval(function() {
            msChart.setOption({
                title: {
                    text: '',
                    subtext: 'MS',
                    left: 'right',
                    subtextStyle: {

                    }
                },
                xAxis: {
                    type: 'category',
                    axisLabel: {
                        show: true,
                        textStyle: {
                            color: '#fff'
                        }
                    },
                    data: ['', '', '', '', '', '', '']
                },
                yAxis: {
                    type: 'value',
                    axisLabel: {
                        show: true,
                        textStyle: {
                            color: '#fff'
                        }
                    },

                },
                series: [{
                    data: msData,
                    type: 'line'
                }],
                grid: {
                    left: '0%',
                    right: '0%',
                    bottom: '0%',
                    top: '3%',
                    containLabel: true
                },
            });
            fpsChart.setOption({
                title: {
                    text: '',
                    subtext: 'FPS',
                    left: 'right',
                    subtextStyle: {

                    }
                },
                xAxis: {
                    type: 'category',
                    axisLabel: {
                        show: true,
                        textStyle: {
                            color: '#fff'
                        }
                    },
                    data: ['', '', '', '', '', '', '']
                },
                yAxis: {
                    type: 'value',
                    axisLabel: {
                        show: true,
                        textStyle: {
                            color: '#fff'
                        }
                    },
                },
                series: [{
                    data: fpsData,
                    type: 'line',
                    areaStyle: {}
                }],
                grid: {
                    left: '0%',
                    right: '0%',
                    bottom: '0%',
                    top: '3%',
                    containLabel: true
                },
            });

        }, 1000);
        if(!scene.pickPositionSupported) {
            alert('不支持深度纹理,视频投放功能无法使用!');
        }

        var groundPromise = scene.addS3MTilesLayerByScp(URL_CONFIG.SCP_CBD_GROUND1, {
            name: 'ground1'
        });
        var buildPromise = scene.addS3MTilesLayerByScp(URL_CONFIG.SCP_CBD_BUILD, {
            name: 'build'
        });
        var lakePromise = scene.addS3MTilesLayerByScp(URL_CONFIG.SCP_CBD_LAKE, {
            name: 'lake'
        });
        var treePromise = scene.addS3MTilesLayerByScp(URL_CONFIG.SCP_CBD_TREE, {
            name: 'tree'
        });
        var roadPromise = scene.addS3MTilesLayerByScp(URL_CONFIG.SCP_CBD_ROAD, {
            name: 'road'
        });
        var bridgePromise = scene.addS3MTilesLayerByScp(URL_CONFIG.SCP_CBD_BRIDGE, {
            name: 'bridge'
        });
        Cesium.when.all([groundPromise, buildPromise,lakePromise,treePromise,roadPromise,bridgePromise], function(layers) {
            //图层加载完成,设置相机位置
            scene.camera.setView({
                destination: Cesium.Cartesian3.fromDegrees(116.4486, 39.9092, 91.3293),
                orientation: {
                    heading: 3.179304500963121,
                    pitch: -0.46239072362282485,
                    roll: 6.283185307179583
                }
            });

            for(var i = 0; i < layers.length; i++) {
                layers[i].selectEnabled = false;
            }
            document.getElementsByClassName("cesium-performanceDisplay")[0].style.display = "none";

            var videoElement = document.getElementById('trailer');

            var projectionImage = new Cesium.ProjectionImage(scene);

            var handler = new Cesium.DrawHandler(viewer, Cesium.DrawMode.Point);

            handler.movingEvt.addEventListener(function(windowPosition) {
                var last = scene.pickPosition(windowPosition);
                var distance = Cesium.Cartesian3.distance(scene.camera.position, last);
                if(distance > 0) {
                    var cartographic = Cesium.Cartographic.fromCartesian(last);
                    var longitude = Cesium.Math.toDegrees(cartographic.longitude);
                    var latitude = Cesium.Math.toDegrees(cartographic.latitude);
                    var height = cartographic.height;
                    projectionImage.setDistDirByPoint([longitude, latitude, height]);
                    projectionImage.distance = Number($("#distance").val());
                }
            });
            $('#clear').click(function(evt) {
                clearAndActive();
                handler.clear();
                videoElement.pause();
            });

            function clearAndActive() {
                projectionImage.distance = 0.1;
                var wgsPosition = scene.camera.positionCartographic;
                var longitude = Cesium.Math.toDegrees(wgsPosition.longitude);
                var latitude = Cesium.Math.toDegrees(wgsPosition.latitude);
                var height = wgsPosition.height;
                projectionImage.viewPosition = [longitude, latitude, height];
                projectionImage.horizontalFov = Number($("#horizontal").val());
                projectionImage.verticalFov = Number($("#vertical").val());
                projectionImage.setImage({
                    video: videoElement
                });
                if (videoElement.readyState > 2) {
                    projectionImage.setImage({
                        video: videoElement
                    });
                    projectionImage.build();
                }
                videoElement.play();
            }
            //设置RTSP视频socket地址
            Streamedian.player('trailer', {
                socket: "ws://localhost:8088/ws/",
                redirectNativeMediaErrors:true,
                bufferDuration: 30
            });

            $('#active').click(function(evt) {
                clearAndActive();
                handler.activate();
                var newSource   = "rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov";
                Streamedian.src({src: newSource, type: "application/x-rtsp"});
                Streamedian.play();
            });

            $('#horizontal').bind('input propertychange', function() {
                var value = Number($(this).val());
                projectionImage.horizontalFov = value;
            });
            $('#vertical').bind('input propertychange', function() {
                var value = Number($(this).val());
                projectionImage.verticalFov = value;
            });
            $('#distance').bind('input propertychange', function() {
                var value = Number($(this).val());
                projectionImage.distance = value;
            });
            $('#visibleLine').click(function(evt) {
                projectionImage.hintLineVisible = this.checked;
            });

        }, function(e) {
            if(widget._showRenderLoopErrors) {
                var title = '加载SCP失败,请检查网络连接状态或者url地址是否正确?';
                widget.showErrorPanel(title, undefined, e);
            }
        });
    }
    if (typeof Cesium !== 'undefined') {
        window.startupCalled = true;
        onload(Cesium);
    }
</script>
</body>
</html>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: SuperMap iClient 3D for WebGL 是一款基于 WebGL 技术的三维地图开发工具,主要用于构建具有三维效果的地图应用程序。该工具提供了丰富的 API 接口和示例代码,可以帮助开发者快速上手,实现各种三维地图功能,如地形展示、建筑物模型、动态效果等。同时,SuperMap iClient 3D for WebGL 还支持多种数据格式,包括 SuperMap iServer 数据、OGC 标准数据、KML、GeoJSON 等,可以满足不同应用场景的需求。 ### 回答2: SuperMap iClient3D for WebGL是一个基于WebGL技术的三维地图开发框架。它提供了一系列的API和工具,使开发人员能够更加轻松地构建出高质量的三维地图应用。下面,我将从以下几个方面介绍SuperMap iClient3D for WebGL教程。 一、环境配置 SuperMap iClient3D for WebGL的开发需要先配置开发环境,包括安装Node.js、下载安装SuperMap iServer、下载安装SuperMap iClient3D资源包、创建Web应用程序。 二、基本概念 在学习SuperMap iClient3D for WebGL之前,需要了解一些基本概念。这些概念包括:场景(Scene)、层(Layer)、覆盖物(Overlay)等。在使用SuperMap iClient3D for WebGL时需要理解这些概念。 三、API使用 SuperMap iClient3D for WebGL提供了众多的API,使用这些API能够快速构建出一个三维地图应用。这些API包括:场景相关的API,如创建场景、设置场景属性等;层相关的API,如加载图层数据、隐藏、显示图层等;覆盖物相关的API,如创建点、线、面等覆盖物。 四、进阶应用 在掌握SuperMap iClient3D for WebGL的基础之后,可以通过进阶应用来进一步加深对这个框架的理解。进阶应用包括地球的三维测量、地球的动态效果、地球的热点区域等。 总之,SuperMap iClient3D for WebGL是一个非常实用的三维地图开发框架。通过学习其教程,开发人员可以更加方便、快速地构建出高质量的三维地图应用。 ### 回答3: SuperMap iClient 3D for WebGL是一款基于WebGL技术的开源GIS JavaScript库,用于构建高效、功能强大的3D GIS应用程序。这个库支持在Web浏览器里实现高质量的三维可视化效果,包括三维地形、建筑物、模型、标签等。现在,我来为你们讲解一下关于SuperMap iClient 3D for WebGL的教程。 一、前置知识 在接触SuperMap iClient 3D for WebGL之前,建议你先学习基本的WebGL知识和JavaScript语言,也应该具备计算机图形学基础和3D模型制作知识。 二、环境配置 在使用SuperMap iClient 3D for WebGL前,我们需要进行环境配置,在编写和运行项目时可以根据需要安装一系列依赖项,例如Node.js、npm包管理器、Gulp自动化工具、webpack工具和TypeScript编译器等。 三、基本使用 SuperMap iClient 3D for WebGL提供了丰富的API以实现3D可视化应用程序的开发,其中包括地图、图层、标注、工具、渲染等方面。同时,它还提供了多种数据格式的支持,如XYZ、OGC、JSON、KML、GML等。此外,SuperMap iClient 3D for WebGL还支持多种操作和交互方式,如平移、旋转、缩放、选取、编辑等,让用户可以更加自由地探索和编辑地图数据。 四、示例应用 SuperMap iClient 3D for WebGL提供了一系列的示例应用程序,可以帮助用户更好的理解其使用方法和特点,其中包括一些经典的三维场景展示和实时数据可视化等。例如,用户可以体验到城市三维建模、天气预报、热力图、空气质量监控等实用的功能。此外,SuperMap iClient 3D for WebGL也提供了一些模板和组件,供用户快速搭建自己的3D GIS应用程序。 总之,SuperMap iClient 3D for WebGL是一款非常优秀的基于WebGL技术的GIS JavaScript库,具有开源、高效、功能强大、易用等特点,可以为用户提供丰富多彩的三维GIS应用程序。当然,在使用前,建议用户先了解基本的WebGL和JavaScript知识,同时还需配置好开发环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q行天下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值