La liste des formats de capture
Nouveau à V4L, j'ai décidé de commencer à utiliser le video4linux2 bibliothèque, dans le but de capturer une image à partir de mon appareil photo en C (je suis en utilisant le module uvcvideo avec un Ricoh Co. appareil photo). J'ai suivi plusieurs guides et tutoriels, et a réussi à obtenir l'exécution d'un programme. Ma question est surtout sur cette ligne de code :
struct v4l2_format format = {0};
format.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
//...
C'est où j'ai mis la vidéo en format à utiliser lors de la capture. Comme vous pouvez le voir, dans cet exemple, je suis en utilisant MJPEG (http://lxr.free-electrons.com/source/include/uapi/linux/videodev2.h#L390). Même si cela pourrait être un grand format et à tous, ma demande va probablement être simple RVB mise en forme, pixel par pixel, je suppose. Pour cette raison, j'ai essayé d'utiliser le format RGB constantes telles que V4L2_PIX_FMT_RGB24
. Maintenant, pour une raison... v4l2 ne l'aime pas. Je suppose que c'est lié au matériel, mais je voudrais éviter MJPEG manipulations autant que possible. Pour des fins de test, j'ai essayé d'utiliser d'autres constantes et les formats, mais peu importe ce que j'ai fait, v4l2 cessé de changer le pixelformat
valeur du champ :
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);
}
Maintenant, ma question est : est-il possible que je puisse obtenir une liste de accepté les formats vidéo (et je veux dire, accepté par mon appareil photo/v4l2), à partir de laquelle j'ai pu choisir autre chose que le MJPEG ? Si vous pensez que je dois continuer à MJPEG, auriez-vous me recommander une bibliothèque en me permettant de le manipuler, et finalement, le capturer dans un GUI cadre ?
Barbare code de test
J'ai utilisé l'astuce suivante pour tester tous les formats disponibles sur mon matériel. Tout d'abord, certains script shell pour obtenir une liste de tous les formats...
grep 'V4L2_PIX_FMT' /usr/include/linux/videodev2.h | grep define | tr '\t' ' ' | cut -d' ' -f2 | sed 's/$/,/g'
... dont la sortie est utilisé dans ce programme C :
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);
}
Ce test révèle que seulement V4L2_PIX_FMT_YUYV
et V4L2_PIX_FMT_MJPEG
sont fonctionnels. De toute façon, j'ai pu améliorer cela, ou est-il matériel ?
- linuxtv.org/downloads/v4l-dvb-apis/pixfmt.html ?
- Désolé, je n'étais pas assez claire, de ma faute. Je suis à la recherche d'une liste de accepté formats, sens formats de mon appareil photo accepte d'utilisation (voir mon
if
déclaration ci-dessus). Quand j'ai quelque chose qui MJPEG, lapixelformat
attribut n'est pas défini par la bibliothèque, probablement parce qu'il ne peut pas être manipulé par mon matériel.
Vous devez vous connecter pour publier un commentaire.
Dans Linux, l'utilitaire de ligne de commande v4l2-ctl affiche tous une webcam est pris en charge nativement les formats -- l'installer avec
sudo apt-get install v4l-utils
, l'exécuter avecv4l2-ctl -dX --list-formats-ext
oùX
est l'appareil photo de l'index comme dans/dev/videoX
. Ces formats sont signalés à lav4l2
module du noyau viauvcvideo
module et ils sont pris en charge nativement par la webcam chipset. Seulement la liste des formats pris en charge parv4l2
, rien d'autre aurait besoin d'être codé par l'utilisateur, et Rgb sont très rarement fournis, en dépit de pratiquement tous les CCDs de travail dans le Bayer RGGB. Les formats les plus courants sont de loin les YUV422 (YUYV ou YUY2) et MJPEG, avec un certain chevauchement: MJPEG atteindre de plus grands taux de trame pour les grandes résolutions.De code C++ pour l'inscription de la caméra formats peuvent être trouvés dans Chrome GetDeviceSupportedFormats() de la mise en œuvre de Linux ici.
Si vous devez brancher code de conversion YUV vers RGB je le recommande libyuv qui a été optimisé pour beaucoup d'architectures.
VIDIOC_ENUM_FMT
appel était ce dont j'avais besoin, etv4l2-ctl
l'utilise 🙂 Merci à vous! libyuv va probablement m'aider comme je l'ai littéralement pas toutes mes tentatives pour convertir mathématiquement. En obtenant les valeurs RVB, je vais être en mesure de tirer de l'arrière du cadre à l'aide de la SDL (et peut-être que je devrais regarder YUV superpositions...). Connaissez-vous une bibliothèque me permettant de me tirer en arrière MJPEG codé des cadres ?libyuv
prend en charge cette conversion ainsi que juste un autre espace de couleur (pixelformat, pour être plus concret), voir f.e. code.google.com/p/chromium/codesearch#chromium/src/third_party/... .libyuv
fournir des liaisons C ? Le programme que je suis en train de travailler sur n'est pas construit en C++.Afin d'énumérer les formats disponibles, vous pouvez utiliser ioctl VIDIOC_ENUM_FMT
Pour imprimer les descriptions de capture format pris en charge par
/dev/video0
vous pouvez traiter comme ceci :