Lecture de fichiers avec le lecteur synchrone

[La fonctionnalité associée à cette page, le Kit de développement logiciel (SDK) Windows Media Format 11, est une fonctionnalité héritée. Il a été remplacé par le lecteur source et l’enregistreurrécepteur. Le lecteur source et l’enregistreur récepteur ont été optimisés pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise le lecteur source et l’enregistreur récepteur au lieu du Kit de développement logiciel (SDK) Windows Media Format 11, lorsque cela est 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.]

Vous pouvez utiliser le lecteur synchrone pour lire un fichier ASF à l’aide d’appels synchrones au lieu des méthodes asynchrones dans l’objet reader. L’utilisation d’appels synchrones réduit le nombre de threads requis pour lire un fichier. Le lecteur asynchrone utilise plusieurs threads pour le traitement des flux. Pour les fichiers avec plusieurs flux, le nombre de threads utilisés peut devenir très important. Le lecteur synchrone n’utilise qu’un seul thread.

Le lecteur synchrone a été conçu pour répondre aux besoins des applications de création de contenu et d’édition de fichiers. Vous pouvez utiliser le lecteur synchrone pour d’autres applications, mais ses fonctionnalités sont limitées.

Le lecteur synchrone peut ouvrir des fichiers locaux ou des fichiers sur un réseau à l’aide du nom de chemin d’accès UNC (par exemple, « \\someshare\somedirectory\somefile.wmv »). Vous ne pouvez pas diffuser en continu des fichiers vers le lecteur synchrone ou ouvrir des fichiers à partir d’un emplacement Internet. Le lecteur synchrone prend également en charge l’utilisation de l’interface COM IStream en tant que source.

Le lecteur synchrone offre une plus grande polyvalence pour récupérer des exemples à partir d’un fichier ASF que le lecteur asynchrone. Le lecteur synchrone peut remettre des échantillons par numéro de flux ainsi que par sortie. Les échantillons remis par numéro de flux peuvent être compressés ou décompressés. Le lecteur synchrone peut également basculer entre la distribution compressée et non compressée pendant la lecture ; cette fonctionnalité est appelée « édition rapide ». Cette fonctionnalité permet à une application d’édition de lire du contenu Windows Media et de le transmettre directement à l’enregistreur jusqu’à ce qu’une image souhaitée soit atteinte. À ce stade, l’application peut indiquer au lecteur de commencer à distribuer du contenu non compressé, que l’application peut ensuite modifier et passer au writer pour la recompression. Une fois que l’application a terminé de modifier les images spécifiées, elle peut indiquer au lecteur de commencer à remettre à nouveau des images compressées.

Les fonctionnalités les plus basiques de l’objet lecteur synchrone peuvent être décomposées en étapes suivantes. Dans ces étapes, « l’application » fait référence au programme que vous écrivez à l’aide du Kit de développement logiciel (SDK) au format Windows Media.

  1. L’application transmet au lecteur synchrone le nom d’un fichier à lire. Lorsque le lecteur synchrone ouvre le fichier, il affecte un numéro de sortie à chaque flux. Si le fichier utilise l’exclusion mutuelle, le lecteur affecte une seule sortie pour tous les flux mutuellement exclusifs.
  2. L’application obtient des informations sur la configuration des différentes sorties du lecteur. Les informations collectées permettront à l’application de restituer correctement les exemples de médias.
  3. L’application commence à demander des exemples, un par un, à partir du lecteur synchrone. Le lecteur synchrone remet chaque exemple dans un objet de mémoire tampon pour lequel il fournit l’interface INSSBuffer .
  4. L’application est responsable du rendu des données après leur remise par le lecteur. Le Kit de développement logiciel (SDK) au format Windows Media ne fournit aucune routine de rendu. En règle générale, les applications utilisent d’autres sdk pour afficher des données, comme le Kit de développement logiciel (SDK) Microsoft Direct X ou les fonctions multimédias de Microsoft SDK de plateforme Windows.

Ces étapes sont illustrées dans l’exemple d’application WMSyncReader. Pour plus d’informations, consultez Exemples d’applications.

Le lecteur synchrone prend également en charge des fonctionnalités plus avancées. Le lecteur synchrone vous permet d’effectuer les opérations suivantes :

  • Spécifiez une plage d’échantillons à récupérer par heure ou par numéro d’image.
  • Contrôlez la sélection de flux pour les flux qui s’excluent mutuellement.
  • Ouvrez un fichier à l’aide de l’interface COM standard, IStream.
  • Lit les données de profil à partir de l’en-tête de fichier.
  • Lire les métadonnées de l’en-tête de fichier.
  • Basculer entre les exemples de flux et de sortie pendant la lecture.
  • Basculer entre les exemples de flux compressés et non compressés pendant la lecture.

Les sections suivantes décrivent en détail l’utilisation de l’objet lecteur synchrone.

Exemple de code

L’exemple de code suivant montre comment lire des exemples à partir d’un fichier ASF à l’aide du lecteur synchrone. Il spécifie par numéro de trame une plage d’échantillons à livrer.

IWMSyncReader* pSyncReader = NULL;
INSSBuffer*    pMyBuffer   = NULL;

QWORD cnsSampleTime = 0;
QWORD cnsSampleDuration = 0;
DWORD dwFlags = 0;
DWORD dwOutputNumber;
HRESULT hr = S_OK;

// Initialize COM.
hr = CoInitialize(NULL);

// Create a synchronous reader.
hr = WMCreateSyncReader(NULL, WMT_RIGHT_PLAYBACK, &pSyncReader);

// Open an ASF file.
hr = pSyncReader->Open(L"c:\\somefile.wmv");

// TODO: Identify the properties for each output. This works 
// exactly as it does with the asynchronous reader.

// Specify a playback range from frame number 100 of the video 
// stream to the end of the file. Assume that the video stream 
// is stream number 2.
hr = pSyncReader->SetRangeByFrame(2, 100, 0);

// Loop through all the samples in the specified range.
do
{
   // Get the next sample, regardless of its stream number.
   hr = pSyncReader->GetNextSample(0,
                                   &pMyBuffer,
                                   &cnsSampleTime,
                                   &cnsSampleDuration,
                                   &dwFlags,
                                   &dwOutputNumber,
                                   NULL);

   if(SUCCEEDED(hr))
   {
      // TODO: Process the sample in whatever way is appropriate 
      // to your application. When finished, clean up.
      pMyBuffer->Release();
      pMyBuffer = NULL;
      cnsSampleTime     = 0;
      cnsSampleDuration = 0;
      dwFlags           = 0;
      dwOutputNumber    = 0;
   }
} 
while (SUCCEEDED(hr));

pSyncReader->Release();
pSyncReader = NULL;

IWMSyncReader, interface

Lecture de fichiers ASF

Lecteur synchrone, objet