2016-03-07 1 views
0

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).

Répondre

0

Si vous souhaitez créer une véritable topologie, vous devez libérer tous les objets MediaFoundation (source, récepteur, topologie, etc.).

Sinon, cela peut être un peu compliqué.

+0

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

+0

Ou est-ce que je réinitialise la session média avec une topologie 'NULL' et un indicateur' MFSESSION_SETTOPOLOGY_CLEAR_CURRENT'? – YePhIcK

+0

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