Configuración de perfiles y otras propiedades de archivo (QASF)
Los siguientes elementos describen cómo realizar varias tareas relacionadas con la creación de archivos ASF.
Crear un perfil (QASF)
Para crear un perfil personalizado, use el SDK de Windows Media Format directamente para crear un objeto de administrador de perfiles mediante la función WMCreateProfileManager . A continuación, cree el perfil y páselo al escritor ASF wm mediante el método IConfigASFWriter::ConfigureFilterUsingProfile . Esta es la única manera de configurar el filtro con un perfil que usa los códecs de la serie Audio y Vídeo 9 de Windows Media. Los perfiles del sistema para versiones anteriores de estos códecs se pueden agregar mediante el método IConfigASFWriter::ConfigureFilterUsingProfileGuid .
Agregar metadatos (QASF)
Para agregar metadatos a un archivo, llame a QueryInterface desde la interfaz IBaseFilter en wm ASF Writer para recuperar la interfaz IWMHeaderInfo . Una vez que se haya proporcionado un perfil al filtro, use los métodos de interfaz IWMHeaderInfo para escribir los metadatos.
Indexación de un archivo (QASF)
Wm ASF Writer crea archivos indizado temporalmente de forma predeterminada. Para crear un archivo indizado por fotogramas, use el método IConfigAsfWriter::SetIndexMode para deshabilitar toda la indexación y, a continuación, cree el archivo. Una vez completado, use el SDK de Windows Media Format directamente para crear un índice basado en fotogramas para el archivo.
Realización de Two-Pass codificación (QASF)
La codificación de dos pasos solo se admite en códecs de Windows Media de la versión 8 y posteriores. Coloque wm ASF Writer en modo de preprocesamiento llamando a IConfigAsfWriter2::SetParam y especificando AM_CONFIGASFWRITER_PARAM_MULTIPASS en el parámetro dwParam y TRUE en el parámetro dwParam1 .
A continuación, ejecute el gráfico de filtros. Cuando se realizan todos los pasos de preprocesamiento (normalmente solo se realizará un paso de preprocesamiento), la aplicación recibirá un evento de EC_PREPROCESS_COMPLETE del filtro. Cuando se recibe este evento, use IMediaSeeking::SetPositions para restablecer el puntero de secuencia al principio y vuelva a ejecutar el grafo de filtro. Después del último paso (normalmente el segundo paso), la aplicación recibirá un evento de EC_COMPLETE para indicar que se ha completado el proceso de codificación. Si se cancela un paso de preprocesamiento antes de recibir el evento EC_PREPROCESS_COMPLETE , llame a IConfigAsfWriter2::ResetMultiPassState para restablecer el filtro antes de intentar ejecutar otro preprocesamiento.
Solo es necesario llamar a IConfigAsfWriter::SetParam(AM_CONFIGASFWRITER_PARAM_MULTIPASS, FALSE) si desea eliminar completamente el filtro del modo de preprocesamiento.
Importante
Es responsabilidad de la aplicación habilitar el modo de preprocesamiento en función del perfil que se usará para la codificación. Algunos perfiles requieren codificación de dos pasos; Si intenta codificar un archivo con este perfil y no establece AM_CONFIGASFWRITER_PARAM_MULTIPASS en TRUE, se producirá un error de EC_USERABORT. Para obtener más información sobre cómo determinar si un perfil determinado requiere codificación de dos pasos, consulte Uso de Two-Pass codificación o escritura de secuencias de velocidad de bits variables.
Obtención y establecimiento de propiedades de búfer en tiempo de ejecución (QASF)
En algunos escenarios, por ejemplo, si quiere forzar la inserción de fotogramas clave al escribir un archivo, es posible que una aplicación necesite obtener o establecer información sobre un búfer de Windows Media en tiempo de ejecución. Los filtros WM ASF Reader y WM ASF Writer admiten un mecanismo de devolución de llamada que permite a una aplicación acceder a la interfaz INSSBuffer3 en cada búfer multimedia individual durante la lectura de archivos o la escritura de archivos. Las aplicaciones pueden usar esta interfaz para designar ejemplos específicos como fotogramas clave, o puntos limpios, para establecer códigos de tiempo SMPTE, especificar la configuración de interlace o agregar cualquier tipo de datos privados a una secuencia.
Use la interfaz IAMWMBufferPass para registrarse para las devoluciones de llamada desde el pin que controla la secuencia de vídeo. Cuando el pin llama al método IAMWMBufferPassCallback::Notify , examine las marcas de tiempo en el búfer y, si procede, llame a INSSBuffer3::SetProperty para establecer la propiedad WM_SampleExtensionGUID_OutputCleanPoint en el búfer en TRUE.
Compatibilidad con píxeles no cuadrados (QASF)
Wm ASF Writer se conecta a un filtro ascendente, como el descodificador DV, que genera información de relación de aspecto de píxeles. Wm ASF Writer escribirá esta información como extensiones de unidad de datos para cada ejemplo del archivo.
Cuando el Lector ASF wm encuentra información de relación de aspecto de píxeles en el encabezado de archivo o en extensiones de unidad de datos para los ejemplos, ofrecerá un tipo de medio VIDEOINFOHEADER2 como primera opción en su pin de salida. Los miembros dwPictAspectRatioX y dwPictAspectRatioY de la estructura, que describen la relación de aspecto del rectángulo de vídeo, se ajustarán correctamente para tener en cuenta la relación de aspecto del píxel.
Mantenimiento del formato entrelazado
Si capturas vídeo entrelazado de una televisión o una cámara DV, es posible que quieras conservar el vídeo original como campos independientes si esperas que el archivo codificado se reproduzca en un televisor u otro dispositivo de visualización entrelazado. (Los monitores de equipo son dispositivos de análisis progresivos). Si desinterlace un vídeo y, a continuación, vuelve a interinterlazarlo para su reproducción en una televisión, se incurrirá en alguna pérdida de datos. En un archivo ASF, la información entrelazada se almacena como extensiones de unidad de datos que la aplicación aplica a cada ejemplo mediante el método IAMWMBufferPassCallback descrito anteriormente. Para codificar un archivo que conserva la configuración de interlace original, siga estos pasos:
- Implemente una clase que admita IAMWMBufferPassCallback y escriba una función Notify que establezca las marcas de interlace para cada ejemplo. El escritor DE ASF wm llamará a esta función antes de procesar cada ejemplo.
// 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);
- Establezca las extensiones de unidad de datos en el perfil antes de pasar el perfil al filtro.
hr = pWMStreamConfig2->AddDataUnitExtension( WM_SampleExtensionGUID_ContentType, WM_SampleExtension_ContentType_Size, NULL, 0 );
- Después de configurar el filtro con el perfil, obtenga la interfaz IWMWriterAdvanced2 desde wm ASF Writer y llame al método 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));