J'ai configuré une session WMF (construit un objet IMFTopology
avec une source pointant vers une webcam et un EVR standard pour la sortie d'écran), l'ai affecté à un IMFMediaSession
et j'ai lancé un aperçu . Tout fonctionne très bien.Comment réinitialiser la topologie pour la résolution de webcam modifiée (WMF)
Maintenant, j'arrête la session (en attente de l'arrêt réel), changer la résolution de la source (réglage d'une appropriée IMFMediaType
via son IMFMediaTypeHandler
), puis construire une nouvelle topologie avec cette nouvelle source et un objet IMFActivate
nouvellement créé l'EVR. Modification également de la taille de la fenêtre de sortie pour qu'elle corresponde à la nouvelle taille d'image. Lorsque je démarre cette nouvelle session, il n'y a pas d'image (ou l'image est brouillée, ou coupée en bas - dépend du changement de résolution). C'est presque comme si la nouvelle topologie essayait de réutiliser le EVR précédemment configuré et qu'il ne fonctionne pas correctement. J'ai essayé de définir ce nouveau type de support sur l'EVR lors de la génération d'un nouveau, j'ai essayé de forcer la nouvelle taille de fenêtre sur l'EVR (via un appel à SetWindowPos()
), j'ai essayé d'obtenir ce nœud de sortie par streamID
son format d'entrée préféré ... Rien n'a fonctionné - je reçois la même image noire (ou brouillée) quand je commence la lecture.
La seule fois où la "nouvelle" session est lue correctement, c'est lorsque j'ai choisi le format source d'origine. Alors ça continue comme si rien de mal ne s'était passé.
Pourquoi? Comment puis-je réparer ça?
Ne fournissant pas le code source car il n'y a pas de moyen facile de fournir simplement les pièces pertinentes. Généralement, mon code suit de près l'exemple de l'article de MSDN sur la création d'une session média pour la lecture d'un fichier.
Selon la documentation de MS, le IMFMediaSession
gère le démarrage/l'arrêt de la source, je m'en fie donc lorsque je change le format vidéo de la source (sinon l'application échoue).
Serait-il suffisant d'obtenir une topologie de la session média et de la libérer? Ou dois-je conserver le pointeur de la topologie et appeler un 'Release()' en espérant qu'il relâcherait celui assigné à la session média? – YePhIcK
Ou est-ce que je réinitialise la session média avec une topologie 'NULL' et un indicateur' MFSESSION_SETTOPOLOGY_CLEAR_CURRENT'? – YePhIcK
Oui, vous pouvez utiliser MFSESSION_SETTOPOLOGY_CLEAR_CURRENT avec NULL. Vous pouvez également libérer la session Media et la recréer. Ce n'est pas une longue tâche. – mofo77