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

DirectX Discussion :

comment controler le changement de video


Sujet :

DirectX

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Septembre 2006
    Messages : 36
    Points : 32
    Points
    32
    Par défaut comment controler le changement de video
    bonjour a tous et a toutes
    je suis entrain de develloper un lecteur de video sous direct show

    j'arrive a lire et controler ma video comme je le souhaite mais je rencontre des problems pour controler le changement de video.

    Voila une partie du code de mon cpp
    Code :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
        #include "StdAfx.h"
     
    #include "strmif.h"
    #include "MediaReader.h"
    #pragma once
    #define WIN32_LEAN_AND_MEAN
    #define _WIN32_WINNT 0x0501
    #pragma warning(disable : 4995)
    #ifdef _DEBUG
    #pragma comment(lib, "strmbasd")
    #else
    #pragma comment(lib, "strmbase")
    #endif
    #include <windows.h>
    #include <stdio.h>
    #include "dshow.h"
    #include "MediaReader.h"
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    MediaReader::MediaReader(void),
    {
        g_pGraph   = NULL;
        g_pControl = NULL;
        g_pEvent   = NULL;
        g_pSeek   = NULL;
        g_pIVideoWindow= NULL;
        g_pIVideoFrameStep=NULL;
        g_pIBasicVideo=NULL; 
        g_pIBasicAudio=NULL;
        HRESULT hr = S_OK;
        hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
        if(FAILED(hr))
            AfxMessageBox("Error: An error has occured during the COM Initializing",MB_ICONERROR);
        hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,IID_IGraphBuilder, (void**)&g_pGraph);
        if(FAILED(hr))
            AfxMessageBox("Error: An error has occured during the Instance Creation",MB_ICONERROR);
        hr = g_pGraph->QueryInterface(IID_IMediaControl, (void **)&g_pControl);
        if(FAILED(hr))
            AfxMessageBox("Error: An error has occured during the linking of Media Control",MB_ICONERROR);
        hr = g_pGraph->QueryInterface(IID_IMediaEvent,   (void **)&g_pEvent);
        if(FAILED(hr))
            AfxMessageBox("Error: An error has occured during the linking of Media Event",MB_ICONERROR);
        hr = g_pGraph->QueryInterface(IID_IMediaSeeking, (void **)&g_pSeek);
        if(FAILED(hr))
            AfxMessageBox("Error: An error has occured during the linking of Media Seeking",MB_ICONERROR);
        hr = g_pGraph->QueryInterface(IID_IMediaPosition, (void **)&g_pPosition);
        if(FAILED(hr))
            AfxMessageBox("Error: An error has occured during the linking of Media Position",MB_ICONERROR);
        hr = g_pGraph->QueryInterface(IID_IVideoWindow, (void **)&g_pIVideoWindow);
        if(FAILED(hr))
            AfxMessageBox("Error: An error has occured during the linking of Media Position",MB_ICONERROR);
        hr = g_pGraph->QueryInterface(IID_IVideoFrameStep, (void **)&g_pIVideoFrameStep);
        if(FAILED(hr))
            AfxMessageBox("Error: An error has occured during the linking of Video Frame Step",MB_ICONERROR);
        hr = g_pGraph->QueryInterface(IID_IBasicVideo, (void **)&g_pIBasicVideo);
        if(FAILED(hr))
            AfxMessageBox("Error: An error has occured during the linking of Basic Video",MB_ICONERROR);
        hr = g_pGraph->QueryInterface(IID_IBasicAudio, (void **)&g_pIBasicAudio);
        if(FAILED(hr))
            AfxMessageBox("Error: An error has occured during the linking of Basic Audio",MB_ICONERROR);
     
     
     
        g_pGraph->RenderFile(L"Title 1-Chapter 1-0.avi", NULL);
        g_pSeek->SetTimeFormat(&TIME_FORMAT_FRAME);
        SetState(Uninitialized);
    }
    void MediaReader::ReleaseInterface()
    {
        if(g_pSeek)
            g_pSeek->Release();
     
        if(g_pPosition)
            g_pPosition->Release();
     
        if(g_pEvent)
            g_pEvent->Release();
     
        if(g_pControl)
            g_pControl->Release();
     
        if(g_pIVideoWindow)
            g_pIVideoWindow->Release();
     
        if(g_pGraph)
            g_pGraph->Release();
    }
     
    [/LEFT]
    et mon .h
    Code :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
         #pragma once
     
    struct IGraphBuilder;
    struct IVideoWindow;
    struct IMediaEventEx;
    struct IMediaControl;
    struct IMediaSeeking;
    struct IMediaPosition;
    struct IVideoFrameStep;
    struct IBasicAudio;
    struct IBasicVideo; 
    //------------------------------------------------------------------------------
    // Global data
    //------------------------------------------------------------------------------
     
    // DirectShow Graph state
    enum GRAPH_STATE 
    {
        Uninitialized = 0, 
        Graph_Stopped1, // stopped without reset 
        Graph_Stopped2, // stopped with reset
        Nav_Stopped,
        Playing,
        Graph_Paused,
        Nav_Paused,
        Scanning
    } ;
     
    class MediaReader
    {
    private:
     
        IGraphBuilder* g_pGraph;
        IMediaControl* g_pControl;
        IMediaEventEx* g_pEvent;
        IMediaSeeking* g_pSeek;
        IMediaPosition* g_pPosition;
        IVideoWindow * g_pIVideoWindow;
        IBasicVideo * g_pIBasicVideo; 
        IBasicAudio * g_pIBasicAudio;
        IVideoFrameStep  * g_pIVideoFrameStep;
        GRAPH_STATE m_eState; 
        LONGLONG calctotaltime(DVD_HMSF_TIMECODE time);
     
     
    public:
        MediaReader(void);
        ~MediaReader(void);
        void ReleaseInterface();
        void CheckFormatSupported();
        bool GetCapbilities();
        void CheckCurrentFormat();
        HRESULT play();
        HRESULT stop();
        HRESULT pause();
        HRESULT playtime(DVD_HMSF_TIMECODE time);
        HRESULT framestepforward();
        HRESULT framestepbackward();
        HRESULT rewind();
        HRESULT fastforward(double rate);
        DVD_HMSF_TIMECODE GetTime();
        inline GRAPH_STATE GetState(void) { return m_eState; };
        inline void SetState(GRAPH_STATE state) { m_eState = state; };
        afx_msg void OnClose();
    };[/LEFT]
    Mon problem est que quand je ferme la fenetre de la video, la video continue mais sans que je vois la fenetre,
    je peu continuer a faire toute mes mesures de temps etc...

    J'ai reussis a controler la reaparition de la video, mais je n'arrive pas a cahnger la lecture de la video qui est entrain d'etre lu... le plus proche que j'arrive et que le programe lance une nouvelle fenetre avec la nouvelle video dedans

    et ce que quelqu'un sais comment cahnger le fichier dans le graph ou carrement comment le detruire pour le remplacer par une nouvelle fenetre?

    Des idees?

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Salut.

    Plusieurs choses:

    - Si tu n'utilises pas une fenêtre personnalisée, alors directshow en fournit une par défaut. Tu dois créer une fenêtre et utiliser l'interface "IBasicVideo" pour signaler au graphe que tu souhaites produire la vidéo dans cette fenêtre. Tu pourras ainsi contrôler le graphe lors de la fermeture de celle-ci.

    - Tu dois stopper la vidéo avant de release les interfaces (rajoutes stop(); dans la fonction ReleaseInterface(); au tout début).

    - A la fermeture de la fenêtre, tu dois gérer le message WM_CLOSE et appeler la fonction ReleaseInterface();.

Discussions similaires

  1. [M1][W1][N1][D1] Comment détecter un changement de résolution?
    Par jazz matazz dans le forum Contribuez
    Réponses: 6
    Dernier message: 04/03/2006, 21h20
  2. Comment garder un changement actif??
    Par Le Rebel dans le forum Langage
    Réponses: 3
    Dernier message: 02/02/2006, 11h02
  3. Comment controler l'insertion de record dans ma table?
    Par einegel dans le forum Bases de données
    Réponses: 7
    Dernier message: 22/11/2004, 18h29
  4. [Langue Clavier] Comment détecter le changement de la langue ?
    Par Fares BELHAOUAS dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 30/09/2004, 19h26
  5. Comment détecter un changement du réglage de voume sonore ?
    Par mjlub dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 09/01/2004, 17h43

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