Agregar vídeo a controles y superficies 3D con WPF

En este artículo se analizan los siguientes temas:

  • Conceptos básicos de multimedia digital en Windows Presentation Foundation
  • Uso de MediaElement y MediaPlayer
  • Vídeo incrustado en controles de WPF
  • Asignación de vídeo en superficies 3D

En este artículo se utilizan las siguientes tecnologías:
.NET Framework 3.0

 


Contenido

Descripción general técnica
Uso del control MediaElement
Uso de la clase MediaPlayer
Incrustación de vídeo en controles de WPF
Técnica de superficie mojada
Asignación de vídeo en superficies 3D
Representación de mapas de bits a partir de fotogramas de vídeo
Capacidades adicionales de audio en WPF
Resumen
 


Cuando se empezaron a escuchar rumores sobre Windows Presentation Foundation (WPF) en la comunidad Adobe Flash, mi reacción inicial fue de escepticismo. El hecho de que Microsoft había introducido una tecnología competente, llevó a muchos programadores de Flash, yo incluido, a arremeter contra la empresa en favor de nuestra admirada plataforma. Entonces recibí un mensaje de correo electrónico de que Microsoft enviaba a un evangelista técnico al estudio de frog design en San Francisco para realizar una demostración de Windows ® Presentation Foundation, lo que consideré como la oportunidad perfecta para demostrar a todos por qué Flash era superior en todos los aspectos.

Cuando Karsten Januszewski llevaba la mitad de la presentación, mostró con orgullo la ya popular demostración de North Face (channel9.msdn.com/Showpost.aspx?postid=116327 ), que se caracteriza por un carrete de diapositivas 3D en el que objetos de malla 3D curvados se asignan a clips de alta calidad de Windows Media® Video (WMV). La demostración la crearon Fluid, un estudio interactivo ubicado también en San Francisco, junto con miembros del equipo de Microsoft Windows Presentation Foundation. Mis prejuicios desaparecieron totalmente. El tipo de presentación que mostraron habría sido muy difícil o imposible de conseguir con Flash (o con cualquier otra plataforma para el mismo propósito).

Poco tiempo después de aquella sesión, me tragué mi orgullo y me descargué el tiempo de ejecución de Microsoft® .NET Framework 3.0, con lo que comencé mi carrera como diseñador interactivo de Windows Presentation Foundation. Desde entonces, el debate de Flash vs. Windows Presentation Foundation se disipó debido a que no hay muchas áreas en las que las dos tecnologías compitan realmente. El debate puede resurgir cuando Microsoft lance su última solución para proporcionar páginas web de plataforma cruzada que incluye gráficos, vídeo, animación y audio. Dicho lanzamiento, conocido como “WPF/E”, tiene una vista previa disponible en el centro de desarrollo de “WPF/E” en msdn2.microsoft.com/bb187358.aspx.

La capacidad de asignar vídeo a superficies 3D fue, ciertamente, el dulce perfecto para atraer la atención de los diseñadores interactivos. Pero esta característica muestra sólo la punta del iceberg de lo que se puede hacer al integrar audio y vídeo en Windows Presentation Foundation. Este artículo le mantendrá al día sobre la integración multimedia con Windows Presentation Foundation y le proporcionará los conocimientos necesarios para agregar archivos multimedia y efectos visuales opcionales de interés para las aplicaciones propias.
Descripción general técnica
Las dos formas más comunes de agregar actualmente archivos multimedia digitales a aplicaciones de Win32® son usar la API de DirectShow®, o bien incrustar el control ActiveX ® del Reproductor de Windows Media. El uso de DirectShow ofrece a los programadores el control definitivo sobre la integración multimedia; sin embargo, se trata de algo mucho más complejo que simplemente incrustar el control ActiveX del Reproductor de Windows Media.

