Configuration des profils et d’autres propriétés de fichier (QASF)
Les éléments suivants décrivent comment effectuer diverses tâches liées à la création de fichiers ASF.
Création d’un profil (QASF)
Pour créer un profil personnalisé, utilisez directement le Kit de développement logiciel (SDK) Windows Media Format pour créer un objet de gestionnaire de profils à l’aide de la fonction WMCreateProfileManager . Ensuite, créez le profil et passez-le à l’enregistreur ASF WM à l’aide de la méthode IConfigASFWriter::ConfigureFilterUsingProfile . Il s’agit de la seule façon de configurer le filtre avec un profil qui utilise les codecs Windows Media Audio et Video 9 Series. Les profils système des versions antérieures de ces codecs peuvent être ajoutés à l’aide de la méthode IConfigASFWriter::ConfigureFilterUsingProfileGuid .
Ajout de métadonnées (QASF)
Pour ajouter des métadonnées à un fichier, appelez QueryInterface à partir de l’interface IBaseFilter sur l’enregistreur ASF WM pour récupérer l’interface IWMHeaderInfo . Une fois qu’un profil a été attribué au filtre, utilisez les méthodes d’interface IWMHeaderInfo pour écrire les métadonnées.
Indexation d’un fichier (QASF)
L’enregistreur ASF WM crée des fichiers indexés temporellement par défaut. Pour créer un fichier indexé par frame, utilisez la méthode IConfigAsfWriter::SetIndexMode pour désactiver toute l’indexation, puis créez le fichier. Une fois l’opération terminée, utilisez directement le Kit de développement logiciel (SDK) Windows Media Format pour créer un index basé sur une trame pour le fichier.
Exécution de l’encodage Two-Pass (QASF)
L’encodage à deux passes est pris en charge uniquement sur les codecs Windows Media de la version 8 et ultérieure. Placez l’enregistreur ASF WM en mode de prétraitement en appelant IConfigAsfWriter2::SetParam et en spécifiant AM_CONFIGASFWRITER_PARAM_MULTIPASS dans le paramètre dwParam et TRUE dans le paramètre dwParam1 .
Ensuite, exécutez le graphique de filtre. Lorsque tous les passes de prétraitement sont terminées (en général, une seule passe de prétraitement est effectuée), l’application reçoit un événement EC_PREPROCESS_COMPLETE du filtre. Lorsque cet événement est reçu, utilisez IMediaSeeking::SetPositions pour réinitialiser le pointeur de flux au début, puis réexécutez le graphique de filtre. Après la dernière passe (généralement la deuxième passe), l’application reçoit un événement EC_COMPLETE pour indiquer que le processus d’encodage est terminé. Si un passage de prétraitement est annulé avant la réception de l’événement EC_PREPROCESS_COMPLETE , appelez IConfigAsfWriter2::ResetMultiPassState pour réinitialiser le filtre avant de tenter une autre exécution de prétraitement.
Il est nécessaire d’appeler IConfigAsfWriter::SetParam(AM_CONFIGASFWRITER_PARAM_MULTIPASS, FALSE) uniquement si vous souhaitez sortir complètement le filtre du mode de prétraitement.
Important
Il incombe à l’application d’activer le mode de prétraitement en fonction du profil qui sera utilisé pour l’encodage. Certains profils nécessitent un encodage à deux passes ; si vous tentez d’encoder un fichier avec ce profil et que vous ne définissez pas AM_CONFIGASFWRITER_PARAM_MULTIPASS sur TRUE, une erreur de EC_USERABORT se produit. Pour plus d’informations sur la façon de déterminer si un profil donné nécessite un encodage à deux passes, consultez Utilisation de l’encodage Two-Pass ou écriture de flux à débit binaire variable.
Obtention et définition des propriétés de la mémoire tampon au moment de l’exécution (QASF)
Dans certains scénarios, par exemple si vous souhaitez forcer l’insertion d’images clés lors de l’écriture d’un fichier, une application peut avoir besoin d’obtenir ou de définir des informations sur une mémoire tampon Windows Media au moment de l’exécution. Les filtres WM ASF Reader et WM ASF Writer prennent tous deux en charge un mécanisme de rappel qui permet à une application d’accéder à l’interface INSSBuffer3 sur chaque mémoire tampon de média individuelle lors de la lecture ou de l’écriture de fichiers. Les applications peuvent utiliser cette interface pour désigner des exemples spécifiques en tant que trames clés, ou points propres, pour définir des codes de temps SMPTE, spécifier des paramètres entrelacées ou ajouter n’importe quel type de données privées à un flux.
Utilisez l’interface IAMWMBufferPass pour vous inscrire aux rappels à partir de l’épingle qui gère le flux vidéo. Lorsque l’épingle appelle votre méthode IAMWMBufferPassCallback::Notify , examinez les horodatages sur la mémoire tampon et, le cas échéant, appelez INSSBuffer3::SetProperty pour définir la propriété WM_SampleExtensionGUID_OutputCleanPoint sur la mémoire tampon sur TRUE.
Prise en charge des pixels non carrés (QASF)
L’enregistreur ASF WM se connecte à un filtre amont, tel que le décodeur DV, qui génère des informations sur les proportions des pixels. L’enregistreur ASF WM écrit ces informations en tant qu’extensions d’unités de données pour chaque exemple du fichier.
Lorsque le lecteur ASF WM rencontre des informations sur les proportions des pixels dans l’en-tête de fichier ou dans les extensions d’unités de données pour les exemples, il propose un type de média VIDEOINFOHEADER2 comme premier choix sur sa broche de sortie. Les membres dwPictAspectRatioX et dwPictAspectRatioY de la structure, qui décrivent les proportions du rectangle vidéo, seront correctement ajustés pour prendre en compte les proportions de pixels.
Maintenance du format entrelacé
Si vous capturez une vidéo entrelacée à partir d’un téléviseur ou d’une caméra DV, vous pouvez conserver la vidéo d’origine en tant que champs indépendants si vous vous attendez à ce que le fichier codé soit lu sur un téléviseur ou un autre appareil d’affichage entrelacé. (Les moniteurs d’ordinateur sont des appareils d’analyse progressive.) Si vous désinterlacez une vidéo, puis la réinterlacez pour la lire sur un téléviseur, une perte de données sera occasionnée. Dans un fichier ASF, les informations d’entrelacement sont stockées en tant qu’extensions d’unités de données que l’application applique à chaque exemple à l’aide de la méthode IAMWMBufferPassCallback décrite précédemment. Pour encoder un fichier qui conserve les paramètres d’interlacement d’origine, procédez comme suit :
- Implémentez une classe qui prend en charge IAMWMBufferPassCallback et écrivez une fonction Notify qui définit les indicateurs d’entrelacement pour chaque exemple. Cette fonction sera appelée par l’enregistreur ASF WM avant qu’il traite chaque exemple.
// Set to WM_CT_TOP_FIELD_FIRST if that is your format.
BYTE flag = WM_CT_INTERLACED | WM_CT_BOTTOM_FIELD_FIRST;
HRESULT hr = pNSSBuffer3->SetProperty(WM_SampleExtensionGUID_ContentType, (void*) &flag, WM_SampleExtension_ContentType_Size);
- Définissez les extensions d’unité de données sur le profil avant de passer le profil au filtre.
hr = pWMStreamConfig2->AddDataUnitExtension( WM_SampleExtensionGUID_ContentType, WM_SampleExtension_ContentType_Size, NULL, 0 );
- Après avoir configuré le filtre avec le profil, obtenez l’interface IWMWriterAdvanced2 à partir de l’enregistreur WM ASF et appelez la méthode SetInputSettings .
// Must do this first.
hr = pConfigAsfWriter2->ConfigureFilterUsingProfile(pProfile);
CComPtr<IServiceProvider> pProvider;
CComPtr<IWMWriterAdvanced2> pWMWA2;
hr = pConfigAsfWriter2->QueryInterface( __uuidof(IServiceProvider),
(void**)&pProvider);
if (SUCCEEDED(hr))
{
hr = pProvider->QueryService(IID_IWMWriterAdvanced2,
IID_IWMWriterAdvanced2,
(void**)&pWMWA2);
}
BOOL pValue = TRUE;
// Set the first parameter to your actual input number.
hr = pWMWA2->SetInputSetting(0, g_wszInterlacedCoding,
WMT_TYPE_BOOL, (BYTE*) &pValue, sizeof(WMT_TYPE_BOOL));