Compartir a través de


Origen multimedia de ASF

Media Foundation proporciona el origen multimedia ASF que una aplicación puede usar para representar un archivo ASF en la capa de canalización de la arquitectura.

Para reproducir un archivo ASF, una aplicación puede usar el origen multimedia asf para alimentar los datos en una canalización de reproducción. En un escenario de codificación, la aplicación puede usar el origen multimedia ASF como origen para convertir en otro formato o convertir un archivo de velocidad de bits superior en un archivo de velocidad de bits inferior sin cambiar los formatos. El origen multimedia de ASF debe usarse en la capa de canalización, es decir, una aplicación debe usar la sesión multimedia para controlar la operación. Este nivel de acceso permite a las aplicaciones obtener eventos mientras la sesión multimedia está en curso. Para obtener acceso de nivel inferior al contenido de ASF, una aplicación debe usar los componentes de ASF de capa WMContainer.

La fuente de medios asf implementa la interfaz IMFMediaSource , que es la interfaz genérica para los orígenes multimedia de Media Foundation. Al igual que cualquier otro origen multimedia, el origen multimedia asf proporciona un descriptor de presentación que describe principalmente el objeto de encabezado ASF. Además, el origen multimedia ASF proporciona descriptores de flujo que representan cada secuencia del contenido multimedia. Para obtener más información, vea Estructura de archivos ASF.

Creación del origen multimedia de ASF

Para crear el origen multimedia asf, la aplicación debe usar el solucionador de origen. Para crear el origen multimedia de ASF, la aplicación debe proporcionar el origen para el que el solucionador de origen crea el origen multimedia ASF. La información de origen debe proporcionarse especificando la dirección URL del archivo de origen o la secuencia de bytes que contiene el medio. Si la aplicación decide crear el origen multimedia asf especificando la dirección URL, debe llamar a IMFSourceResolver::CreateObjectFromURL para la operación sincrónica o IMFSourceResolver::Begin... EndCreateObjectFromURL para la operación asincrónica. El proceso para crear el origen multimedia a partir de una secuencia de bytes es similar. La aplicación debe llamar a IMFSourceResolver::CreateObjectFromByteStream para la operación sincrónica o IMFSourceResolver::Begin... EndCreateObjectFromBytestream para la operación asincrónica. Estas llamadas deben especificar MF_RESOLUTION_MEDIASOURCE en el parámetro dwFlags . Para obtener más información sobre el uso de esta marca, vea Uso del solucionador de origen.

Si la aplicación especifica una dirección URL, para un archivo local, la cadena de dirección URL puede contener la ruta de acceso del archivo multimedia o puede tener el prefijo "file: "scheme. La extensión de nombre de archivo debe ser ".asf", ".wm", L".wma" o ".wmv". Para un archivo ASF en la red, el solucionador de origen crea el origen de red, que usa el origen multimedia ASF.

Durante el proceso de creación de objetos, el solucionador de origen busca la lista de controladores de esquema y los controladores de flujo de bytes en el registro del sistema y carga el controlador coincidente más cercano que puede analizar el contenido multimedia y también crear el objeto de origen multimedia debajo. Independientemente del método usado para crear el origen multimedia (dirección URL y secuencia de bytes), el solucionador de origen crea una secuencia de bytes y lee el contenido de los medios de origen en la secuencia de bytes. Para obtener más información, vea Controladores de esquema y controladores de secuencias de bytes.

Para obtener un ejemplo de código sobre cómo crear un origen multimedia, consulte Uso del solucionador de origen.

Opciones de configuración para el origen multimedia asf

La resolución de origen consulta las funcionalidades del flujo de bytes subyacente y determina que las operaciones se permiten en el origen multimedia recién creado. Una de estas funcionalidades está buscando. Si se permite una operación de búsqueda, la aplicación puede especificar el modo de búsqueda que usa el origen multimedia mientras busca un punto determinado de la presentación.

