IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut 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é
    Avatar de Garvelienn
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2016
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2016
    Messages : 244
    Points : 993
    Points
    993
    Par défaut
    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
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    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 sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    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 averti

    Homme Profil pro
    https://framagit.org/ericb/documents
    Inscrit en
    Décembre 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : https://framagit.org/ericb/documents

    Informations forums :
    Inscription : Décembre 2018
    Messages : 41
    Points : 305
    Points
    305
    Billets dans le blog
    8
    Par défaut
    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ɔᴉɹə

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

    https://framagit.org/ericb

    https://github.com/ebachard

  6. #6
    Membre averti

    Homme Profil pro
    https://framagit.org/ericb/documents
    Inscrit en
    Décembre 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : https://framagit.org/ericb/documents

    Informations forums :
    Inscription : Décembre 2018
    Messages : 41
    Points : 305
    Points
    305
    Billets dans le blog
    8
    Par défaut 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ɔᴉɹə

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

    https://framagit.org/ericb/documents

    https://github.com/ebachard

  7. #7
    Membre averti

    Homme Profil pro
    https://framagit.org/ericb/documents
    Inscrit en
    Décembre 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : https://framagit.org/ericb/documents

    Informations forums :
    Inscription : Décembre 2018
    Messages : 41
    Points : 305
    Points
    305
    Billets dans le blog
    8
    Par défaut L'enregistrement Vidéo + Audio commence à fonctionner
    Bonjour,

    Tout d'abord, je réponds à la question initiale : l'enregistrement vidéo avec OpenCV dans mon logiciel utilise ffmpeg (et ça ne répond pas à la question), mais il est possible d'utiliser gstreamer à la place avec les versions récentes d'OpenCV (voir dans le fichier capturedev.cpp placé dans src/Inputs



    Par ailleurs, souhaite signaler une importante mise à jour (mais ce n'est pas encore terminé).



    Rien que pour l'onglet retard, on peut maintenant :

    - choisir une source d'images parmi : webcam, flux RTSP, une vidéo, ou un téléphone Android sur lequel est installé DroidCam
    - enregistrer les images (pas encore dans tous les cas, mais je ne désespère pas d'y arriver)
    - détecter toutes les sources audio enregistrables
    - sélectionner une source audio parmi les sources audio enregistrables
    - enregistrer son + vidéo dans deux fichiers séparés
    - assembler les 2 avec (presque) une bonne synchro (attention : ce n'est pas DU TOUT fiable pour l'instant, mais je ne suis pas loin).

    Tout est là : Projet miniDart, en particulier voir audiomanager.cpp et audiodevice.cpp (qui se trouvent dans src/Audio). L'utilisation se fait dans miniDart.cpp (qui se trouve dans src/Application

    + voir aussi l'aide qui m'a été apportée sur le forum de SDL2 (chercher ericb).

    N.B. : il faut compiler soi-même le code sous Linux, mais je compte fournir une version Windows bientôt (il me reste 3 gros bugs à corriger avant).


    Me contacter en privé si vous avez des questions sur le sujet

Discussions similaires

  1. [Débutant] Capture d'un screen d'une vidéo sans lecture de la vidéo.
    Par Chycken dans le forum C#
    Réponses: 4
    Dernier message: 07/11/2011, 09h37
  2. Modifier le codage des pixels pour capture vidéo
    Par supergrey dans le forum DirectX
    Réponses: 10
    Dernier message: 27/08/2005, 10h48
  3. [html] zone de texte sans saisie possible
    Par Silvia12 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 01/08/2005, 16h37
  4. Ré-installation (du systeme) sans formatage, possible ?
    Par __fabrice dans le forum Administration système
    Réponses: 11
    Dernier message: 11/04/2005, 12h32
  5. MDI sans MFC, possible ?
    Par delire8 dans le forum MFC
    Réponses: 4
    Dernier message: 17/06/2002, 07h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo