Capturer DV sur RVB non compressé
[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.]
Cet exemple montre comment capturer des DV à partir du caméscope et l’enregistrer dans un fichier en tant que RVB non compressé lors de la préversion. Utilisez le graphique de filtres illustré dans le diagramme suivant.
Le filtre Splitter DV fractionne l’audio/vidéo entrelacé en flux vidéo et audio distincts La vidéo encodée en DV accède au filtre Décodeur vidéo DV , qui génère une vidéo RVB non compressée. La vidéo RVB est acheminée via le filtre Smart Tee vers le filtre AVI Mux (pour la capture) et le convertisseur vidéo (pour la préversion). Pendant ce temps, le flux audio du splitter DV passe par le filtre Infinite Pin Tee vers l’AVI Mux et le convertisseur audio. Le Gestionnaire de graphe de filtres conserve tous ces flux synchronisés, à l’aide des horodatages sur les exemples et de l’horloge de référence du graphique.
Ce graphique peut sembler inutilement compliqué, mais il garantit que le flux vidéo encodé en DV n’est décodé qu’une seule fois, ce qui réduit les besoins en processeur. Notez également que la vidéo passe par le filtre Smart Tee tandis que l’audio passe par le filtre Infinite Pin Tee. Le Smart Tee peut supprimer des images d’aperçu pour améliorer les performances de capture, ce qui est souhaitable pour la vidéo, mais pas pour l’audio, où les échantillons supprimés sont très visibles. En outre, étant donné que l’audio nécessite une bande passante beaucoup plus faible que la vidéo, il y a relativement peu de chances de supprimer l’audio dans le fichier.
Vous devez générer ce graphique une section à la fois, mais la méthode RenderStream peut toujours vous aider. Utilisez le code suivant :
// Build the file-writing section of the graph.
hr = pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,
OLESTR("C:\\Example3.avi"), &pMux, 0);
// MSDV to DV splitter.
IBaseFilter *pDVSplit; // Create the DV Splitter (CLSID_DVSplitter)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pDV, 0, pDVSplit);
// Splitter to DV Decoder to Smart Tee.
IBaseFilter *pDVDec; // Create the DV Decoder (CLSID_DVVideoCodec)
IBaseFilter *pSmartTee; // Create the Smart Tee (CLSID_SmartTee)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Video, pDVSplit, pDVDec,
pSmartTee);
// Smart Tee (video) to Avi Mux.
IPin *pPin1;
hr = pBuilder->FindPin(pSmartTee, PINDIR_OUTPUT, 0, 0, TRUE, 0, &pPin1);
hr = pBuilder->RenderStream(0, 0, pPin1, 0, pMux);
// Smart Tee to preview.
IPin *pPin2;
hr = pBuilder->FindPin(pSmartTee, PINDIR_OUTPUT, 0, 0, TRUE, 1, &pPin2);
hr = pBuilder->RenderStream(0, 0, pPin2, 0, pMux);
// DV Splitter (audio) to Infinite Tee to Avi Mux.
IBaseFilter *pTee; // Create the Infinite Pin Tee (CLSID_InfTee)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Audio, pDVSplit, pTee, pMux);
// Infinite Pin Tee to preview.
hr = pBuilder->RenderStream(0, 0, pTee, 0, 0);
Vous devez créer les filtres Splitter DV, DV Video Décodeur, Smart Tee et Infinite Pin Tee, et ajouter chacun d’eux au graphique de filtres. (Par souci de concision, ces étapes sont omises du code précédent.) Cet exemple utilise la méthode ICaptureGraphBuilder2::FindPin pour rechercher les broches de capture et d’aperçu sur le filtre Smart Tee ; la capture est toujours la broche de sortie 0, et l’aperçu est la broche de sortie 1.
Rubriques connexes