Question

Y a-t-il un moyen de détecter qu'un graphe de filtre DirectShow a atteint la fin de son fichier? Par fin de fichier, je veux dire qu’un filtre-graphique avec un filtre SampleGrabber ne recevra jamais un autre appel SampleCB.

Voici certaines choses qui ne fonctionnent pas:

  • Faites confiance à IMediaDet :: get_StreamLength (on dit souvent qu'il y a plus d'images que de véritables images dans une vidéo)
  • Trust IMediaSeeking :: GetDuration (compatible avec IMediaDet, +/- une image)
  • Utilisez IMediaControl :: GetState (le graphe de filtre reste en cours d'exécution même si toutes les images ont déjà été traitées à partir d'un fichier)

Arrière-plan:

Je suis en train de traiter de la vidéo et j'ai une classe qui crée un graphe de filtre avec un SampleGrabber. Chaque fois que SampleGrabber :: SampleCB est appelé, je le bloque avec un mutex afin de pouvoir exécuter le graphe de filtrage en mode extraction. Quand je suis prêt pour une autre image, je débloque le mutex dans mon thread principal et attend que SampleGrabber :: SampleCB m'envoie un signal indiquant que c'est terminé. Pour certaines vidéos, IMediaDet :: get_StreamLength m'indique que la vidéo comporte plus d'images qu'il n'en existe réellement. Une fois que j'ai extrait la dernière image et en ai demandé une de plus, le thread principal se bloque pour toujours car SampleGrabber :: SampleCB ne sera plus jamais appelé. Je voudrais pouvoir détecter quand SampleGrabber :: SampleCB ne sera jamais appelé pour les sources de fichiers. Des applications telles que Windows Media Player peuvent le faire, car l'interface graphique indique que la vidéo s'est terminée après la dernière image réelle. Il semble donc qu'il existe un moyen de le faire.

EDIT:

J'utilise WaitForSingleObject pour implémenter le blocage du thread principal. La solution de contournement que j’utilise jusqu’à présent est de faire ce que Greg a suggéré: avoir un délai d’attente limité. Malheureusement, cela devient un peu délicat. L’attente peut échouer pour de nombreuses raisons, telles qu’un véritable eof, un système de fichiers réseau lent, une connexion réseau perdue, un décodeur lent, etc.

Était-ce utile?

La solution

Peut-être utilisez-vous l'interface IMediaEventEx ? L'un des codes d'événement est EC_COMPLETE , documenté "Toutes les données d'un flux particulier ont été rendues."

Autres conseils

En supposant que le thread principal bloque <<>> WaitForSingleObject , ne pouvez-vous pas spécifier un délai d'attente pour l'attente? Ensuite, si l'attente revient parce qu'elle a expiré plutôt que parce qu'elle a reçu un signal, vous saurez que c'est la dernière image.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top