zoukankan      html  css  js  c++  java
  • 基于Potplayer类播放器或Action!类录屏软件调取摄像头方式的定时抓拍保存图像方法小结

    前面已经总结了基于Maxmspjitter的相关方法,还有基于Unity的,还有基于Openframeworks的,今天来一篇基于普通软件的:
    1.专业播放器类的软件,如Potplayer、vlc、obs等
    2.专业录屏软件,如Action!
    要想用他们做自定义式抓拍功能,除了寻找自带的功能外,要自己手动搭建逻辑,下面就以两种思路来阐述。


    基于按键精灵类软件

    像按键精灵这种软件就可以辅助我们完成特定逻辑任务,我在B站稍稍总结了一些类似的工具,请参考:
    【软件推荐】有关辅助开发创作的工具小结
    在专业播放器类似的软件中都会有截图功能,并且设置了对应快捷键触发(也可自定义)。那么可以这样设想:我用脚本封装这一操作,即每隔一定时间触发一次截图操作,这样,摄像头画面就可以连续得被抓拍到磁盘上了。
    使用按键精灵就可以轻松封装该脚本,即模拟操作
    针对Potplayer,截图是【Ctrl+E】,那么在按键精灵中可设置脚本如下:

    Delay 2000
    KeyDown "Ctrl", 1
    KeyPress "E", 1
    KeyUp "Ctrl", 1
    

    中文描述:
    image
    接着配置该脚本,右键属性,设置循环次数,如果不想针对次数,也可直接设为【循环到按中止键为止】,然后确定开启中止热键(可自定义,默认F10开启,F12中止)
    接下来的工作是打开摄像头采集实时画面,回到Potplayer,打开菜单,点击[打开 - 摄像头其他设备]即可!当然最好看一看配置参数,同样也在[打开 - 设备设置]中可查看【PS:Potplayer有自带的[连续截图]功能,可以实现此篇文章探讨的功能】。之后试一试【Ctrl+E】组合键功能,检查截图功能是否正常。等一切就绪,按下热键【F10】即可激活脚本作相应操作----相隔2秒截图一次!

    类似的做法套用在录屏软件上也同样适用,如专业录屏软件Action!,设定好了热键,开启采集外置设备(webcam),接着就可激活按键精灵脚本,实现功能!

    基于VBScript类脚本

    VBScript可以很快捷得模拟键鼠操作,当然不只vbs有,很多脚本也可实现,甚至是编译出来的程序只要能实现脚本化按键模拟就可参考该方法。
    编辑脚本.vbs:

    Dim objws 
    Set objws=WScript.CreateObject("wscript.shell") 
    objws.SendKeys "^e"
    

    意为模拟按下组合键【Ctrl+E】一次。这是一个一次性的脚本,执行完毕自动释放,如果想要实现重复,那么还得在外头循环调用它。当然可以再次使用vbs做循环操作,本人暂且对此不熟悉,所以接下来借Processing框架来搭建,这样也能功能模块化,适应之前的知识体系。
    编辑.pde:

    import java.io.*;
    
    void setup()
    {
      frameRate(60); //帧速率60
    }
    
    void draw()
    {
      if(frameCount % 120 == 0) //帧数检测,每计满120帧调用一次,即为相隔2秒执行一次
        Do();
    }
    
    public static String executeCmd(String command) throws IOException { 
     //log.info("Execute command : " + command); 
     Runtime runtime = Runtime.getRuntime(); 
     Process process = runtime.exec("cmd /c " + command); 
     BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8")); 
     String line = null; 
     StringBuilder build = new StringBuilder(); 
     while ((line = br.readLine()) != null) { 
      //log.info(line); 
      build.append(line); 
     } 
     return build.toString(); 
    } 
      
    
    void Do() 
      {
          println("try !");
       // Runtime rt = Runtime.getRuntime();
       // Process p = null;
        try
        {
          executeCmd("start C:\Users\Administrator\Desktop\1.vbs"); 
        //  p =rt.exec(new String[]{"C:\Users\Administrator\Desktop\1.vbs"});
          println("done !");
    
        }catch (Exception e) {
          e.printStackTrace();      
        }
    }
      
    

    相当于使用java语言来封装cmd命令执行,相隔2秒发送一次命令,即执行vbs脚本。剩下的操作跟基于按键精灵的是相似的。这种方法更灵活,更容易拓展,可加更多的逻辑。也同样适用于其他软件(Action!)。

    总结

    实际上带有快捷键方式控制的相关抓拍录像软件都是可以的,甚至对于按钮抓拍也未尝不可,同样可以把它当成脚本录制然后播放,相隔固定时间点击抓拍。。。这很好地拓宽了解决问题的思路,值得提倡。因为终究目的是实现其逻辑,获得想要的数据,过程没有那么严谨。
    而像vlc等软件是自带有相关脚本批处理功能的,它自己就能扩展、实现想要的功能,还有很多稀奇的、特殊的逻辑可以尝试DIY,这也是一大乐趣~


    至此,针对自定义抓拍摄像头画面的实现已经基本做完,下面就是几个思路及方法的文章汇总,感谢大家阅读和支持!
    【1】Maxmspjitter实现实时抓取摄像头画面并制成序列图 (定时抓拍)
    【2】基于Unity调取摄像头方式的定时抓拍保存图像方法小结
    【3】基于Openframeworks调取摄像头方式的定时抓拍保存图像方法小结
    【4】基于Potplayer类播放器或Action!类录屏软件调取摄像头方式的定时抓拍保存图像方法小结 (此篇)

    实质上这些文章只是引出思考问题的道路,点出思路,有相关的方法都可参考并应用和实践,而且不单单是针对摄像头,任何外置设备的录制相关任务都可借类似的思路、方法来自定义控制、获得数据,希望能给予读者一些思考和参考,感谢!

    参考文献
    [1] https://www.jb51.net/article/80829.html Windows系统中Java调用cmd命令及执行exe程序的方法

  • 相关阅读:
    Spring 注解@Transactional
    数据库中为什么要建立视图,它有什么好处?
    类、抽象类与接口的区别
    Comparable和Comparator的区别?
    jetty安装
    python 命令行参数sys.argv
    python--用户认证登录实现
    python--查询员工信息
    python基础
    python学习之路---编程风格规范
  • 原文地址:https://www.cnblogs.com/sharpeye/p/15341394.html
Copyright © 2011-2022 走看看