El uso de DirectShow es aún una opción viable para las aplicaciones de Windows Presentation Foundation que requieren un control específico sobre la visualización y administración multimedia. También puede implementar DirectShow en una aplicación de Windows Presentation Foundation cuando una aplicación existente de Win32 se transfiere a Windows Presentation Foundation y .NET Framework  3.0.

La reproducción multimedia mediante el control ActiveX del Reproductor de Windows Media todavía es una opción en Windows Presentation Foundation, pero es mucho más lógico usar el control nuevo de MediaElement. Le permite realizar básicamente lo mismo, como verá en breves momentos; sin embargo, ofrece una mejor integración con Windows Presentation Foundation. En concreto, le ofrece la capacidad de componer medios mediante la combinación alfa, así como la capacidad de realizar representaciones en superficies 3D.

La integración de audio y vídeo con Windows Presentation Foundation proporciona a los programadores varias opciones, cada una con una complejidad y un control determinados con respecto a archivos multimedia. Independientemente del control o la clase usados, lo que ocurre en segundo plano sigue siendo prácticamente lo mismo. La idea principal es que cuando la aplicación deba reproducir un archivo multimedia en Windows Presentation Foundation, inicie el tiempo de ejecución del Reproductor de Windows Media en segundo plano para reproducir el archivo. El hecho de que Windows Presentation Foundation use el Reproductor de Windows Media y no contenga un motor de procesamiento multimedia propio presenta ventajas y desventajas. Realizar superposiciones en el Reproductor de Windows Media es relativamente parecido a usar el control ActiveX.

Desde que el Reproductor de Windows Media se ocupa de la reproducción multimedia de Windows Presentation Foundation, es fácil hablar de los formatos multimedia compatibles con Windows Presentation Foundation. Básicamente, cualquier formato que un usuario final puede reproducir mediante una instalación existente del Reproductor de Windows Media, está disponible para las aplicaciones de Windows Presentation Foundation. Para agregar compatibilidad para tipos multimedia adicionales, el usuario debe instalar un códec de vídeo nuevo.

Tenga en cuenta que como se debe iniciar el tiempo de ejecución del Reproductor de Windows Media para reproducir archivos multimedia, existirá un retraso en la reproducción multimedia inicial porque el tiempo de ejecución se carga en segundo plano. Esto puede dificultar el control exacto sobre los medios, especialmente al intentar realizar operaciones como sincronizar audio o vídeo con animaciones u otros eventos en Windows Presentation Foundation. Una forma de tratar esto es mediante la carga previa de los archivos multimedia y la conservación de los mismos en estado de pausa hasta que esté listo para usarlos. Otra opción es mediante el uso de SLIP en el motor de animación, con lo que podrá realizar otras animaciones a partir de MediaElement, de forma que al menos todo tendrá un retraso similar. Sin embargo, no se trata de un flujo de trabajo óptimo y el equipo multimedia de Windows Presentation Foundation está trabajando en una solución para la próxima versión. Afortunadamente, para la reproducción de audio existe una alternativa, la clase System.Media.SoundPlayer, que permite la reproducción simple de archivos WAV sin necesidad del Reproductor de Windows Media. Más adelante veremos cómo se usa esta clase.

Back to top

Uso del control MediaElement
La forma más sencilla de agregar medios a una aplicación de Windows Presentation Foundation es, sin duda, mediante el control nuevo de MediaElement. Este control, como todos los demás de Windows Presentation Foundation, se puede agregar mediante XAML, o bien en el archivo de código subyacente mediante C# o Visual Basic ®. MediaElement habilita la reproducción y el control básicos de archivos multimedia y se puede ejecutar en uno de estos dos modos: Independent o Clock.

El modo Independent, que es el predeterminado, funciona de forma más parecida al reproductor multimedia tradicional:

   <MediaElement Source="myMedia.wmv" Width="320"         Height="240" LoadedBehavior="Manual" />

