java 使用JNA连接天敏VC4000采集卡

news/2024/11/30 9:33:46/

突然发现自己快成了专门调硬件的了

 

 

废话不多说了,正题开始

使用的库

1.官方的两个dll(Mix.dll,Sa7134Capture.dll),可能对应不同版本,我这是6.0的,附件里有

2.jna的jar包,注意是两个

   jna.jar,jna-platform.jar 

以上都在本文后面提供下载

 

关键代码

首先是jna的代理,不明白的看下jna怎么用,这里定义dll存在的且你需要的函数就可以了

package xingyang.meam.video;import java.io.File;import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.win32.StdCallLibrary;/*** * 视频显示设备* * @author Administrator* */
public interface CaptureDevice extends StdCallLibrary {File f = new File("");CaptureDevice INSTANCE = (CaptureDevice) Native.loadLibrary(f.getAbsolutePath() + "\\Sa7134Capture", CaptureDevice.class);/*** 该函数用于初始化开发包。在使用SDK开发包中的函数前,首先需要调用该函数进行初始化。* * @param hwnd*            表示视频显示多路小窗口的父窗口。* @param eDispTransType*            表示显示类型。* @param bLnitAuDev*            表示是否初始化音频设备。* @return*/public boolean VCAInitSdk(HWND hwnd);/*** 该函数用于释放调用VCAInitSdk函数分配的系统资源,通常在程序结束时调用该函数。*/public void VCAUnInitSdk();/*** 该函数用于获得监控卡中芯片的数量。通常,监控卡支持多少路视频,将会存在多少个芯片。* * @return 表示系统中安装监控卡上的芯片数量。*/public int VCAGetDevNum();/*** 该函数用于打开指定卡号的设备,并分配相应的系统资源。* * @param dwCard*            表示视频捕捉的卡号。* @param hPreviewWnd*            表示视频预览窗口句柄。* @return*/public boolean VCAOpenDevice(int dwCard, HWND hPreviewWnd);/*** 该函数用于关闭指定卡号的设备,释放相应系统资源。* * @param dwCard*            表示视频捕捉的卡号。* @return*/public boolean VCACloseDevice(int dwCard);/*** 该函数用于打开视频预览窗口。* * @param dwCard*            表示预览的视频卡号。* @return*/public boolean VCAStartVideoPreview(int dwCard);/*** 该函数用于停止视频预览。* * @param dwCard*            表示预览的视频卡号。* @return*/public boolean VCAStopVideoPreview(int dwCard);/*** 该函数用于更新视频预览窗口。当预览窗口的父窗口大小或位置改变时,需要调用该函数进行调整。* * @param hOverlayWnd*            表示预览窗口的父窗口。* @return*/public boolean VCAUpdateOverlayWnd(HWND hOverlayWnd);/*** 该函数用于更新视频预览窗口。当预览窗口的大小和位置需要调整时调用该函数。通常,在调用该函数前,需要调用VCAUpdateOverlayWnd函数。* * @param dwCard*            表示预览的视频卡号。* @param hPreviewWnd*            表示视频预览窗口。* @return*/public boolean VCAUpdateVideoPreview(int dwCard, HWND hPreviewWnd);
}

 

主类

