Copiar secuencias sin descomprimir los datos

La manera más sencilla y común de copiar una secuencia de un archivo a otro es recuperar los ejemplos en su estado comprimido y, a continuación, escribirlos en el nuevo archivo sin descomprimirlos y volver a comprimirlos. Los ejemplos obtenidos de un archivo en su estado comprimido se denominan muestras de secuencia, ya que no se modifican a partir de su representación en la secuencia. Se recomienda usar siempre ejemplos de secuencias para copiar secuencias, ya que descomprimir y volver a comprimir los datos multimedia digitales degrada la calidad. Si debe copiar una secuencia de datos descomprimidos, consulte Copia de secuencias mediante ejemplos descomprimidos.

Es posible concatenar dos o más secuencias en una sola secuencia mediante muestras comprimidas, pero solo si las velocidades de bits son idénticas. El proceso es esencialmente el mismo que los pasos descritos a continuación, excepto que debe leer varios archivos originales para obtener todo el contenido que necesita. Sin embargo, solo puede escribir muestras comprimidas de varios archivos en una sola secuencia si las estructuras de WM_MEDIA_TYPE (incluidos todos los miembros de la estructura pbFormat ) de todas las secuencias comprimidas son idénticas. Para combinar datos de varias secuencias que no tienen el mismo formato, debe descomprimir el contenido y volver a comprimirlo en el flujo de destino. Además, al combinar datos de dos o más secuencias en una sola secuencia, debe agregar los valores de la ventana del búfer para todos los flujos juntos para obtener la ventana del búfer para la nueva secuencia. Esto se debe a que es imposible determinar cuánto se toma el búfer al final de una secuencia y al principio de otro.

Puede recuperar ejemplos de secuencias con el lector asincrónico mediante IWMReaderAdvanced::SetReceiveStreamSamples. Los ejemplos de secuencias se entregan a IWMReaderCallbackAdvanced::OnStreamSample, no a IWMReaderCallback::OnSample. Si está leyendo un archivo y recuperando algunas secuencias comprimidas y algunas descomprimidas, debe implementar ambos métodos de devolución de llamada.

El lector sincrónico proporciona más flexibilidad para recuperar ejemplos. Puede cambiar entre muestras comprimidas y descomprimidas libremente durante la reproducción mediante IWMSyncReader::SetReadStreamSamples.

Para copiar una secuencia completa de un archivo ASF en un nuevo archivo ASF, realice los pasos siguientes. Estos pasos usan el lector sincrónico porque es mucho más fácil de usar para este tipo de operación.

  1. Cree un objeto de lector sincrónico llamando a la función WMCreateSyncReader .
  2. Abra un archivo en el lector con una llamada a IWMSyncReader::Open.
  3. Obtenga un puntero a la interfaz IWMProfile del objeto de lector sincrónico llamando a IWMSyncReader::QueryInterface.
  4. Recupere las propiedades de la secuencia deseada llamando a IWMProfile::GetStreamByNumber. Esto recuperará un puntero a la interfaz IWMStreamConfig del objeto de configuración de secuencia para la secuencia que desee.
  5. Obtenga una copia de la estructura WM_MEDIA_TYPE de la secuencia. Realice dos llamadas a IWMMediaProps::GetMediaType: la primera para obtener el tamaño de la estructura, la segunda para obtener la propia estructura.
  6. Cree un objeto de administrador de perfiles llamando a la función WMCreateProfileManager .
  7. Llame a IWMProfileManager::CreateEmptyProfile para crear un nuevo perfil (o abra un perfil existente al que desea agregar la secuencia). Llame a IWMProfile::AddStream en el nuevo perfil para agregar la secuencia desde el archivo existente. Al agregar la secuencia, use el puntero IWMStreamConfig obtenido en el paso 4.
  8. Cree un objeto writer con una llamada a la función WMCreateWriter . Establezca el perfil recién creado como perfil activo en el escritor llamando a IWMWriter::SetProfile. Cree un archivo para la salida llamando a IWMWriter::SetOutputFilename.
  9. Para cada entrada asociada a la secuencia o secuencias que va a copiar, llame a IWMWriter::SetInputProps y pase NULL para la interfaz IWMInputMediaProps . Esto informa al objeto writer de que no es necesario validar los datos que está pasando. Debe realizar esta llamada antes de llamar a BeginWriting (paso 14), de lo contrario, es posible que un objeto de lectura no pueda descodificar el contenido.
  10. Establezca el lector sincrónico para entregar ejemplos de secuencias comprimidos para la secuencia seleccionada llamando a IWMSyncReader::SetReadStreamSamples con el parámetro fCompressed establecido en True.
  11. Obtenga información de códec para cada secuencia que se va a copiar y agregue la información del códec al encabezado antes de escribir. Para obtener la información del códec, llame a IWMHeaderInfo2::GetCodecInfoCount e IWMHeaderInfo2::GetCodecInfo para enumerar los códecs asociados al archivo en el lector. Seleccione la información del códec que coincida con la configuración del flujo. A continuación, establezca la información del códec en el escritor llamando a IWMHeaderInfo3::AddCodecInfo, pasando la información obtenida del lector.
  12. Obtenga un puntero a la interfaz IWMWriterAdvanced llamando a IWMWriter::QueryInterface.
  13. Establezca el escritor en modo de escritura llamando a IWMWriter::BeginWriting.
  14. Realice llamadas repetidas a IWMSyncReader::GetNextSample y especifique el número de secuencia deseado. Cuando se reciben muestras, páselas al escritor con llamadas a IWMWriterAdvanced::WriteStreamSample. En el caso de las secuencias de vídeo, debe comprobar las marcas (si las hay) establecidas por el escritor en cada llamada a GetNextSample. Si se establece WM_SF_CLEANPOINT, también debe establecerlo en la llamada a WriteStreamSample.
  15. Cuando se complete la lectura, llame a IWMWriter::EndWriting. La secuencia debe transferirse.

Nota

Las secuencias de imagen no se pueden copiar de un archivo a otro mediante ejemplos de secuencias. Para copiar los datos del flujo de imágenes, recupere los ejemplos sin comprimir y, a continuación, procesándolos a través del escritor como lo haría normalmente.

 

Copiar datos de un archivo a otro

Copiar secuencias mediante ejemplos descomprimidos