DirectShow enregister une partie d'une video

BarthOlivier Messages postés 132 Date d'inscription mercredi 6 mars 2002 Statut Membre Dernière intervention 27 novembre 2012 - 9 févr. 2012 à 17:11
BarthOlivier Messages postés 132 Date d'inscription mercredi 6 mars 2002 Statut Membre Dernière intervention 27 novembre 2012 - 10 févr. 2012 à 11:54
Bon je sais que le sujet semble avoir été traité maintes fois (désolé d'avance) mais j'y comprend toujours rien, malgré tous les sites et livres que j'ai pu lire. (quoique livre ... on peut pas dire qu'il y'en ai beaucoup)

Je cherche a lancer la camera, regarder le flux et a partir d'un instant quelconque, enregistrer la video pour l’arrêter au bout d'un certain temps.

Oui, DirectX.Capture semble fonctionner avec sa fonction Cue(). Mais pas tout le temps. et pas sous tous les OS.
Manifestement, le relachement de la Pin de l'entrée vidéo ne fonctionne pas... C'est ce que je suppose après tout mes tests.

donc mes questions en Vracs.

1 : < Soyons fou > Quelqu'un a un code fonctionnel complet ? (free due - on peut toujours rêver)

-----------------------------------------------------------------------------------------------------------------

2 :
      hr = captureGraphBuilder.SetOutputFileName(MediaSubType.Avi, strOut, out theAviMux, out sink);
      hr = captureGraphBuilder.RenderStream(PinCategory.Capture, MediaType.Video, theDevice, theCompressor, theAviMux);
      hr = captureGraphBuilder.RenderStream(PinCategory.Preview, MediaType.Video, theDevice, null, null);


theAviMux -> Peut on lancer le mediaControl lié au GraphBuilder tout en mettant en pause theAviMux (controleur d'ecriture)
pour le lancer par la suite et ainsi contrôler l’écriture ? ( j'ai pas encore réussi)

-----------------------------------------------------------------------------------------------------------------

3 : J'ai tenté de me passer de la fonction RenderStream en connectant chaque Pin manuellement (Utilisation du SmartTee). Mais le souci est toujours le même que précédemment : Comment contrôler indépendamment un Filtre du reste du MediaControl

-----------------------------------------------------------------------------------------------------------------

4: Idée conne : on peut associer le mediaControl a autre chose que le GraphBuilder ?

-----------------------------------------------------------------------------------------------------------------

Je commence a y perdre mon Latin. Si une âme charitable passait par là et me sorte de ma torpeur ca serait cool ...

MErci d'avance et bonne soirée a tous(tes)

MisterMok

1 réponse

BarthOlivier Messages postés 132 Date d'inscription mercredi 6 mars 2002 Statut Membre Dernière intervention 27 novembre 2012 1
10 févr. 2012 à 11:54
Re moi,

J'ai essayé de regarder pour deconnecter juste le Filtre d'ecriture, mais apres je n'arrive pas à le reconnecter.


    IMediaControl mediaControl = null;
    IGraphBuilder graphBuilder = null;
    IPin PinRecordOut = null;
    IPin PinRecordIn = null;


    public void Record()
    {
      if (mediaControl != null)
      {
        playState = PlayState.Record;
        mediaControl.Stop();
        int hr = graphBuilder.Connect(PinRecordOut, PinRecordIn);
        DsError.ThrowExceptionForHR(hr); // ->> ERREUR

//Et l'erreur COM générée est :
//"Aucune combinaison de filtres intermédiaires n'a pu être trouvée pour établir la connexion.

        mediaControl.Run();
        //mediaControl.Run();
      }
    }
 //----------------------------------------------------------------------------------------------------------//
    private void _FuncPrepareRecord()
    {
      int hr;
      IBaseFilter pFilter = null;
      IEnumFilters lstFilter;

      _GraphInit(); // connexion des filtres avec RenderStream

      graphBuilder.EnumFilters(out lstFilter);

      IBaseFilter[] Filtres = new IBaseFilter[1];
      while (lstFilter.Next(1, Filtres, IntPtr.Zero) >= 0)
      {
        if (Filtres != null)
        {
          FilterInfo fInfo;
          Filtres[0].QueryFilterInfo(out fInfo);
          if (fInfo.achName == "File Writer")
          {
            pFilter = Filtres[0];
            break;
          }
        }
      }

      if (pFilter != null)
      {
        PinRecordIn = DsFindPin.ByDirection(pFilter, PinDirection.Input, 0);
        PinRecordIn.ConnectedTo(out PinRecordOut);
        PinRecordIn.Disconnect();
      }
    }


Normalement il ne devrait pas y'en avoir dans la mesure ou j'ai "théoriquement" pris les Pin connectées initialement ensemble. Je pensais avoir trouvé une piste.. manifestement pas ... donc si vous avez des idées ... ou mieux : des solutions.

Merci d'avance

MisterMok
0
Rejoignez-nous