Windows Phone 8.1 es una de las principales actualizaciones para Windows Phone. Esta nueva versión incluye nuevas APIs,un nuevo concepto de aplicaciones universales, la inclusión de APIs WinRT, nuevos controles de interfaz de usuario y mucho más.

Una de las nuevas API introducida es la que tiene que ver con la edición de audio/video. Hasta ahora estábamos usando Movie Maker u otro software de edición para recortar video, hacer una composición de varios videos, aplicar efectos, etc. Estábamos obligados a utilizar un ordenador, pero ahora nuestros smartphones son lo suficientemente potente como para hacer este tipo de tareas. Así que vamos a echar un vistazo a las características y uso de la nueva API de edición multimedia de Windows Phone 8.1.

Windows Media Editing API

La API de edición de video proporciona la clase MediaClip, cuyo objeto representa un archivo multimedia, es decir, un vídeo, una imagen o un audio. Para realizar cualquier tipo de operación de edición en un archivo multimedia, primero se debe crear el objeto MediaClip. La clase MediaClip ofrece tres métodos estáticos para crear el objeto.

MediaClip.CreateFromFileAsync(IStorageFile file)

Que crea un objeto MediaClip de un archivo de vídeo.

MediaClip.CreateFromImageFileAsync(IStorageFile file, TimeSpan originalDuration)

Que crea un objeto MediaClip desde un archivo de imagen. El parámetro “originalDuration” se utiliza cuando creamos una composición de archivos multimedia. Representa el tiempo que la imagen se muestra en el clip de vídeo que vamos a crear.

MediaClip.CreateFromColor(Color color, TimeSpan originalDuration)

Para crear un archivo de video, o clip, que muestra un solo color por un período de tiempo específico. Este tipo de videos se usan típicamente para intercalarlos entre videos convencionales delimitando los mismos.

Después de crear clips multimedia, tendremos un objeto de archivo en particular. A continuación podemos aplicar efectos, así como editarlos. Vamos a ver cómo hacerlo.

Recortar un video

Para recortar un vídeo, lo haremos en dos pasos. Después de crear el objeto MediaClip, sólo hay que establecer estas dos propiedades: (1) TrimTimeFromStart y (2) TrimTimeFromEnd. Después de ajustarlas, el archivo de video habrá quedado recortado.

Más adelante podremos cambiar los tiempos de corte tantas veces como queramos. Veremos además cómo renderizar este objeto MediaClip en un archivo.

// Crear el objeto MediaClip
MediaClip objMediaClip = await MediaClip.CreateFromFileAsync(file)

// Cortar del archivo a partir de la posición indicada (1 minuto y 20 segundos)
objMediaClip.TrimTimeFromStart = new TimeSpan(0,1,20);

// Volvemos a cortarlo
objMediaClip.TrimTimeFromEnd = objMediaClip.OriginalDuration – new TimeSpan(0,2,9);

 

Camara lenta (Slow motion) y Efectos de Estabilización

Microsoft proporciona la plataforma MFT (Media Foundation Transform) a través de la cual podemos desarrollar componentes WinRT en C++. Estos componentes pueden ser utilizados para aplicar varios efectos de reproducción y filtrado de vídeo.MediaAPI

El espacio de nombres Windows.Media.Effects está dedicado a efectos de video predefinidos que pueden ser utilizados para aplicar en cualquier archivo de vídeo. Uno de los efectos es el de cámara lenta o slow motion que este namespace proporciona a través de la clase SlowMotionEffectDefinition. Esta clase tiene una propiedad llamada TimeStretchRate, que se utiliza para la ralentización del video. Se parte de 1 como la velocidad normal del video, por lo que si establece TimeStretchRate como 0.5, la velocidad de vídeo será la mitad de la inicial. (Si ajustamos su valor mayor a 1 lanza una excepción, por lo que se puede utilizar para acelerar el video)

Ahora para aplicar el efecto de slow motion, primero tenemos que crear el objeto MediaClip. MediaClip tiene la propiedad VideoEffectDefinitions que es un IList . Así que antes de todo lo que tenemos que crear es el objeto SlowMotionEffectDefinition y establecer la propiedad TimeStretchRate. A continuación, añadimos ese objeto a la lista VideoEffectDefinitions. Eso es todo, el vídeo ya está en cámara lenta. Veremos más adelante cómo obtener una vista previa y la forma de guardar el video con los efectos.

// Consideremos que ya tenemos un objeto MediaClip.
// Crear un objeto SlowMotionEffectDefinition
var objSlowMotionEffectDefinition = new SlowMotionEffectDefinition();
objSlowMotionEffectDefinition.TimeStretchRate = 0.6;

// Añadir el objeto a la propiedad VideoEffectDefinitions de MediaClip.
objMediaClip.VideoEffectDefinitions.Add(objSlowMotionEffectDefinition);

Del mismo modo, también podemos agregar un efecto de estabilización de vídeo. El efecto VideoStabilization puede ayudar a reducir los temblores en un video. Este efecto reside en el espacio de nombres Windows.Media que únicamente contiene una clase estática llamada VideoEffects. Para aplicar este efecto no tenemos que crear ningún objeto, sino establecer la propiedad VideoStabilization, de tipo string, al ID de la clase activable para la que queremos aplicar el efecto.

// Crear el objeto VideoEffectDefinition con el parametro VideoEffects .VideoStabilization
var objVideoStabilization = new VideoEffectDefinition(VideoEffects .VideoStabilization);

// Añadir el objeto a la lista VideoEffectDefinitions del objeto MediaClip
objMediaClip.VideoEffectDefinitions.Add(objVideoStabilization);

 