Puede establecer la propiedad Source, que será un URI para un archivo multimedia. Lo que suceda cuando se cargue el archivo multimedia depende de la propiedad LoadedBehavior. Dicha propiedad se debe establecer en un valor de la enumeración de MediaState: Close, Manual, Pause, Play o Stop. Para controlar la reproducción multimedia mediante los métodos Play, Pause o Stop del control MediaElement, la propiedad LoadedBehavior se debe establecer en Manual.

La figura 1 muestra un ejemplo de reproductor multimedia sencillo usando el control MediaElement que se ejecuta en modo Independent. La figura 2 muestra los códigos XAML y C# usados para implementar dicho control.

Figura 1 Un control MediaElement sencillo
Figura 1 Un control MediaElement sencillo

La ejecución del control MediaElement en modo Clock le permite controlar la reproducción multimedia mediante el sólido motor de animación de Windows Presentation Foundation. El modo Clock se puede habilitar mediante el uso de MediaElement como parte de MediaTimeline o mediante la creación explícita de MediaClock a partir de MediaTimeline y la asignación del mismo a MediaElement (aunque no es recomendable). Esto puede parecer confuso, pero simplemente significa que puede adjuntar MediaElement a un guión gráfico y animar la posición mediante el motor de animación de Windows Presentation Foundation. Esto le permite sincronizar la reproducción multimedia con otras animaciones de la aplicación.

A continuación, se presenta un ejemplo del código XAML necesario para reproducir medios en modo Clock mediante un guión gráfico:

<MediaElement Name="myMedia" Width="320" Height="240" /> <Grid.Triggers> <EventTrigger RoutedEvent="Grid.Loaded">   <EventTrigger.Actions>     <BeginStoryboard>       <Storyboard Storyboard.TargetName="myMedia">         <MediaTimeline Source="myMedia.wmv"            BeginTime="00:00:00" Duration="00:05:00" />       </Storyboard>     </BeginStoryboard>   </EventTrigger.Actions>     </EventTrigger> </Grid.Triggers>

Tenga en cuenta que el origen del archivo multimedia se establece en MediaTimeline antes que en MediaElement. MediaTimeline se dirige al control MediaElement a través de la propiedad adjunta Storyboard.TargetName. El modo Clock puede ser confuso si no está familiarizado con el motor de animación de Windows Presentation Foundation, de modo que asegúrese de estar cómodo con la animación básica de Windows Presentation Foundation antes continuar por este camino.

Después de instalar MediaElement y configurar el modo, puede leer y escribir todas las propiedades que desee para mejorar aún más la experiencia de la reproducción multimedia. Para obtener o establecer la posición de los archivos multimedia, basta con establecer la propiedad Position mediante un objeto TimeSpan válido. Puede mostrar al usuario el progreso de almacenamiento en búfer y de reproducción mediante la lectura de las propiedades BufferingProgress y DownloadProgress. Para el control de audio, las propiedades Balance y Volume se pueden personalizar o animar en una pista de audio multimedia. Reflexione ahora si estos valores se enlazaron a datos para algunos controles deslizantes; con ello podría dar al usuario control total sobre la experiencia auditiva de medios.

MediaElement también desencadena algunos eventos útiles. MediaOpened y MediaEnded sirven para desencadenar otras partes de la aplicación en función de si los medios se han iniciado o finalizado. Los eventos BufferingStarted y BufferingEnded le permiten mostrar al usuario los comentarios cuando el vídeo se congela durante una operación de almacenamiento en búfer. Si se usan en combinación con la propiedad BufferingProgress, le permiten mostrar al usuario el porcentaje de almacenamiento en búfer de forma similar a cuando se visualizan secuencias de vídeo con el Reproductor de Windows Media.

