V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
keykun
V2EX  ›  问与答

如何在 ActiveX 插件上面覆盖一个 canvas,既能在 canvas 上面画图又能看到底下的加载的视频

  •  
  •   keykun · 2017-06-04 19:53:32 +08:00 · 3132 次点击
    这是一个创建于 2729 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这个 ActiveX 插件是有窗口的,通过 sdk 加载视频,没有视频流。要想实现的效果是既能在 canvas 上面画图又能看到底下的视频。这个 ActiveX 插件要先安装在电脑上,再通过 object 标签加载进来的。代码如下: <object id="plugin" type="application/x-fbtestplugin" width="400px" height="300px"></object> 刚开始我以为很简单,只要用一个 div 去包裹 object 设置绝对定位再设置层级大小,同样 canvas 也是一样的做法(canvas 的层级较大),然后位置设成重叠,以为就能成功,谁想太天真了。如果 canvas 有背景色的话,并且没有透明度的话,确实在上面。但是只要一设置透明度就会被 object 覆盖,无法对这块区域的 canvas 进行操作。我打开控制台想去查看样式的时候,发现一个特别的地方,只要一打开控制台加载的视频就会消失,你无法通过控制台的标签选择光标去找到这块区域。一关闭控制台就又能看到视频。然后我就只能去求助万能的百度了,也找到了相关的文章。 说是因为有些 ActiveX 插件是有窗体的,有窗体的元素都会被显示在无窗体的元素之上。而且所有的无窗体元素和有窗体的元素渲染在不同的 MSHTML 平面上,所以无法通过 z-index 属性来操作不同元素之间的层级关系。那篇文章说的方法是通过在两者之间设置一个浮动的全透明的 iframe 来作为中间层,iframe 覆盖 object,然后 div ( div 能覆盖成功,canvas 也就可以了) 再覆盖 iframe。没错,这样是能成功,但是还是实现不了我想要的结果。因为 iframe 就算把 iframe 设置成全透明,在 object 加载视频的区域上方是有默认颜色的,会把底下的视频完全遮挡住,看不到底下的视频。我试过把 object 换成 div 就能成功。试过了用把 object 单独放在一个页面让 iframe 去加载它,然后再 iframe 这个页面创建一个 div 去覆盖它,也没能实现我要的效果。也试过了把 div 写在另一个页面,让 iframe 去加载它,然后在覆盖到 object 加载的视频区域上面,也同样失败了。 还有说给 object 设置 vmode 属性改变它的渲染模式,我也试过了,没有用。 后面我想通过 canvas 直接画这个视频,就不需要在视频上面覆盖一个 canvas 了。可问题又来了,没有视频流,亲们,我的内心是崩溃的。我已经没有什么好的方法解决了,望能解决这个问题的大神们,能指点一番,小弟不胜感激。

    17 条回复    2017-06-05 07:13:09 +08:00
    keykun
        1
    keykun  
    OP
       2017-06-04 20:29:39 +08:00
    大神快来
    keykun
        2
    keykun  
    OP
       2017-06-04 20:29:57 +08:00
    我已经试了好几天了
    keykun
        3
    keykun  
    OP
       2017-06-04 20:30:38 +08:00
    大胸弟们快来
    keykun
        4
    keykun  
    OP
       2017-06-04 20:31:05 +08:00
    做了 10 几个 demo,还是没用
    xylitolLin
        5
    xylitolLin  
       2017-06-04 20:36:44 +08:00 via iPhone
    监控视频播放的坑?
    keykun
        6
    keykun  
    OP
       2017-06-04 20:37:39 +08:00
    @xylitolLin 恩恩,就是监控视频
    keykun
        7
    keykun  
    OP
       2017-06-04 20:38:34 +08:00
    @xylitolLin 大胸弟,知道怎么解决嘛,求指教
    oott123
        8
    oott123  
       2017-06-04 20:39:54 +08:00 via Android
    ActiveX 我猜不是你写前端能解决的,只能以 ActiveX 攻 ActiveX 了,哈哈哈
    keykun
        9
    keykun  
    OP
       2017-06-04 20:44:04 +08:00
    @oott123 就是要我解决啊,5555555~
    keykun
        10
    keykun  
    OP
       2017-06-04 20:47:05 +08:00
    sorry,是有窗体的,正文说错了,囧
    wshcdr
        11
    wshcdr  
       2017-06-04 21:42:43 +08:00
    恩,用另外一个 ActiveX 去 load 这个 Activex,然后再做你想做的事情
    chairuosen
        12
    chairuosen  
       2017-06-04 22:42:33 +08:00
    把视频流转一下,不用 ActiveX,用 canvas,
    https://imququ.com/post/html5-live-player-2.html
    boomsUn
        13
    boomsUn  
       2017-06-04 23:52:22 +08:00 via iPhone
    @chairuosen 就是没有视频流
    boomsUn
        14
    boomsUn  
       2017-06-04 23:55:52 +08:00 via iPhone
    是 new 一个 Activex 对象出来还是再装一个插件去 load 它,我是第一次接触这个 ActiveX 插件,囧
    boomsUn
        15
    boomsUn  
       2017-06-05 00:03:16 +08:00 via iPhone
    @chairuosen 组长说是用 sdk 加载的
    chairuosen
        16
    chairuosen  
       2017-06-05 00:12:22 +08:00   ❤️ 1
    @boomsUn 我没有 ActiveX 开发经验,所以没法具体帮到你。不过工作中肯定会遇到无法用技术解决的需求,这时候有两种方法,用别的方式绕过去,不走这个坑,或者跟产品说实现不了,改需求。这种古老的嵌入技术为啥今天还在用
    boomsUn
        17
    boomsUn  
       2017-06-05 07:13:09 +08:00 via iPhone
    @chairuosen 非常感谢,因为我刚进这家公司然后就有功能做不出来,很尴尬。其实我之前就跟组长说了做不出来,但他一直让我试试,所以我就只能再努力一下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1250 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:06 · PVG 02:06 · LAX 10:06 · JFK 13:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.