Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

Capture vidéo sans ffmpeg, possible ?


Sujet :

OpenCV

  1. #1
    Nouveau Candidat au Club
    Capture vidéo sans ffmpeg, possible ?
    Bonjour,
    Tout est dans le titre, sur un environnement Windows je cherche à extraire des frames d'une vidéo uniquement avec les codecs présents sur la machine de l'utilisateur.
    D’après cette doc c'est possible avec directshow http://docs.opencv.org/trunk/d0/da7/..._overview.html
    Mais je n'ai pu faire fonctionner directshow ou WMF qu'avec la webcam.
    Quelqu'un sait si c'est possible de lire un fichier vidéo avec un de ces deux backends ou si une autre solution existe?

    merci d'avance.

  2. #2
    Membre éprouvé
    Si mes souvenirs sont exactes, cv::VideoCapture utilise ffmpeg pour la lecture de fichier vidéo. C'était tout le problème avec la version Android qui n'embarquait pas ffmpeg. Il était alors seulement possible de streamer la caméra mais pas de lire des fichiers audios. J'ai été obligé de compiler ffmpeg pour Android. Les autres Video API Backends ne fonctionnaient pas.

    Donc pour répondre à la question, je dirais que ce n'est pas possible sans ffmpeg. Mais si vous trouvez un moyen, je serai intéressé également.
    «Le management, tel qu’on l’apprend dans les écoles et tel qu’on l’applique ensuite, sous prétexte de «motivation du personnel», organise exactement le contraire, à savoir la démotivation organisée.» - Bernard Stiegler

  3. #3
    Nouveau Candidat au Club
    Malheureusement en explorant le code d'opencv je vois que directshow n'est pas du tout implémenté quand on cherche à lire depuis un fichier, ce qui contredit la doc.
    En revanche WMF est implémenté mais ne marche pas pour autant. Je suis peu familier avec cette lib, mais j'avais créé un module d'extraction de frames qui lit certaines videos(notamment les wmv).
    Mais le code WMF utilisé dans opencv renvoie une erreur indiquant que le codec est inconnu.

  4. #4
    Expert éminent
    Pour savoir si directshow fonctionne ou pas , il faut utiliser GraphEdit (désolé pour le lien, mais cet outil officiel de Microsoft a été mis au placard: des sites le propose toujours)
    Il faut aussi la dll PropPage.dll (il faut passer par la ligne de commande pour enregistrer/ retirer cette DLL: regsvr32 proppage.dll)

    Ensuite, l'idée c'est de trouver un filtre d'entrée qui va lire ta webcam (et là tu le sauras si elle est supportée ou pas )
    Ensuite tu pourras soit 1) construire un graph automatiquement 2) rechercher les filtres: [demux/ interleave]-> V/A Decoders -> V/A Encoders -> (filtre bouchon comme un grabber)

  5. #5
    Membre habitué
    Bonjour,

    Oui, on peut capturer la vidéo sans ffmpeg avec OpenCV (3.4+), mais seulement les images.

    Pour illustrer ma réponse, j'ai écrit un logiciel qui fait les 2, et je peux visualiser plusieurs flux au choix :
    - issu d'une webcam (on peut en connecter plusieurs, mais une seule est affichée à la fois), visualiser avec ou sans retard, et même enregistrer
    - issu d'un fichier vidéo (sans retard, pas de sens ici) et aussi enregistrer les images seulement
    - issu d'un flux rtsp
    - issu d'un téléphone portable (avec droidcam ou équivalent installé dessus)

    Le code source n'est pas encore en ligne, car je dois le nettoyer, mais pour Windows, on peut utiliser Direct Show avec OpenCV, en définissant VideoInput et DirectShow avec les lignes suivantes :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       #ifndef HAVE_VIDEOINPUT
        #define HAVE_VIDEOINPUT
        #endif
        #ifndef HAVE_DSHOW
        #define HAVE_DSHOW
        #endif


    Ensuite, quand on initialise l'instance de la classe VideoCapture qui sera utilisée, on ajoute une constante au numéro du périphérique de capture.

    Exemple d'initialisation utilisée dans miniDart (avec la classe captureDev):

    IMPORTANT : la version Windows est obtenue par cross compilation sous Linux,
    et NATIVE_BUILD == Linux, alors que !(NATIVE_BUILD) signifie qu'il s'agit du cas spécifique à Windows

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    bool CaptureDev::Init(int aDevice)
    {
        if (maVideoCap.isOpened())
            maVideoCap.release();
     
    #ifdef NATIVE_BUILD
        // Linux
        // FIXME : propose a list of active devices
        //maVideoCap.open(maDevNumber);
        maDevNumber = aDevice;
        maVideoCap.open(maDevNumber);
    #else
        // Windows
        // http://docs.opencv.org/trunk/d0/da7/videoio_overview.html
        maVideoCap.open(maDevNumber + cv::CAP_DSHOW);
    #endif /* NATIVE_BUILD */
     
        if (!maVideoCap.isOpened() || !bFirstFrameSuccess())
            std::cerr << "***Could not initialize capturing...***" << std::endl;
     
    #if defined(_WIN32) || defined (WIN32)
        // works only on Windows
        setFourCC(CV_FOURCC('M','J','P','G'));
    #endif
     
        initializeFrameSize();
     
    #ifdef NATIVE_BUILD
        setCaptureFPS(LINUX_DEFAULT_FRAMERATE);
    #endif
     
        mfCaptureFPS = getCaptureFPS();
     
        return true;
    }



    Pour tester pour de vrai, voir ma signature et chercher miniDart sur framagit (une version Windows 7+ est disponible pour tests)

    Excellentes fêtes de fin d'années


    --
    q&#596;&#7433;&#633;&#601;

    L'association EducOOo : http://www.educoo.org

    https://framagit.org/ericb

    https://github.com/ebachard

  6. #6
    Membre habitué
    Son avec OpenCV
    Bonjour,

    J'ai écrit un billet de blog sur le sujet : on ne peut pas enregistrer le son avec OpenCV mais on peut enregistrer image et son synchronisés (au moins sous Linux).

    Voir mon récent billet de blog sur le sujet :

    https://www.developpez.net/forums/bl...x-prix-webcam/

    J'ai aussi expliqué comment faire sous Windows.

    Surtout n'hésitez pas à venir aider :-)


    --
    q&#596;&#7433;&#633;&#601;

    L'association EducOOo : http://www.educoo.org

    https://framagit.org/ericb/documents

    https://github.com/ebachard

###raw>template_hook.ano_emploi###