Leer archivos con el lector sincrónico

[La característica asociada a esta página, SDK de Windows Media Format 11, es una característica heredada. Se ha reemplazado por lector de origen y escritor receptor. El lector de origen y el sistema de escritura receptor se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use lector de origen y escritor receptor en lugar del SDK de Windows Media Format 11, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Puede usar el lector sincrónico para leer un archivo ASF mediante llamadas sincrónicas en lugar de los métodos asincrónicos en el objeto lector. El uso de llamadas sincrónicas reduce el número de subprocesos necesarios para leer un archivo. El lector asincrónico usa varios subprocesos para procesar secuencias. En el caso de los archivos con varias secuencias, el número de subprocesos usados puede ser muy grande. El lector sincrónico solo usa un subproceso.

El lector sincrónico se diseñó para satisfacer las necesidades de creación de contenido y aplicaciones de edición de archivos. Puede usar el lector sincrónico para otras aplicaciones, pero su funcionalidad es limitada.

El lector sincrónico puede abrir archivos locales o archivos en una red mediante el nombre de ruta de acceso UNC (por ejemplo, "\\someshare\somedirectory\somefile.wmv"). No puede transmitir archivos al lector sincrónico ni abrir archivos desde una ubicación de Internet. El lector sincrónico también proporciona compatibilidad con el uso de la interfaz COM de IStream como origen.

El lector sincrónico proporciona más versatilidad para recuperar muestras de un archivo ASF que el lector asincrónico. El lector sincrónico puede entregar muestras por número de flujo, así como por salida. Las muestras entregadas por número de secuencia se pueden comprimir o descomprimir. El lector sincrónico también puede cambiar entre la entrega comprimida y sin comprimir durante la reproducción; esta característica se conoce como "edición rápida". Esta característica permite a una aplicación de edición leer contenido basado en Windows Media y pasarlo directamente al escritor hasta que se alcance un fotograma deseado. En ese momento, la aplicación puede indicar al lector que empiece a entregar contenido sin comprimir, que la aplicación puede modificar y pasar al escritor para la recompresión. Cuando la aplicación haya terminado de modificar los fotogramas especificados, puede indicar al lector que empiece a entregar fotogramas comprimidos de nuevo.

La funcionalidad más básica del objeto de lector sincrónico se puede dividir en los pasos siguientes. En estos pasos, "la aplicación" hace referencia al programa que escribe con el SDK de Windows Media Format.

  1. La aplicación pasa al lector sincrónico el nombre de un archivo que se va a leer. Cuando el lector sincrónico abre el archivo, asigna un número de salida a cada secuencia. Si el archivo usa exclusión mutua, el lector asigna una única salida para todas las secuencias mutuamente excluyentes.
  2. La aplicación obtiene información sobre la configuración de las distintas salidas del lector. La información recopilada permitirá a la aplicación representar correctamente ejemplos multimedia.
  3. La aplicación comienza a solicitar ejemplos, de uno en uno, desde el lector sincrónico. El lector sincrónico entrega cada muestra en un objeto de búfer para el que entrega la interfaz INSSBuffer .
  4. La aplicación es responsable de representar los datos después de que el lector lo entregue. El SDK de Windows Media Format no proporciona ninguna rutina de representación. Normalmente, las aplicaciones usarán otros SDK para representar datos, como el SDK de Microsoft Direct X o las funciones multimedia de Microsoft SDK de Plataforma para Windows.

Estos pasos se muestran en la aplicación de ejemplo WMSyncReader. Para obtener más información, vea Aplicaciones de ejemplo.

El lector sincrónico también admite funcionalidades más avanzadas. El lector sincrónico le permite hacer lo siguiente:

  • Especifique un intervalo de muestras que se van a recuperar por tiempo o por número de fotograma.
  • Controlar la selección de secuencias para secuencias mutuamente excluyentes.
  • Abra un archivo mediante la interfaz COM estándar, IStream.
  • Lee los datos de perfil del encabezado de archivo.
  • Lee los metadatos del encabezado de archivo.
  • Cambie entre los ejemplos de secuencia y salida durante la reproducción.
  • Cambie entre ejemplos de secuencias comprimidas y sin comprimir durante la reproducción.

En las secciones siguientes se describe el uso del objeto de lector sincrónico en detalle.

Código de ejemplo

En el código de ejemplo siguiente se muestra cómo leer ejemplos de un archivo ASF mediante el lector sincrónico. Especifica por número de fotograma un intervalo de muestras que se van a entregar.

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;

Interfaz IWMSyncReader

Leer archivos ASF

Objeto del lector sincrónico