Una aplicación puede establecer el modo de búsqueda, para que el origen multimedia lo use durante la creación de objetos. Después de crear el origen multimedia ASF con el modo de búsqueda especificado, no se puede modificar en el origen multimedia o cambiar dinámicamente durante una presentación. Las preferencias de búsqueda se especifican como propiedades en la llamada de la aplicación a los métodos de resolución de origen pertinentes que se usan para crear el origen multimedia. Estos conjuntos de propiedades se establecen en un almacén de propiedades y se pasan al parámetro pProps . Si no se pasan estas propiedades, el origen multimedia funciona con la configuración predeterminada. Para obtener más información sobre cómo establecer estas propiedades, consulte Configuración de un origen multimedia.

Si se permite la búsqueda, el origen multimedia ASF admite los siguientes modos de búsqueda:

  • Búsqueda exacta: en este modo, el origen multimedia asf se basa en el objeto de índice ASF del archivo ASF. Si el archivo no tiene el objeto Index, la búsqueda exacta está deshabilitada y se usa uno de los otros modos en función de las propiedades especificadas por la aplicación que se establecen en el origen multimedia.
  • Búsqueda aproximada: la aplicación solicita este modo pasando MFPKEY_ASFMediaSource_ApproxSeek en el almacén de propiedades a los métodos de resolución de origen pertinentes. Sin embargo, la búsqueda aproximada solo se usa si la secuencia de bytes no admite la búsqueda basada en tiempo. En este modo, el origen multimedia determina una hora de inicio relativamente más cercana al tiempo de búsqueda. Si el archivo ASF contiene un objeto de índice ASF, se usa para calcular la hora de inicio. La búsqueda aproximada es menos precisa pero más rápida que la búsqueda exacta porque el tiempo que se tarda en representar la primera muestra en la hora de inicio predeterminada es más rápida.
  • Búsqueda iterativa: para establecer este modo, la aplicación debe establecer la propiedad MFPKEY_ASFMediaSource_IterativeSeekIfNoIndex . La búsqueda iterativa es un algoritmo para buscar una posición en un archivo ASF que no contiene ningún objeto de índice ASF. En este modo, el origen multimedia determina una estimación aproximada del punto de búsqueda leyendo el desplazamiento de la secuencia de bytes. Usa una serie de aproximaciones, basadas en la velocidad media de bits, para acercarse progresivamente al tiempo de búsqueda de destino. (El algoritmo es similar a una búsqueda binaria). La búsqueda iterativa puede tardar más tiempo que buscar mediante el objeto index, por lo que está deshabilitada de forma predeterminada. Si establece esta propiedad, use las siguientes propiedades para establecer los parámetros de búsqueda: MFPKEY_ASFMediaSource_IterativeSeek_Max_Count MFPKEY_ASFMediaSource_IterativeSeek_Tolerance_In_MilliSecond. Estas propiedades establecen el número máximo de iteraciones y la tolerancia, respectivamente. El algoritmo se detiene cuando alcanza el número máximo de iteraciones, o cuando encuentra un paquete cuya distancia desde el tiempo de búsqueda está dentro de la tolerancia especificada.

En pocas palabras, la aplicación tiene la opción de elegir la búsqueda aproximada o iterativa cuando el archivo ASF no contiene un objeto de índice ASF.

Modelo de objetos de origen multimedia de ASF

El origen multimedia de ASF implementa la interfaz IMFMediaSource y expone las siguientes interfaces. Una aplicación puede obtener una referencia a estas interfaces llamando a IMFMediaSource::QueryInterface en el origen multimedia ASF.