Filtrado y Otros efectos

El SDK Nokia Imaging proporciona una gran cantidad de filtros para el procesamiento de imágenes. Por desgracia, no funciona para los vídeos. Podemos resolver este problema mediante el desarrollo de componentes WinRT C++ usando MFT.

Según la MSDN, los Media Foundation Transforms (MFT) proporcionan un modelo genérico para el procesamiento de datos multimedia. Los MFTs se utilizan por los decodificadores, codificadores y procesadores de señales digitales (DSP). En resumen, todo lo que se encuentra en el pipleine entre el archivo multimedia y el disipador de medios es una MFT.

Microsoft ha publicado un ejemplo con código fuente de varios efectos (escala de grises, ojo de pez, efectos de pellizcar e invertido) que nos muestra cómo crear este tipo de componentes y también nos muestra cómo aplicar estos efectos en la reproducción.

Para aplicar el efecto de ejemplo de la MSDN es bastante similar al ya mostrado de slow motion o el efecto de estabilización de vídeo. Tenemos primero que añadir a nuestro proyecto los componentes C + + WinRT de MSDN y definir los identificadores de clase activables en el archivo de manifiesto del proyecto WP 8.1. Añadir a continuación las siguientes líneas en el manifiesto antes del cierre de la etiqueta.

<Extensions>

    <Extension Category="windows.activatableClass.inProcessServer">

      <InProcessServer>

        <Path>GrayscaleTransform.dll</Path>

        <ActivatableClass ActivatableClassId="GrayscaleTransform.GrayscaleEffect" ThreadingModel="both"/>

      </InProcessServer>

    </Extension>

    <Extension Category="windows.activatableClass.inProcessServer">

      <InProcessServer>

        <Path>PolarTransform.dll</Path>

        <ActivatableClass ActivatableClassId="PolarTransform.PolarEffect" ThreadingModel="both"/>

      </InProcessServer>

    </Extension>

    <Extension Category="windows.activatableClass.inProcessServer">

      <InProcessServer>

        <Path>InvertTransform.dll</Path>

        <ActivatableClass ActivatableClassId="InvertTransform.InvertEffect" ThreadingModel="both"/>

      </InProcessServer>

    </Extension>

</Extensions>

Ahora cada efecto tiene su propio identificador de clase activable, por lo que tenemos que crear primero un objeto de la clase VideoEffectDefinition y pasar ese identificador como argumento en el constructor. Por último añadir el objeto de VideoEffectDefinition al objeto MediaClip. Eso es todo.

var objGrayScaleEffect = new VideoEffectDefinition(“GrayscaleTransform.GrayscaleEffect”);

objMediaClip.VideoEffectDefinitions.Add(objGrayScaleEffect);

var objInvertEffect = new VideoEffectDefinition(“InvertTransform.InvertEffect”);

objMediaClip.VideoEffectDefinitions.Add(objInvertEffect);

En los ejemplos de la MSDN que hablamos antes (ojo de pez, pellizcar y pinchar) el efecto se define en un solo componenet WinRT. Para solicitar cualquiera de sus efectos tenemos que pasar los parámetros de configuración adecuados para cada uno de ellos. El constructor de VideoEffectDefinition está sobrecargado para aceptar un par clave-valor para configurar el efecto.

// Definir los parametros de configuración
PropertySet configuration = new PropertySet();
configuration.Add(“effect”, “Fisheye”);
// configuration.Add(“effect”, “Warp”);
// configuration.Add(“effect”, “Pinch”);

// Crear un objeto de VideoEffectDefinition con clase y la configuración definida
var objPolarEffect = new VideoEffectDefinition(“PolarTransform.PolarEffect”, configuration);

// Añadir el a la lista del objeto VideoEffectDefinitions objMediaClip.VideoEffectDefinitions.Add(objPolarEffect);

 

Guardar el vídeo

Hemos aprendido cómo recortar videos y aplicar efectos, ahora es el turno de guardar el video. La API MediaEditing tiene una clase más que se llama MediaComposition. MediaClip representa un solo archivo multimedia, mientras que MediaComposition es un grupo de objetos MediaClip que le permite gestionar todos los objetos MediaClip en composición.

Componer un video con varias partes o clips es una tarea compleja, por lo que sería de gran ayuda disponder devuna previa de ella, no es así? MediaComposition ofrece una vista previa del mismo, así que para ver el vídeo en el que hemos aplicado los efectos, hay que añadir primero el MediaClip al objeto MediaComposition y luego generar la vista previa. Podemos además ajustar las dimensiones (ancho y alt) de la vista previa.

// Crear un objeto de la clase MediaComposition
var objMediaComposition = new MediaComposition();

// Añadir MediaClip a la composición después de la aplicación de efectos
objMediaComposition.Clips.Add(objMediaClip);

// Generar una vista previa y establecer como fuente de MediaElement
MediaElement.SetSource(objMediaComposition. GeneratePreviewMediaStreamSource(360, 240));

Ahora para salvar el MediaClip tenemos que llamar a su método asíncrono RenderToFileAsync(IStorageItem file).

// Crear un archivo utilizando un selector para guardarlo o en la carpeta temporal
var file = await ApplicationData.Current.LocalFolder.CreateFileAsync(“MyVideo.mp4”);

// Renderizar el MediaComposition a un archivo
await objMediaComposition.RenderToFileAsync(file);

Y así es como ya podemos realizar edición de archivos multimedia desde nuestras aplicaciones en Windows Phone 8.1