Share via


Pour écrire des exemples

[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 lecteur source et enregistreur ré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.]

Une fois que vous avez identifié et configuré les entrées pour le fichier que vous écrivez, vous pouvez commencer à transmettre des exemples au rédacteur. Vous devez transmettre des exemples dans l’ordre de présentation, si possible, pour rendre le processus d’écriture plus efficace.

Avant de transmettre des exemples, vous devez définir l’enregistreur pour les accepter en appelant IWMWriter::BeginWriting.

Pour passer un exemple au rédacteur, effectuez les étapes suivantes :

  1. Allouez une mémoire tampon et récupérez un pointeur vers l’interface INSSBuffer en appelant IWMWriter::AllocateSample.
  2. Récupérez l’adresse de la mémoire tampon créée à l’étape 1 en appelant INSSBuffer::GetBuffer.
  3. Copiez vos données d’exemple vers l’emplacement de la mémoire tampon, en vous assurant que l’exemple passé correspondra à la mémoire tampon allouée. Vous pouvez utiliser n’importe quelle fonction de copie de mémoire pour copier vos données. Un choix courant est memcpy, qui est inclus dans la bibliothèque d’exécution C standard.
  4. Mettez à jour la quantité de données utilisée dans la mémoire tampon pour refléter la taille réelle de l’exemple en appelant INSSBuffer::SetLength.
  5. Transmettez l’interface de mémoire tampon au rédacteur, ainsi que le nombre d’entrée et l’exemple d’heure à l’aide de la méthode IWMWriter::WriteSample . Tous les exemples audio d’une entrée représentent la même durée de contenu. Vous pouvez donc déterminer l’heure de l’exemple en ajoutant la durée de l’exemple à un total d’exécution. Pour la vidéo, vous devez calculer le temps en fonction de la fréquence d’images.

WriteSample fonctionne de manière asynchrone et peut ne pas terminer l’écriture des données à partir de la mémoire tampon avant que votre application ne soit prête à appeler à nouveau la méthode. Par conséquent, il est important d’appeler AllocateSample une fois pour chaque appel à WriteSample. Toutefois, vous pouvez libérer l’interface INSSBuffer immédiatement après avoir appelé WriteSample.

Une fois que vous avez terminé de transmettre des exemples, appelez IWMWriter::EndWriting.

Note Il est important que les exemples de tous les flux du fichier soient transmis au rédacteur en synchronisation les uns avec les autres. Autrement dit, dans la mesure du possible, vous devez passer des exemples au rédacteur dans l’ordre de présentation dans la tolérance de synchronisation spécifiée dans IWMWriterAdvanced::SetSyncTolerance. Les meilleurs résultats sont obtenus lorsque les données sont fournies à chaque flux en unités d’une seconde ou moins.

Les flux doivent également se terminer à peu près en même temps. Par exemple, vous ne devez pas écrire un fichier avec un flux audio de 45 secondes et un flux vidéo de 50 secondes. Si vous encodez un tel fichier avec des entrées non modifiées, certaines des données audio à la fin du flux seront supprimées (même s’il s’agit du flux le plus court). Pour que l’encodage du fichier fonctionne, vous devez ajouter 5 secondes de silence à l’entrée audio afin qu’un flux ne se termine pas plusieurs secondes avant un autre. Il n’est pas nécessaire que les types de flux avec des exemples intermittents, tels que des flux de texte ou d’images, soient remboursés de cette façon. Les flux de commandes de script doivent également suivre toutes ces règles.

INSSBuffer, interface

IWMWriter Interface

Écriture de fichiers ASF