Interfaz Descripción
IMFMediaSource Necesario para todos los orígenes multimedia.
IMFMediaEventGenerator Necesario para todos los orígenes multimedia. Permite a las aplicaciones obtener eventos del origen multimedia a través de la sesión multimedia.
IMFGetService Consulta el origen multimedia de la interfaz de servicio especificada.
IPropertyStore Establece y obtiene propiedades en el origen multimedia. Cada propiedad contiene un nombre descriptivo y un valor.
IMFMetadata Describe los metadatos del archivo ASF.
IMFMetadataProvider Recupera una colección de metadatos, ya sea para una presentación completa o para una secuencia de la presentación.
IMFRateSupport Consulta el intervalo de velocidades de reproducción que se admiten, incluida la reproducción inversa.
IMFRateControl Obtiene o establece la velocidad de reproducción.
IMFTrustedInput Obtiene el ITA para cada una de las secuencias ASF contenidas en el origen.
IMFPMPClient Permite que un origen multimedia reciba un puntero a la interfaz IMFPMPHost , que se usa para crear objetos en el proceso PMP.
IMFTimecodeTranslate Convierte entre los códigos de tiempo sociedad de imágenes de movimiento y televisión (SMPTE) y unidades de tiempo de 100 nanosegundos.

 

Servicios de origen multimedia de ASF

El origen multimedia de ASF proporciona varios servicios cuyo ámbito es el archivo ASF. Para obtener un puntero a un servicio determinado, la aplicación debe usar uno de los siguientes identificadores de servicio en su llamada a MFGetService. Para obtener información, consulte Interfaces de servicio.

Identificador de servicio Descripción
MF_RATE_CONTROL_SERVICE Mediante este identificador, una aplicación puede obtener un puntero a interfaces IMFRateSupport o IMFRateControl. Mediante el uso del objeto de compatibilidad de velocidad implementado por el origen multimedia, la aplicación puede comprobar si el archivo multimedia ASF subyacente admite una velocidad determinada también obtiene la velocidad más rápida y la velocidad más lenta. Mediante el uso del objeto de control de velocidad que la aplicación puede obtener y establecer la velocidad de reproducción. Si la aplicación especifica una velocidad determinada para la reproducción, el origen multimedia ASF comprueba primero si la velocidad solicitada está dentro de los límites de velocidad (determinados por velocidades más rápidas y más lentas) y, a continuación, establece la velocidad. Esto no comprueba si hay condiciones variables, ya que la velocidad de bits puede cambiar en cualquier momento en función del ancho de banda de red. Para obtener más información, Control de velocidad.
MF_METADATA_PROVIDER_SERVICE Con este identificador, la aplicación puede obtener un puntero a la interfaz IMFMetadataProvider del origen de medios ASF. Esta interfaz proporciona acceso a información sobre el archivo ASF específicamente los objetos de encabezado ASF y las secuencias contenidas en el contenido multimedia. La información de encabezado se expone a través de atributos de descriptor de presentación y la información de flujo se proporciona a través de atributos de descriptor de secuencia. Para obtener más información sobre estos atributos, vea Atributos de Media Foundation para objetos de encabezado ASF. Además de la información que se expone a través de atributos, también existen metadatos descriptivos, que se establecen como propiedades.
MF_PROPERTY_HANDLER_SERVICE Con este identificador, la aplicación puede obtener un puntero a la interfaz IPropertyStore del origen de medios ASF. El almacén de propiedades contiene todos los metadatos relacionados con el archivo ASF. Este identificador es nuevo en Windows 7 y reemplaza MF_METADATA_PROVIDER_SERVICE para obtener propiedades de metadatos.
MFNETSOURCE_STATISTICS_SERVICE Para obtener más información, consulte Recuperación de estadísticas de red en el registro de cliente.
MF_TIMECODE_SERVICE Con este identificador, la aplicación puede obtener un puntero a la interfaz IMFTimecodeTranslate del origen multimedia. Esta implementación se puede usar para realizar traducciones de código de tiempo, como convertir el código de tiempo SMPTE en unidades de 100 nano segundos y volver.

 

Traducción de código de tiempo