A partir de mi propia experiencia, y convencido por conversaciones con el equipo multimedia de Windows Presentation Foundation, le recomiendo que use normalmente el control MediaElement en el modo Independent, salvo que el modo Clock sea totalmente necesario. Para la reproducción y control estándar de medios, no es necesario usar guiones gráficos ni MediaTimelines. Por otro lado, debe seleccionar MediaElement de forma predeterminada para la integración multimedia porque la capacidad de agregarlo mediante XAML permite que los diseñadores implementen medios, lo que deja al programador libre para realizar otras operaciones.

Back to top

Uso de la clase MediaPlayer
Si el control MediaElement no ofrece suficiente funcionalidad ni control sobre la reproducción de la aplicación, la siguiente opción que debe tener en cuenta es la clase MediaPlayer situada en el espacio de nombres System.Windows.Media . Puesto que no es un elemento de control de Windows Presentation Foundation, la única forma de implementar MediaPlayer es crearlo en el archivo de código subyacente mediante C# o Visual Basic. A continuación, se ofrece un sencillo ejemplo que muestra cómo implementar MediaPlayer mediante C#:

MediaPlayer mp = new MediaPlayer(); Try {     mp.Open(new Uri("myMedia.wmv")); } catch(Exception ex) {     MessageBox.Show(ex.Message); }

Las propiedades y los métodos disponibles en la clase MediaPlayer son increíblemente parecidos a los del control MediaElement. Esto no es sólo una coincidencia, ya que MediaElement es básicamente un contenedor de alto nivel de la clase MediaPlayer. La advertencia más importante con respecto al uso de MediaPlayer, es que no tiene representación visual directa y no se puede agregar directamente al árbol visual. Para reproducir vídeo debe dibujar MediaPlayer en una superficie visual y, a continuación, agregar dicha superficie al árbol visual. Esto convierte a MediaPlayer en una buena opción para reproducir audio porque, evidentemente, no necesita ninguna representación visual. Para la reproducción directa de vídeo, el control MediaElement es una opción más adecuada porque se hereda de la clase UIElement y, por lo tanto, se puede agregar directamente al árbol visual de aplicaciones.

Al igual que con el control MediaElement, puede ejecutar una instancia de MediaPlayer en cualquiera de los dos modos, Independent o Clock. En cuanto al control de reproducción, se vuelve a tratar básicamente de una copia exacta del control MediaElement. Se plantea de este modo la pregunta de cuál es la diferencia con MediaPlayer. Bueno, por un lado, no existen propiedades LoadedBehavior ni UnloadedBehavior con las que trabajar, ya que son exclusivas del control MediaElement. Si tiene pensado dibujar medios en superficies 3D mediante la clase VideoDrawing, deberá usar MediaPlayer, porque la propiedad Player de VideoDrawing no aceptará un control MediaElement como valor. No se preocupe, yo le mostraré cómo se dibujan vídeos en 3D y en otras superficies un poco más adelante.

Otra ventaja (o desventaja, según sea la situación en que se encuentre) es que como MediaPlayer no se implementa mediante XAML, no pasa a formar parte del árbol visual. No formar parte del árbol visual puede beneficiarle si el archivo multimedia no necesita representación visual. Hay también algunas diferencias en la forma de cargar un archivo multimedia en la aplicación. Con el control MediaElement, establece la propiedad Source, pero cuando se usa la clase MediaPlayer, llama al método Open y pasa un objeto Uri válido.

De modo que si la aplicación no requiere archivos multimedia para la implementación mediante XAML o para tener una representación visual automática, el Reproductor de Windows Media es probablemente la mejor opción, ya que le ofrece todas las capacidades del control MediaElement sin la temida desventaja adicional comentada anteriormente.

Back to top

Incrustación de vídeo en controles de WPF
Puesto que el control MediaElement se hereda de la clase System.Windows.UIElement, se puede poner cualquier otro control UIElement donde se desee. Un ejemplo de ello sería anidar un control MediaElement en un control Button, con lo que se crearía un botón de vídeo. Esto se puede lograr mediante este código XAML:

  <Button Name="myVideoButton" Click="playVideo"            Width="320" Height="240">       <MediaElement Name="myVid" Source="myMedia.wmv"            LoadedBehavior="Manual" Width="320"           Height="240" />   </Button>

