IVideoCompositor Interfaz
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
La interfaz que implemente para crear un compositor de vídeo personalizado.
public interface class IVideoCompositor : IMediaExtension
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.Guid(2232464446, 16908, 16911, 150, 199, 124, 152, 187, 161, 252, 85)]
struct IVideoCompositor : IMediaExtension
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.Guid(2232464446, 16908, 16911, 150, 199, 124, 152, 187, 161, 252, 85)]
public interface IVideoCompositor : IMediaExtension
Public Interface IVideoCompositor
Implements IMediaExtension
- Atributos
- Implementaciones
Requisitos de Windows
Familia de dispositivos |
Windows 10 (se introdujo en la versión 10.0.10240.0)
|
API contract |
Windows.Foundation.UniversalApiContract (se introdujo en la versión v1.0)
|
Ejemplos
usando Microsoft.Graphics.Canvas; usando Microsoft.Graphics.Canvas.Effects; usando Windows.Foundation.Collections; usando Windows.Graphics.DirectX.Direct3D11; usando Windows.Media.Effects; usando Windows.Media.MediaProperties; mediante Windows.UI;
namespace Effects
{
/// <summary>
/// Chroma key compositor
/// <list type="Bullet">
/// <listheader>Properties</listheader>
/// <item>Color (Color) : Chroma key color (default is black)</item>
/// <item>Feather (Boolean): true to soften edges of the output (default is false)</item>
/// <item>Tolerance (float): Color tolerance 0-1 (default is 0.1)</item>
/// <item>InvertAlpha (Boolean): invert the alpha value (default is false)</item>
/// </list>
/// </summary>
public sealed class ChromaKeyVideoCompositor : IVideoCompositor
{
#region Fields
private VideoEncodingProperties _backgroundProperties;
private CanvasDevice _canvasDevice;
#endregion
#region Properties
/// <summary>
/// Gets the chroma-key color
/// </summary>
public Color Color { get; private set; } = Colors.Black;
/// <summary>
/// Gets a value indicating whether to feather the edges of the chroma key
/// </summary>
public bool Feather { get; private set; } = false;
/// <summary>
/// Gets the color tolerance
/// </summary>
public float Tolerance { get; private set; } = 0.1f;
/// <summary>
/// Gets a value indicating whether to invert the alpha transparency
/// </summary>
public bool InvertAlpha { get; private set; } = false;
/// <summary>
/// Gets a value indicating whether the compositor is time-independent
/// </summary>
public bool TimeIndependent => true;
#endregion
#region Methods
/// <summary>
/// Sets the encoding properties
/// </summary>
/// <param name="backgroundProperties">the background properties</param>
/// <param name="device">the Direct3D device</param>
public void SetEncodingProperties(VideoEncodingProperties backgroundProperties, IDirect3DDevice device)
{
_backgroundProperties = backgroundProperties;
_canvasDevice = CanvasDevice.CreateFromDirect3D11Device(device);
}
/// <summary>
/// Composite the frame
/// </summary>
/// <param name="context">the composite frame context</param>
public void CompositeFrame(CompositeVideoFrameContext context)
{
foreach (var surface in context.SurfacesToOverlay)
{
using (CanvasBitmap inputBitmap = CanvasBitmap.CreateFromDirect3D11Surface(_canvasDevice, surface))
using (CanvasRenderTarget renderTarget = CanvasRenderTarget.CreateFromDirect3D11Surface(_canvasDevice, context.OutputFrame.Direct3DSurface))
using (CanvasDrawingSession ds = renderTarget.CreateDrawingSession())
using (var chromaKeyEffect = new ChromaKeyEffect
{
Source = inputBitmap,
Color = Color,
Feather = Feather,
Tolerance = Tolerance,
InvertAlpha = InvertAlpha
})
{
var overlay = context.GetOverlayForSurface(surface);
var destinationRectangle = overlay.Position;
var sourceRectangle = inputBitmap.Bounds;
var opacity = System.Convert.ToSingle(overlay.Opacity);
ds.DrawImage(chromaKeyEffect, destinationRectangle, sourceRectangle, opacity);
}
}
}
/// <summary>
/// Close the compositor & dispose of the canvas device
/// </summary>
/// <param name="reason">the media effect closed reason</param>
public void Close(MediaEffectClosedReason reason)
{
if (_canvasDevice != null)
{
_canvasDevice.Dispose();
_canvasDevice = null;
}
}
/// <summary>
/// Discard of the queued frames
/// </summary>
/// <remarks>this does nothing</remarks>
public void DiscardQueuedFrames()
{
}
/// <summary>
/// Sets the properties passed into the compositor
/// </summary>
/// <param name="configuration">the configuration</param>
public void SetProperties(IPropertySet configuration)
{
if (configuration == null)
{
return;
}
object value;
if (configuration.TryGetValue("Color", out value))
{
Color = (Color)value;
}
if (configuration.TryGetValue("Tolerance", out value))
{
Tolerance = (float)value;
}
if (configuration.TryGetValue("Feather", out value))
{
Feather = (bool)value;
}
if (configuration.TryGetValue("InvertAlpha", out value))
{
InvertAlpha = (bool)value;
}
}
#endregion
}
}
Comentarios
En un proyecto de Windows Runtime Component, derive una clase sellada pública de esta interfaz (vea el ejemplo siguiente).
Use el nombre de clase completo en un constructor MediaOverlayLayer .
var propertySet = new PropertySet { ["Feather"] = true, ["Tolerance"] = 0.2f, ["Color"] = Colors.Blue };
var compositorDefinition = new VideoCompositorDefinition( "Effects.ChromaKeyVideoCompositor", propertySet);
var mediaOverlayLayer = new MediaOverlayLayer(compositorDefinition);
Propiedades
TimeIndependent |
Obtiene un valor que indica si el efecto de vídeo personalizado es independiente del tiempo. |
Métodos
Close(MediaEffectClosedReason) |
Se llama cuando el compositor de vídeo debe cerrar y limpiar los recursos asignados. |
CompositeFrame(CompositeVideoFrameContext) |
Se llama cuando hay fotogramas disponibles para composición por un compositor de vídeo personalizado. |
DiscardQueuedFrames() |
Se llama para permitir implementaciones de compositor de vídeo descartar opcionalmente cualquier estado almacenado relacionado con los fotogramas que ya se han recibido. |
SetEncodingProperties(VideoEncodingProperties, IDirect3DDevice) |
Se llama para establecer las propiedades de codificación de un compositor de vídeo personalizado. |
SetProperties(IPropertySet) |
Establece las propiedades de configuración proporcionadas cuando se registró el analizador de medios o el códec. (Heredado de IMediaExtension) |