Uso compartido de datos entre secuencias
[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.
Nota:
Estas API están en desuso. Las aplicaciones deben usar el filtro Sample Grabber o implementar un filtro personalizado para obtener datos de un gráfico de filtros DirectShow.
El procesamiento de datos multimedia normalmente requiere una gran cantidad de recursos del sistema; por lo tanto, debe evitar copiar datos siempre que sea posible. La arquitectura de streaming admite ejemplos de secuencias compartidas, un mecanismo que mueve los datos de un flujo a otro sin copiarlos. Este búfer permite el transporte eficaz de datos entre dos flujos, incluso si la secuencia de destino no admite específicamente el formato de datos subyacente.
Por ejemplo, supongamos que tiene una secuencia multimedia con tres secuencias de datos: vídeo y audio, y datos de dirección URL marcados para que coincidan con el contenido del vídeo. Quiere escribir una aplicación que agregue un aviso de copyright en cada fotograma de vídeo y escriba los datos en otra secuencia para el almacenamiento, pero la aplicación no entiende ningún formato de datos, excepto la secuencia de vídeo. Para la secuencia de vídeo, se crea un ejemplo asociado a la superficie de DirectDraw deseada. Después, puede crear un flujo de salida llamando al método IDirectDrawMediaStream::CreateSample con ese puntero a la misma superficie o IMediaStream::CreateSharedSample. En ambos casos, los flujos de entrada y salida comparten la superficie de DirectDraw. Dado que comprende el formato de vídeo, puede acceder a esta superficie según sea necesario.
Para recuperar los otros punteros de secuencia de origen (audio y dirección URL), enumere la secuencia de contenedor de origen y tome punteros a las secuencias que no son de video. Cada uno de estos flujos de origen tiene un flujo de salida asociado en el contenedor de flujos de salida. Recupere estos punteros de salida mediante una llamada al método IMultiMediaStream::GetMediaStream en el contenedor de salida con cada uno de los punteros de flujo de origen. En los pasos siguientes se describe este proceso.
- Llame a IMultiMediaStream::EnumMediaStreams para recuperar un puntero a una secuencia de origen. Asegúrese de que no es la secuencia de vídeo, ya que la aplicación ya entiende su formato.
- Llame a IMultiMediaStream::GetMediaStream en el flujo de contenedor de salida con el puntero del paso 1. Esto devuelve un puntero al flujo de salida deseado.
- Llame a AllocateSample en la secuencia de origen.
- Llame a CreateSharedSample en el flujo de salida.
- Llame a Update en el flujo de origen para leer los datos.
- Llame a Update en el flujo de salida para escribir los datos.
Repita estos pasos para cada secuencia cuyo formato no admita. Cuando ambos ejemplos terminen de actualizarse, el flujo de salida tiene todos los datos del flujo de origen y ha terminado.