package xingyang.meam.video;import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Panel;
import java.io.IOException;
import java.util.Properties;import javax.swing.JFrame;import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef.HWND;public class VideoMain {public static void main(String[] args) {Properties p = new Properties();try {p.load(VideoMain.class.getResourceAsStream("/config.properties"));} catch (IOException e) {e.printStackTrace();}String[] cardNos = p.getProperty("cardNumbers", "0,1,2,3").trim().split(",");// int type = Integer.parseInt(p.getProperty("type"));JFrame jf = new JFrame();Panel parent = new Panel();parent.setPreferredSize(new Dimension(660, 500));jf.add(parent);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);parent.setLayout(new FlowLayout());Panel panels[] = new Panel[cardNos.length];for (int i = 0; i < panels.length; i++) {Panel cardPanel = new Panel();cardPanel.setPreferredSize(new Dimension(320, 240));cardPanel.setBackground(new Color(255, 0, 255));parent.add(cardPanel);panels[i] = cardPanel;}jf.pack();jf.setVisible(true);boolean success = CaptureDevice.INSTANCE.VCAInitSdk(createHWNDByComponent(parent));if (!success) {System.out.println("init = " + success);}for (int i = 0; i < panels.length; i++) {Panel cardPanel = panels[i];HWND hwnd = createHWNDByComponent(cardPanel);int cardNo = Integer.parseInt(cardNos[i]);System.out.println("cardNo = " + cardNo);boolean isopen = CaptureDevice.INSTANCE.VCAOpenDevice(cardNo, hwnd);if (!isopen) {System.out.println("isopen = " + isopen);}boolean isstart = CaptureDevice.INSTANCE.VCAStartVideoPreview(cardNo);if (!isstart) {System.out.println("isstart = " + isstart);}// CaptureDevice.INSTANCE// .VCAUpdateOverlayWnd(createHWNDByComponent(parent));// CaptureDevice.INSTANCE.VCAUpdateVideoPreview(cardNo, hwnd);}// CaptureDevice.INSTANCE// .VCAUpdateOverlayWnd(createHWNDByComponent(parent));}private static HWND createHWNDByComponent(Component parent) {return new HWND(Native.getComponentPointer(parent));}
}

 这里有个变态的是,就是小panel(显示视频的panel)的背景色不能随便设,得设成粉色(255,0,255)才行,否则。。明明返回的都是true,就是不显示画面。。

 

还有个注意的地方,Native.getComponentPointer的参数得是重量级的不能用轻量级的

也就是awt的,别用swing的

其他就没啥了

 

发现jna果然是个神器。。。。,否则写JNI。。。想想都头疼

 

附件是java工程,导入eclipse,直接运行

 


http://www.ppmy.cn/news/559582.html

相关文章

天敏SDK2500开发小计

之前一个项目需要用天敏的卡做图片采集 实现是可以做&#xff0c;但是缺点是&#xff1a;1 图片没法子实时抓取&#xff0c;会滞后1秒左右&#xff0c;客户没法子接受。。。。 2 不知道是我没有处理好还是什么&#xff0c;很容易导致CPU 很高 优点&#xff1a;1 SDK真简单&…

视频采集卡二次开发(天敏SDK2500+openCV)

视频开发难点 做视频二次开发最常遇到的问题有两个&#xff0c;一个是算法分析的问题&#xff0c;就是图像处理的问题&#xff0c;另一个就是视频流的问题&#xff0c;就是串口和数据解码的问题。通常来说&#xff0c;科研领域大多在研究前者&#xff0c;而民间的发烧友大多在…

android版本4.4.2导航,天敏D8+_rk3288_Android_4.4.2_kiui7_蓝光导航极速版

新一代超强四核芯片处理器RK3288开创了芯片业界三个第一的时代——全球第一个四核ARM Cortex-A17内核芯片,全球第一个支持最新超强Mali-T76x系列GPU的芯片以及全球第一个4Kx2K 硬解H.265的芯片。支持最新Mali-T76x系列GPU的芯片,性能提升500%;支持4Kx2K实时硬解H.265的芯片,…

c#天敏sdk2000的视频采集卡简单调用

1&#xff1a;例子使用的是天敏sdk2000的视频采集卡 申明&#xff1a; //初始化话设备 [DllImport("DSStream.dll")] public static extern bool DSStream_Initialize(); [DllImport("DSStream.dll")] public static extern void DSStre…

C#结合天敏VC4000采集卡视频监控

作者&#xff1a;wnety 转自&#xff1a;http://blog.csdn.net/wnety/article/details/7452303 准备&#xff1a;天敏VC4000视频采集卡的二次开发包有两个文件&#xff0c;分别是Sa7134Capture.dll和Mix.dll&#xff0c;缺一不可。 代码中使用的全是Sa7134Capture.dll中的方法…

天敏

http://shop33418799.taobao.com/

天敏T2四核增强版ROOT方法

T2四核增强版&#xff0c;兄弟刚买的&#xff0c;启动页面实在是过于“丰富多彩”&#xff0c;影视教育购物游戏应用&#xff0c;我想大多数用户购买机顶盒主要是看影视的&#xff0c;或者少数会玩游戏&#xff0c;用机顶盒购物基本没有吧&#xff01;没办法&#xff0c;因为是…

allwinner h5 android,天敏TM8-全志H5芯片安卓5.1系统纯净桌面线刷固件rom包下载

天敏TM8固件下载教程:点击上面的购买rom按钮获取 天敏TM8机顶盒刷机方法如下: 1.准备好刷机用的两头都是USB口的连接线,以及捅复位孔的工具如牙签。 2.下载刷机工具及镜像文件(H3刷机工具和步骤)里边的四个文件,分辨是1.刷机工具安装步骤、 2.刷机步骤、 PhoenixSuit_CN.ms…