Eine Liste der verfügbaren capture-Formate

Neues V4L habe ich beschlossen, beginnen mit der video4linux2 Bibliothek in um capture ein Bild aus meiner Kamera in C (ich bin mit dem uvcvideo-Modul mit einer Ricoh Co. Kamera). Ich folgte einige Anleitungen und tutorials, und es geschafft, ein Programm läuft. Meine Frage ist vor allem über das übliche code-line :

struct v4l2_format format = {0};
format.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
//...

Dies ist, wo ich die eigentlichen video-format bei der Aufnahme. Wie Sie sehen können, in diesem Beispiel habe ich mithilfe von MJPEG (http://lxr.free-electrons.com/source/include/uapi/linux/videodev2.h#L390). Auch wenn dies eine große format-und alle, meine Anwendung wird wahrscheinlich erfordern einfache RGB-Formatierung, pixel pro pixel denke ich. Aus diesem Grund habe ich versucht, mit Hilfe von RGB-format-Konstanten wie V4L2_PIX_FMT_RGB24. Jetzt aus irgendeinem Grund... v4l2 mag es nicht. Ich vermute, dies ist hardware-bezogen, aber ich möchte vermeiden, MJPEG Manipulationen so weit wie möglich. Für Testzwecke habe ich versucht, mit anderen Konstanten und Formate, aber egal was ich Tat, v4l2 laufend die pixelformat - Feld den Wert :

xioctl(fd, VIDIOC_S_FMT, &format); //This call succeeds with errno != EINTR.
if(format.fmt.pix.pixelformat != V4L2_PIX_FMT_RGB24){
    //My program always enters this block when not using MJPEG.
    fprintf(stderr, "Format wasn't accepted by v4l2.");
    exit(4);
}

Nun meine Frage : gibt es eine Möglichkeit, ich könnte eine Liste der akzeptierten video-Formate (und ich meine, angenommen von meiner Kamera/v4l2), aus denen ich auswählen könnte etwas anderes als MJPEG ? Wenn Sie denken, ich habe einen stick mit MJPEG, würden Sie mir empfehlen jede Bibliothek, die mir erlaubt, um es zu manipulieren, und schließlich zurück zu ziehen, die Erfassung in einem GUI-frame ?

Barbar test-code

Ich verwendet die folgenden trick, um zu testen, alle verfügbaren Formate auf meiner hardware. Zunächst einige shell-Skript, um eine Liste aller Formate...

grep 'V4L2_PIX_FMT' /usr/include/linux/videodev2.h | grep define | tr '\t' ' ' | cut -d' ' -f2 | sed 's/$/,/g'

... der Ausgang ist in diesem C-Programm :

int formats[] = {/* result of above command */};
int i = 0;
struct v4l2_format format = {0};

for(i = 0; i < /* number of lines in previous command output */; i++){
    format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    format.fmt.pix.width = 320;
    format.fmt.pix.height = 240;
    format.fmt.pix.pixelformat = formats[i];
    format.fmt.pix.field = V4L2_FIELD_NONE;
    if(xioctl(fd, VIDIOC_S_FMT, &format) != -1 && format.fmt.pix.pixelformat == formats[i])
        fprintf(stderr, "Accepted : %d\n", i);
}

Dieser test zeigt, dass nur V4L2_PIX_FMT_YUYV und V4L2_PIX_FMT_MJPEG funktionsfähig sind. Keiner Weise konnte ich verbessern, oder ist es hardware-bedingt ?

linuxtv.org/downloads/v4l-dvb-apis/pixfmt.html ?
Sorry, ich war nicht deutlich genug, mein Fehler. Ich bin auf der Suche nach einer Liste der verfügbaren und akzeptiert "Formate", was bedeutet, Formate meiner Kamera akzeptieren würde (siehe meine if Anweisung oben). Wenn ich noch was anderes einstellen, MJPEG, den pixelformat - Attribut nicht gesetzt ist, die von der library aus, wahrscheinlich weil es nicht behandelt werden kann, indem meine hardware.

InformationsquelleAutor John WH Smith | 2014-03-21

Schreibe einen Kommentar