En este código, incrusto MediaElement en un control Button y establezco LoadedBehavior en Manual. El evento de clic del Botón llama a un método (no mostrado) que indica a MediaElement el inicio de la reproducción. Con unas pocas líneas de código ha creado una vista en miniatura interactiva de vídeo. Se abre toda una gama de posibilidades creativas debido a que Windows Presentation Foundation trata el control MediaElement como cualquier otro elemento de la interfaz de usuario del árbol visual. Como verá en la siguiente sección, puede pintar el vídeo que está reproduciendo en MediaElement en otros objetos de Windows Presentation Foundation para crear experiencias de usuario increíblemente ricas.

Back to top

Técnica de superficie mojada
Últimamente, se han aplicado efectos de reflexión y de cristal a todo lo visible en las interfaces. Sin duda, algún día le pedirán aplicar dicha técnica en Windows Presentation Foundation y, afortunadamente, es fácil. El amplío sistema de pinceles de Windows Presentation Foundation, le permite pintar un control sobre otro con total comodidad. En este ejemplo, pintaré el vídeo mientras se reproduce en un control MediaElement sobre un rectángulo mediante VisualBrush, lo que creará una reflexión perfecta del vídeo. En el mundo del diseño, este efecto se conoce como superficie mojada.

La forma más fácil de crear un efecto de superficie mojada es colocar el control MediaElement en la primera entrada del control StackPanel. Debajo de eso, cree un rectángulo con las mismas dimensiones que el vídeo. A continuación, use VisualBrush como relleno para el rectángulo y enlace los datos de la propiedad Visual al control MediaElement. Por último, voltee la reflexión para crear una reflexión exacta y aplique OpacityMask para atenuarla.

La figura 3 muestra el efecto finalizado, mientras que la figura 4 muestra el código XAML. Este tipo de manipulación visual habría sido increíblemente complicada mediante la programación tradicional de Win32. Gracias a las eficaces características de databinding de Windows Presentation Foundation, se obtiene una reflexión en directo que se actualiza automáticamente cuando se actualizan los vídeos.

Figura 3 Efecto finalizado de superficie mojada
Figura 3 Efecto finalizado de superficie mojada

Back to top

Asignación de vídeo en superficies 3D
Si tuviera que elegir el aspecto que parece haber creado más bullicio alrededor de Windows Presentation Foundation, sería la capacidad de asignar archivos de vídeo a objetos de malla 3D. La demostración de North Face mostró lo eficaz que esto puede ser para ayudar a crear una interfaz de usuario visualmente impactante. Mientras que muchas personas han eliminado este efecto por ser demasiado artificioso o por usar demasiados recursos, creo que, si se usa con moderación, puede convertir una aplicación ordinaria en una que presente una experiencia destacable a los usuarios.

En cuanto al rendimiento, obviamente se produce una sobrecarga considerable al mostrar y animar mallas 3D. Si le agregamos la visualización de vídeos con todos los movimientos posibles, es decir, asignarlos a mallas 3D, estamos hablando de una sobrecarga enorme. Al igual que para beber cappuccinos, la clave está en la moderación. En términos generales, el rendimiento de 3D de Windows Presentation Foundation me ha parecido excelente, siempre que la complejidad (número de polígonos) de las mallas 3D se mantenga en el nivel mínimo necesario. El equipo multimedia de Windows Presentation Foundation debe reducir la carga de los medios 3D para futuras versiones, aunque siempre costará más que usar medios 2D.

