[JAVA/C] Webcam mit Hilfe von v4l auslesen

Hallo,

Ich versuche mit Hilfe von JVideo4Linux (eine andere möglichkeit hab ich leider nicht gefunden) einzelne Videoframes von meiner Webcam einzulesen.

Codemäßig sieht das ganze bis jetzt folgendermaßen aus:

Main.java
PHP:
import lib.*;

public class Main
{
	public static void main(String[] args)
	{
		byte data[];
		
		Video4Linux video = new Video4Linux();
		String dev = "/dev/video0";
		video.openDev(dev);

		// hier holt er sich die daten der cam - das funktioniert
		Video4Linux_VideoCapability cap = video.getVideoCapability();
		
		// platz für ein bild schaffen...
		data = new byte[cap.maxwidth * cap.maxheight * 3];
		
		// daten lesen - das hier haut nicht hin
		System.out.println("Bytes: "+video.read(data, 0, cap.maxwidth*cap.maxheight*3));
		video.closeDev();
	}
}

lib/Video4Linux.java (gekürzt)
PHP:
public class Video4Linux
{
	private int fd;
	private String dev;
	
	static {
		System.loadLibrary("ASV4L");
	}
	
	public native void openDev(String dev) throws IOException;

	public native Video4Linux_VideoCapability getVideoCapability() throws IOException;
	
	public native int read(byte[] data,int offset,int len) throws IOException;

	public native void closeDev();
	
	public Video4Linux()
	{
		fd = -1;
		dev = null;
	}

lib/libASV4L.c (gekürzt)
PHP:
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <linux/types.h>
#include <linux/videodev.h>
#include <errno.h>

#include <jni.h>

#include "Video4Linux.h"

[...]

JNIEXPORT jint JNICALL Java_lib_Video4Linux_read(JNIEnv * env,jobject obj,jbyteArray array,jint offset,jint len)
{
	jvalue result;
	int fd;
	char * buf;
	result.i = 0;

	if((fd = getIntField(env, obj, "fd")) == -1) {
		throwByName(env,"java/io/IOException", "device not open");
		return;
	}

	buf = (char *) malloc(len);

	// XXX:
	if((result.i = read(fd, buf, len)) == -1) {
 		free(buf);
 		throwByName(env, "java/io/IOException", strerror(errno));
 		return result.i;
	}

	(*env)->SetByteArrayRegion(env, array, offset, len, (jbyte *)buf);

	free(buf);

	return result.i;
}

Das Problem ist nun, dass mir read() (libASV4L.c, nach dem Kommentar) immer -1 zurückgibt und eben keine daten ausgelesen werden.

Ich kenn mich nur leider mit dem C Code hier nicht wirklich aus. Könnte mir jemand, der schon mit v4l und c gearbeitet hat erklären, was hier genau abläuft? Bzw woran das eben liegen könnte, das keine Daten ausgelesen werden.. Ich hoffe ich hab jetzt keinen wichtigen Code unterschlagen..
 
Zuletzt bearbeitet:
ich hab zwar noch nie mit der lib da gearbeitet, aber...

...evtl könnte es helfen nach
Code:
String dev = "/dev/video0";
noch
Code:
video.openDev(dev);
einzufügen...;)
 
Zurück
Oben