Partager via


Production de données dans un filtre de capture

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

Cette rubrique décrit comment un filtre de capture DirectShow personnalisé doit générer des données de sortie.

Filtrer les modifications d’état

Un filtre de capture doit produire des données uniquement lorsque le filtre est en cours d’exécution. N’envoyez pas de données à partir de vos broches lorsque le filtre est suspendu. En outre, retournez VFW_S_CANT_CUE à partir de la méthode CBaseFilter::GetState lorsque le filtre est suspendu. Cette valeur de retour informe le Gestionnaire du graphe de filtre qu’il ne doit attendre aucune donnée de votre filtre pendant que le filtre est suspendu. Pour plus d’informations, consultez Filtrer les états.

Le code suivant montre comment implémenter la méthode IMediaFilter::GetState :

CMyVidcapFilter::GetState(DWORD dw, FILTER_STATE *pState)
{
    CheckPointer(pState, E_POINTER);
    *pState = m_State;
    if (m_State == State_Paused)
    {
        return VFW_S_CANT_CUE;
    }
    else
    {
        return S_OK;
    }
}

Contrôle des flux individuels

Les broches de sortie d’un filtre de capture doivent prendre en charge l’interface IAMStreamControl , afin qu’une application puisse activer ou désactiver chaque broche individuellement. Par exemple, une application peut afficher un aperçu sans capturer, puis basculer en mode capture sans reconstruire le graphe de filtre. Vous pouvez utiliser la classe CBaseStreamControl pour implémenter cette interface.

Horodatages

Lorsque le filtre capture un exemple, horodatage de l’exemple avec l’heure de flux actuelle. L’heure de fin est l’heure de début plus la durée. Par exemple, si le filtre capture à dix échantillons par seconde et que le temps de flux est de 200 000 000 unités lorsque le filtre capture l’échantillon, les horodatages doivent être de 2000000000 et 2010000000. (Il y a 10 000 000 unités par seconde.)

Pour calculer l’heure du flux, appelez la méthode IReferenceClock::GetTime pour obtenir l’heure de référence actuelle, puis sous-analysez l’heure de début d’origine. Vous pouvez également appeler la méthode CBaseFilter::StreamTime , qui effectue le même calcul. Pour définir l’horodatage sur un exemple, appelez la méthode IMediaSample::SetTime .

Toutefois, si le filtre a une épingle d’aperçu, les exemples de l’épingle d’aperçu ne doivent pas avoir d’horodatages. La raison en est que les échantillons atteignent toujours le convertisseur un peu après le moment de la capture. Si les échantillons sont horodatés, le convertisseur les traite en retard et peut essayer de rattraper le retard en supprimant les échantillons. (Pour plus d’informations, consultez Filtres de capture vidéo DirectShow.) Notez que l’interface IAMStreamControl nécessite que l’épingle effectue le suivi des exemples d’heures. Pour une broche d’aperçu, vous devrez peut-être modifier l’implémentation afin qu’elle ne repose pas sur les horodatages.

Les horodatages doivent toujours augmenter d’un échantillon à l’autre. Cela est vrai même lorsque le filtre s’interrompt. Si le filtre s’exécute, s’interrompt, puis s’exécute à nouveau, le premier exemple après la pause doit avoir un horodatage plus grand que le dernier exemple avant la pause.

Selon les données que vous capturez, il peut être approprié de définir l’heure du média sur les exemples.

Pour plus d’informations, consultez Heure et horloges dans DirectShow.

Filtres de capture vidéo DirectShow

Heure et horloges dans DirectShow

Écriture de filtres de capture