Antes de analizar cómo asignar vídeos a objetos 3D, revisemos lo que se necesita para establecer una escena 3D en Windows Presentation Foundation. Antes que nada, necesitará un objeto 3D para ponerlo en la escena. No hay clases primitivas para 3D incluidas en .NET Framework  3.0. Sin embargo, en Microsoft se creó una clase denominada Mesh3DObjects, que puede crear una gran variedad de objetos primitivos. Puede obtener más información acerca de esta clase en el tutorial de Karsten Januszewski en msdn.microsoft.com/library/en-us/dnlong/html/avalon2d-3d.asp.)

Hay determinados conjuntos de elementos necesarios para crear una escena 3D en Windows Presentation Foundation. En primer lugar, necesita el objeto 3D, que, a su vez, necesita tener algún tipo de material para que se pueda ver en la escena. Las materiales se crean mediante pinceles como SolidColorBrush, LinearGradientBrush, ImageBrush o VisualBrush. En breve, verá cómo se puede usar VisualBrush para asignar vídeo, o cualquier otro elemento visual para dicho propósito, en una superficie 3D. La técnica es básicamente la misma que la técnica de superficie mojada analizada anteriormente.

La malla 3D y los materiales se deben agrupar dentro de un elemento GeometryModel3D; al hacerlo, se crea un objeto 3D válido de Windows Presentation Foundation. Para que se pueda ver una escena 3D, deberá agregar una o más luces a la escena. A continuación, al igual que es imposible hacer una fotografía sin cámara, tampoco es posible con una escena 3D en Windows Presentation Foundation. Por último, para terminar la escena, se deben ajustar todos estos elementos en un control Viewport3D para cerrar el trato.

Una vez que tiene preparada y en funcionamiento una escena 3D, puede empezar a divertirse asignando vídeos y otros medios a mallas 3D. Esto se logra mediante VisualBrush para dibujar el vídeo en la superficie 3D. En el fragmento de código siguiente, aplico VisualBrush a DiffuseMaterial en el objeto 3D:

<GeometryModel3D.Material> <DiffuseMaterial>     <DiffuseMaterial.Brush>         <VisualBrush>             <VisualBrush.Visual>                 <MediaElement Source="myMedia.wmv" />             </VisualBrush.Visual>         </VisualBrush>     </DiffuseMaterial.Brush> </DiffuseMaterial> </GeometryModel3D.Material>

La figura 5 muestra un solo fotograma del vídeo asignado a la superficie 3D de Windows Presentation Foundation.

Figura 5 Asignado a una superficie 3D de WPF
Figura 5 Asignado a una superficie 3D de WPF

Existe otra alternativa que puede usar para asignar vídeo a superficies 3D de Windows Presentation Foundation. La clase VideoDrawing, que forma parte del espacio de nombres System.Windows.Media, hace precisamente lo que su nombre indica. Puede dibujar vídeos procedentes de una instancia de MediaPlayer mediante la aplicación de DrawingBrush a alguna superficie compatible con el uso de pinceles. Para ello, necesita establecer la propiedad Drawing de DrawingBrush en una instancia de la clase VideoDrawing. Esta instancia de VideoDrawing puede representar vídeos mediante la configuración de la propiedad Player en una instancia de MediaPlayer que contenga un archivo de vídeo. Por último, se puede aplicar DrawingBrush a una propiedad Brush de DiffuseMaterial del objeto 3D. El fragmento de código siguiente muestra un ejemplo de implementación mediante C#:

MediaPlayer mp = new MediaPlayer(); mp.Open(myValidMediaUri); VideoDrawing vd = new VideoDrawing(); vd.Player = mp; DrawingBrush db = new DrawingBrush(); db.Drawing = vd; diffuseMat.Brush = db; vd.Player.Play();

