Configuración de perfiles y otras propiedades de archivo ASF
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, 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.
Los siguientes elementos describen cómo realizar varias tareas relacionadas con la creación de archivos ASF. Algunas de las interfaces mencionadas en este tema se documentan en la documentación del SDK de Windows Media Format.
Crear un perfil
Los perfiles de ASF se describen en detalle en el SDK de Windows Media Format; básicamente, describen los atributos de un archivo de Formato de Windows Media, como la velocidad de bits, el número y el tipo de secuencias, y la calidad de compresión. El filtro usa el perfil para determinar qué tipo de archivo de Windows Media Format se va a escribir, cuántas patillas de entrada debe configurar y qué tipos de medios pueden aceptar.
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 .
Puede restablecer el perfil mientras se conectan los pines de entrada del filtro, siempre y cuando el nuevo perfil no requiera ningún pin de entrada adicional. Por ejemplo, si cambia el perfil de un perfil de solo audio de entrada a un perfil de audio y vídeo de dos entradas, solo se volverá a conectar el pin de audio y no se creará ningún pin nuevo para la secuencia de vídeo.
Agregar metadatos
Para agregar metadatos a un archivo, consulte el filtro WM ASF Writer para 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
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.
codificación de Two-Pass
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 establecer el parámetro AM_CONFIGASFWRITER_PARAM_MULTIPASS en 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, consulte la documentación del SDK de Windows Media Format.
Obtención y establecimiento de propiedades de búfer en tiempo de ejecución
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, establecer códigos de hora 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. El pin llamará al método IAMWMBufferPassCallback::Notify para cada búfer.
Píxeles no cuadrados
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 formato 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 = S_OK; 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));
Temas relacionados