El origen multimedia de ASF proporciona un servicio de traducción de código de tiempo que permite a la aplicación convertir el código de tiempo de SMPTE al tiempo de presentación más cercano (en unidad de 100 nanosegundos). Por el contrario, la aplicación también puede obtener el código de hora para una hora de presentación solicitada. El servicio está disponible a través de la interfaz IMFTimecodeTranslate , que implementa la fuente multimedia asF. Las llamadas al método en este puntero de interfaz son asincrónicas que se pueden ejecutar desde el subproceso de aplicación principal sin bloquear la interfaz de usuario de la aplicación.

En los pasos siguientes se resume el procedimiento para la traducción de código de tiempo:

  1. Obtenga el puntero a la interfaz IMFTimecodeTranslate del origen multimedia ASF llamando a MFGetService y especificando el identificador de MF_TIMECODE_SERVICE.
  2. Llame a IMFTimecodeTranslate::BeginConvertTimecodeToHNS o IMFTimecodeTranslate::BeginConvertHNSToTimecode y especifique la hora que se va a traducir. Para BeginConvertTimecodeToHNS, el código de hora debe especificarse como una variable PROPVARIANT con VT_I8 tipo de datos. El método BeginConvertHNSToTimecode requiere la hora en unidades de 100 nanosegundos como tipo MFTIME .
  3. Complete la operación asincrónica llamando a IMFTimecodeTranslate::EndConvertTimecodeToHNS o IMFTimecodeTranslate::EndConvertTimecodeToHNS adecuadamente.

Durante la creación del origen multimedia, el solucionador de origen crea una secuencia de bytes para el archivo desde el que el origen multimedia lee el contenido de ASF. Para que las conversiones de tiempo se realicen correctamente, la secuencia de bytes asociada al archivo ASF debe tener capacidades de búsqueda; De lo contrario, la aplicación obtiene el error MF_E_BYTESTREAM_NOT_SEEKABLE de la llamada Begin... . Otro requisito para las conversiones de tiempo es que el archivo ASF, representado por el origen multimedia asf, debe tener objetos de índice ASF. Los tiempos de presentación y los códigos de hora se extraen de los objetos de índice de ASF que mantienen todos los índices y los puntos de búsqueda correspondientes para el archivo ASF. Para la traducción de código de tiempo a tiempo de presentación, el archivo ASF debe contener un objeto de índice simple; para la traducción de tiempo de código a presentación, el archivo ASF debe tener un objeto index. Las operaciones de conversión se basan en el indexador subyacente (componente WMContainer) para analizar y leer el objeto de índice asociado al archivo ASF. Si el archivo no contiene un objeto Index, la aplicación recibe de forma asincrónica el código de error MF_E_NO_INDEX.

Para traducir el tiempo solicitado por la aplicación, el origen multimedia enumera las secuencias dentro del archivo y busca la secuencia que contiene el objeto de índice ASF adecuado. Si se encuentra dicha secuencia, el origen multimedia analiza los paquetes ASF de la secuencia hasta que se alcanza el código de hora correcto. Después de encontrar el ejemplo correcto, recupera la hora de presentación correspondiente o el código de hora del ejemplo y lo devuelve al autor de la llamada.

Compatibilidad con comandos de script

Al compilar una topología ASF que contiene una secuencia de script, se agrega un nodo Script Stream a la topología. Este nodo enviará IMFSamples en el momento adecuado. El FMISample proporcionado por el nodo de origen del script almacena los datos en el IMFMediaBuffer asociado con el ejemplo. Puede llamar a CopyToBuffer en el ejemplo para obtener un IMFMediaBuffer y, a continuación, llamar a Lock en el búfer para obtener los datos.

Las cargas de secuencia de script se empaquetan en el búfer como una cadena de tipo, seguidas de NULL, seguidas de la cadena de comandos, seguidas de NULL. Las cadenas son Unicode en formato ASF.

Por ejemplo, una carga podría ser similar a la siguiente (donde \0 indica un carácter NULL):

URL\0http://contoso.com\0

Text\0Este es un título\0

Componentes ASF de la capa de canalización

Soporte técnico de ASF en Media Foundation