Uno de las mayores diferencias entre usar VisualBrush o la clase VisualDrawing, es que VisualDrawing se debe crear e implementar en el archivo de código subyacente (mediante C# o Visual Basic). Además, la clase VideoDrawing sólo funcionará con instancias de MediaPlayer, pero no con el control MediaElement. En cuanto al rendimiento, no hay mucha diferencia entre los dos métodos, ya que ambos necesitan que Windows Presentation Foundation cree una superficie de representación intermedia para asignar correctamente el vídeo a la superficie 3D.

Back to top

Representación de mapas de bits a partir de fotogramas de vídeo
Una aplicación de vídeo puede simplemente necesitar usar una captura de pantalla de la secuencia de vídeo y representarla en un mapa de bits. Es posible ver un ejemplo en algún software comercial de reproducción de DVD, donde el usuario puede hacer clic en un icono de cámara durante cualquier momento de la reproducción para realizar una captura de pantalla procedente del vídeo. Otro uso podría ser la creación de vistas en miniatura de un conjunto de archivos de vídeo, en caso de que realmente no desee tenerlos todos conectados a controles MediaElement. También tiene capacidad para crear efectos de vídeo en tiempo de ejecución, aunque para este tipo de operaciones es preferible usar la API de DirectShow.

Como la mayoría de las características en Windows Presentation Foundation, existen varias formas de realizar una tarea; la representación de mapas de bits a partir de fotogramas de vídeo no es una excepción. Independientemente del método usado, la clase RenderTargetBitmap controla la funcionalidad principal para representar mapas de bits de elementos visuales en Windows Presentation Foundation, que forma parte del espacio de nombres Windows.Media.Imaging. Esta asombrosa clase puede crear mapas de bits a partir de cualquier elemento del árbol visual de una aplicación de Windows Presentation Foundation.

Para representar un mapa de bits mediante esta clase, primero debe crear un objeto DrawingVisual nuevo, que se pasa al método RenderTargetBitmap.Render. A continuación, debe crear un objeto DrawingContext nuevo, que pasará al método DrawingVisual Render. Mediante esta instancia de DrawingContext, puede dibujar todo tipo de gráficos en el objeto DrawingVisual. Para dibujar un fotograma de vídeo, puede llamar el método DrawingContext.DrawVideo y pasar a una instancia de MediaPlayer, que está reproduciendo el archivo de vídeo. También deberá pasar un valor Rect, que determina el área del archivo de vídeo que se va a capturar.

En este momento, ya puede representar un mapa de bits a partir de la instancia de DrawingVisual, que actualmente contiene el fotograma de vídeo capturado. Para hacerlo, sólo debe pasarlo al método RenderTargetBitmap.Render . Ahora la instancia de RenderTargetBitmap contiene el fotograma de vídeo, pero no se convertirá en mapa de bits hasta que lo pase al método BitmapFrame.Create. Para ver el fotograma en mapa de bits, sólo debe establecer esta llamada a método como el valor asignado a una propiedad Source del control Image. El fragmento de código siguiente muestra una implementación de esta técnica de captura de fotogramas mediante C#:

RenderTargetBitmap rtb = new RenderTargetBitmap(320, 240, 1 / 200,      1 / 200, PixelFormats.Pbgra32); DrawingVisual dv = new DrawingVisual(); DrawingContext dc = dv.RenderOpen(); dc.DrawVideo(myMediaPlayer, new Rect(0, 0, 320, 240)); dc.Close(); rtb.Render(dv); Image im = new Image(); im.Source = BitmapFrame.Create(rtb);

El formato de mapa de bits de destino se establece pasando un valor válido de enumeración PixelFormats al constructor de RenderTargetBitmap. Al principio, la capacidad de representar mapas de bits a partir de fotogramas de vídeo puede parecer una característica idónea, pero, en realidad, existen multitud de usos para este tipo de funcionalidad aparte de la sencilla herramienta de captura de pantalla de vídeo.

Back to top

Capacidades adicionales de audio en WPF
Casi todo lo que he expuesto hasta ahora acerca de la integración multimedia de Windows Presentation Foundation se cumple para vídeo audio. Sin embargo, hay varias clases adicionales disponibles para controlar la reproducción de audio en Windows Presentation Foundation. Como he mencionado anteriormente, los medios reproducidos en Windows Presentation Foundation se controlan, en realidad, mediante un conjunto de tiempos de ejecución del Reproductor de Windows Media que se deben cargar antes de que el archivo se pueda reproducir. Esto puede causar problemas mayores al intentar sincronizar archivos multimedia con eventos o animaciones de usuario, aunque se pueden mitigar mediante el comportamiento SLIP en escalas de tiempo. En cuanto al audio, hay algunas alternativas que pueden eludir este problema.

La clase SoundPlayer, que forma parte del espacio de nombres System.Media, presenta una interfaz sencilla para cargar y reproducir los archivos de audio de formato WAV. Estos archivos WAV pueden ser recursos externos, de transmisión por secuencias o incrustados. Este método de reproducción de audio presenta una sobrecarga muy inferior a la comentada anteriormente para reproducir un archivo de audio mediante un control MediaElement, ya que absolutamente nada depende del Reproductor de Windows Media para la reproducción.

Para cargar un archivo WAV en una instancia de SoundPlayer, primero deberá establecer la propiedad SoundLocation en la ubicación del archivo WAV y, a continuación, llamar al método Load para iniciar el proceso de carga. Una vez que el archivo se ha cargado completamente, lo puede reproducir mediante el método SoundPlayer.Play. El archivo no se empezará a reproducir hasta que se haya cargado completamente en la memoria.

Esta reproducción ligera de audio también está disponible en XAML mediante el control SoundPlayerAction, que le permite reproducir un archivo WAV en EventTrigger. Por ejemplo, esto es muy útil para sonidos de interfaz para sustitución incremental de botones. Para usarlo, sólo debe ponerlo en el bloque EventTrigger.Actions de EventTrigger. A continuación, un fragmento de código muestra una llamada a SoundPlayerAction en respuesta a un evento MouseEnter de un botón:

<EventTrigger RoutedEvent=" Button.MouseEnter" SourceName="myButton"> <EventTrigger.Actions>         <SoundPlayerAction Source="media/overSound.wav"/>     </EventTrigger.Actions> </EventTrigger>
Comentarios
  1. ivy nieves fajardo dice:

    hola nelson .vivo en miami,te dire que tus articulos son de tremenda ayuda,y por tal razon te escribo con la esperanza de que me puedas ayudar.primero mi compu es de escritorio,uso windows vista ultimate,pero sucede que mi media player no funciona,me sale que tengo que ver la web para ayuda,como todo me sale en ingles se me hace dificil entender el proceso indicado,podrias ayudarme por favor,me puede escribir a mi e-mail-ivynievesfajardo@yahoo.com.gracias te lo agradezco de ante mano.

  2. Manuel dice:

    saludos me parece muy interesente la informacion que reflejas en tu blog. soy ing en sistemas y tengos varios años trabajando con .net , el dia de hoy me encontraba buscando informacion sobre c# y por casualidad di con tu pagina. felicitaciones (tambien soy de venezuela y actualmente vivo y trabajo en caracas)

    • Nelson Gomez dice:

      Saludos manuel espero estes bien.

      Gracias por tomar un poco de tu valioso tiempo y visitar mi blog. Trabajamos para eso, para ayudar a todos.
      En lo que pueda ayudarte cuenta conmigo.

      Nuevamente gracias por todo…
      Saludos…

  3. Me parece muy bueno tu blogs

  4. marcelo flores dice:

    Hola Manuel me llamo la atencion tu blog y te felicito; me considero un programador de corazon pero me tropece con un problema actualmente estoy con un problema con el MediaElement; mi proyecto compila todo perfectamente pero no me carga o no me muestra la reproduccion del mismo k crees k pueda estar sucediento tengo un Vs2008 y espero me puedas ayudar.
    Atte. Marcelo Flores (Tarija – Bolvia)

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s