spookfcy 2014-05-05 02:13 采纳率: 0%
浏览 828

jmf 有人在Linux下面用过么,如何驱动摄像头

centos 6.5
jdk 1.5
jmf 2.1.1e

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-02 16:08
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在Linux下使用JMF(Java Media Framework)进行摄像头的驱动程序开发,需要以下步骤:

    安装JMF和相应的库

    1. 安装JDK:

      • 先确保已经安装了最新版本的Java Development Kit (JDK)。Linux发行版通常会在/usr/java目录中提供JDK,你可以在命令行中输入java -version来检查当前的JDK版本。
      • 如果你的JDK版本较低,请运行以下命令更新到最新版本:
        sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java default java
        
    2. 安装JMF库:

      • 下载并解压JMF库文件到一个位置,例如/usr/local/jmf/opt/jmf.
      • 进入解压后的目录,运行以下命令安装JMF:
        cd /usr/local/jmf
        sudo ./configure
        sudo make && sudo make install
        
      • 在编译时,可以选择是否使用NDK工具链(默认情况下,NDK是必要的)。如果没有,你可以选择不使用NDK,如下所示:
        # 如果不需要NDK,请忽略这个选项
        configure --without-ndk
        make
        sudo make install
        
    3. 配置JMF库的路径和参数:

      • 更新/etc/java/jmf.properties文件,添加以下内容:

        java.specification.name=org.bytemea.jmf.jmfapi
        java.specification.version=2.1.1e
        ...
        java.class.path=/usr/local/jmf/javamf
        java.source.path=/usr/local/jmf/javamf
        java.lib.path=/usr/local/jmf/javamf/lib
        javax.media.spi.MediaSPIInitializer.setInitialClasspath(/usr/local/jmf/javamf/lib)
        javax.media.spi.MediaSPIClasspathProvider.initDefault(MediaSPIClasspathProvider.class, true)
        
      • 添加Java Media Framework类到/usr/local/jmf/javamf/lib目录下的相应包名(如com.sun.media.jfxmedia.*),例如:

        /usr/local/jmf/javamf/lib/com/sun/media/jfxmedia/audioVideoEncoder_jfxmedia_audioVideoEncoder.so
        /usr/local/jmf/javamf/lib/com/sun/media/jfxmedia/imageCapture_jfxmedia_imageCapture.so
        /usr/local/jmf/javamf/lib/com/sun/media/jfxmedia/imageDecoder_jfxmedia_imageDecoder.so
        /usr/local/jmf/javamf/lib/com/sun/media/jfxmedia/jfxmedia_fileFormat_jfxmedia_jfxmedia_fileFormat.so
        /usr/local/jmf/javamf/lib/com/sun/media/jfxmedia/jfxmedia_module_jfxmedia_module.so
        /usr/local/jmf/javamf/lib/com/sun/media/jfxmedia/jfxmedia_videoProcessor_jfxmedia_videoProcessor.so
        
      • 将JMF所需的依赖项添加到build.gradle文件(如果已创建)中,并根据需要设置其路径:

        dependencies {
          implementation 'javax.media:jfxmedia:jfxmedia-api:2.1.1e'
          implementation 'com.sun.media:jfxmedia:jfxmedia-player:2.1.1e'
          implementation 'com.sun.media:jfxmedia:jfxmedia-imagecapture:2.1.1e'
          implementation 'com.sun.media:jfxmedia:jfxmedia-videoencoder:2.1.1e'
          implementation 'com.sun.media:jfxmedia:jfxmedia-imagedecoder:2.1.1e'
          implementation 'com.sun.media:jfxmedia:jfxmedia-jpegenc:2.1.1e'
          implementation 'com.sun.media:jfxmedia:jfxmedia-jpgdec:2.1.1e'
          implementation 'com.sun.media:jfxmedia:jfxmedia-videomodules:2.1.1e'
          implementation 'com.sun.media:jfxmedia:jfxmedia-mediacore:2.1.1e'
          implementation 'com.sun.media:jfxmedia:jfxmedia-extras:2.1.1e'
          implementation 'com.sun.media:jfxmedia:jfxmedia-compat:2.1.1e'
          implementation 'com.sun.media:jfxmedia:jfxmedia-pipeline:2.1.1e'
        }
        

        注意,这些依赖项可能需要根据你的具体项目结构有所不同。

    4. 创建或编辑Camera组件的Java类:

      • 创建一个新的Java类(例如CameraComponent.java),继承自javax.media.jfxmedia.component.JFXMediaComponent。在这个类中,你需要实现以下方法:

        a. open方法用于打开摄像头设备,这通常涉及获取相机实例、设定初始值等操作。示例代码如下: ```java @Override public void open() throws Exception { CameraDevice camera = null; try { camera = getCamera(); // 设置初始属性 camera.open(); } catch (Exception e) { e.printStackTrace(); } }

        @Override
        public void release() throws Exception {
            if (camera != null) {
                camera.close();
            }
        }
        

        }

        b. setup方法用于初始化摄像机,如设置镜头焦距、设置输出流、连接音视频线缆等。示例代码如下: ```java @Override public void setup() throws Exception { System.out.println("Setting up camera..."); float focalLength = 50.f; // Set the lens focal length in mm // Connect to input/output video sources if (videoSource == null) { throw new IllegalArgumentException("No video source connected"); } videoSource.setup();

            // Connect audio output
            if (audioSource == null) {
                throw new IllegalArgumentException("No audio source connected");
            }
            audioSource.setup();
        
            // Create camera and configure
            CameraContext context = new CameraContext();
            camera = context.getCamera();
            camera.setPreviewTexture(new SurfaceTexture(videoSurface));
            camera.setDisplayOrientation(90);
            camera.initialize(focalLength);
            camera.setRenderable(camera.getRenderable());
            camera.prepare();
        }
        
        @Override
        public void renderImage(RenderRequest renderRequest) throws Exception {
            RenderedImage image = null;
            try {
                // Get a copy of the current frame from the camera
                ImageData[] frames = camera.getImageData(renderRequest.getImageIndex());
        
                if (frames.length > 0) {
                    image = camera.getImageData(imageIndex);
                    // Convert the images to floating-point values for processing
                    int width = image.getWidth();
                    int height = image.getHeight();
                    float[] pixels = new float[width * height];
                    image.getPixels(pixels, 0, width, 0, 0, width, height);
        
                    // Apply various filters or processing algorithms on the image data
                    // ... (code goes here)
        
                    // Save the processed image as a file
                    File outputFile = new File(outputPath);
                    ImageIO.write(image, "png", outputFile);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (image != null) {
                    try {
                        image.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        

        }

        c. close方法用于关闭摄像机,释放资源并释放预览视图和显示对象。示例代码如下: ```java @Override public void close() throws Exception { if (camera != null) { try { camera.release(); } catch (IOException e) { e.printStackTrace(); } } super.close(); } }

        
        
    5. 注册媒体访问框架(MIF)接口和创建相关操作的Java类:

      • 在你的application.xmlbuild.gradle文件中,将以下内容添加到<module>标签中的defaultImplementationprovidedImplementation字段中:
        <dependency>
          <groupId>javax.media</groupId>
          <artifactId>jfxmedia</artifactId>
          <version>2.1.1e</version>
          <scope>runtime</scope>
          <type>jar</type>
        </dependency>
        <dependency>
          <groupId>com.sun.media</groupId>
          <artifactId>jfxmedia</artifactId>
          <version>2.1.1e</version>
          <scope>runtime</scope>
          <type>jar</type>
        </dependency>
        <!-- ...
        <dependency>
          <groupId>com.sun.media.jfxmedia</groupId>
          <artifactId>jfxmedia-api</artifactId>
          <version>2.1.1e</version>
          <scope>runtime</scope>
          <type>jar</type>
        </dependency>
        <dependency>
          <groupId>com.sun.media.jfxmedia</groupId>
          <artifactId>jfxmedia-module</artifactId>
          <version>2.1.1e</version>
          <scope>runtime</scope>
          <type>jar</type>
        </dependency>
        
    评论

报告相同问题?