Administrar marcos de video en presentaciones en .NET

Introducción

Un video bien colocado en una presentación puede hacer que tu mensaje sea más atractivo y aumentar los niveles de participación de tu audiencia.

PowerPoint te permite añadir videos a una diapositiva de una presentación de dos maneras:

  • Añadir o incrustar un video local (almacenado en tu equipo)
  • Añadir un video en línea (desde una fuente web como YouTube).

Para permitirte añadir videos (objetos de video) a una presentación, Aspose.Slides proporciona la interfaz IVideo , la interfaz IVideoFrame y otros tipos relevantes.

Crear un marco de video incrustado

Si el archivo de video que deseas añadir a tu diapositiva está almacenado localmente, puedes crear un marco de video para incrustar el video en tu presentación.

  1. Crear una instancia de la clase Presentation .
  2. Obtener la referencia de una diapositiva mediante su índice.
  3. Añadir un objeto IVideo y proporcionar la ruta del archivo de video para incrustar el video en la presentación.
  4. Añadir un objeto IVideoFrame para crear un marco para el video.
  5. Guardar la presentación modificada.

Este código C# muestra cómo añadir un video almacenado localmente a una presentación:

// Instancia la clase Presentation
using (Presentation pres = new Presentation("pres.pptx"))
{
    // Carga el video
    using (FileStream fileStream = new FileStream("Wildlife.mp4", FileMode.Open, FileAccess.Read))
    {
        IVideo video = pres.Videos.AddVideo(fileStream, LoadingStreamBehavior.KeepLocked);
        
        // Obtiene la primera diapositiva y añade un marco de video
        pres.Slides[0].Shapes.AddVideoFrame(10, 10, 150, 250, video);
        
        // Guarda la presentación en disco
        pres.Save("pres-with-video.pptx", SaveFormat.Pptx);
    }
}

Alternativamente, puedes añadir un video pasando su ruta de archivo directamente al método AddVideoFrame:

using (Presentation pres = new Presentation())
{
    ISlide sld = pres.Slides[0];
    IVideoFrame vf = sld.Shapes.AddVideoFrame(50, 150, 300, 150, "video1.avi");
}

Crear un marco de video con video de una fuente web

Las versiones más recientes de Microsoft PowerPoint admiten videos en línea en presentaciones. Si el video que deseas usar está disponible en línea (p. ej. en YouTube), puedes añadirlo a tu presentación mediante su enlace web.

  1. Crear una instancia de la clase Presentation
  2. Obtener la referencia de una diapositiva mediante su índice.
  3. Añadir un objeto IVideo y proporcionar el enlace al video.
  4. Establecer una miniatura para el marco de video.
  5. Guardar la presentación.

Este código C# muestra cómo añadir un video desde la web a una diapositiva en una presentación de PowerPoint:

public static void Run()
{
    // Instancia un objeto Presentation que representa un archivo de presentación 
    using (Presentation pres = new Presentation())
    {
        AddVideoFromYouTube(pres, "Tj75Arhq5ho");
        pres.Save("AddVideoFrameFromWebSource_out.pptx", SaveFormat.Pptx);
    }
}

private static void AddVideoFromYouTube(Presentation pres, string videoId)
{
    // Añade un VideoFrame
    IVideoFrame videoFrame = pres.Slides[0].Shapes.AddVideoFrame(10, 10, 427, 240, "https://www.youtube.com/embed/" + videoId);
    videoFrame.PlayMode = VideoPlayModePreset.Auto;

    // Carga la miniatura
    using (WebClient client = new WebClient())
    {
        string thumbnailUri = "http://img.youtube.com/vi/" + videoId + "/hqdefault.jpg";
        videoFrame.PictureFormat.Picture.Image = pres.Images.AddImage(client.DownloadData(thumbnailUri));
    }
}

Recortar un marco de video

Aspose.Slides permite controlar qué parte de un video se reproduce estableciendo los valores trim-from-start y trim-from-end mediante IVideoFrame.TrimFromStart y IVideoFrame.TrimFromEnd. Ambos valores se especifican en milisegundos y definen cuánto tiempo se omite al principio y al final del video, respectivamente. Estas configuraciones cambian los ajustes de reproducción del video en la presentación; no recortan ni modifican de otra forma los datos binarios del video incrustado.

Establecer configuraciones de recorte

Para crear un marco de video y establecer sus configuraciones de recorte:

  1. Crear una instancia de la clase Presentation .
  2. Añadir un objeto IVideo a la presentación.
  3. Añadir un objeto IVideoFrame a una diapositiva.
  4. Establecer los valores trim-from-start y trim-from-end mediante IVideoFrame.TrimFromStart y IVideoFrame.TrimFromEnd .
  5. Guardar la presentación modificada.

El siguiente ejemplo de código omite los primeros 2,5 segundos y el último segundo de un video incrustado durante la reproducción:

using var presentation = new Presentation();

var videoData = File.ReadAllBytes("video.mp4");
var video = presentation.Videos.AddVideo(videoData);

var slide = presentation.Slides[0];
var videoFrame = slide.Shapes.AddVideoFrame(50, 50, 640, 360, video);

videoFrame.TrimFromStart = 2500f;
videoFrame.TrimFromEnd = 1000f;

presentation.Save("video_with_trim.pptx", SaveFormat.Pptx);

Leer configuraciones de recorte

Para inspeccionar las configuraciones de recorte existentes, carga una presentación, busca un objeto IVideoFrame entre las formas de la primera diapositiva y lee los valores mediante IVideoFrame.TrimFromStart y IVideoFrame.TrimFromEnd .

El siguiente ejemplo de código encuentra el primer marco de video en la primera diapositiva y muestra sus configuraciones de recorte en milisegundos:

using var presentation = new Presentation("video_with_trim.pptx");

var slide = presentation.Slides[0];
foreach (var shape in slide.Shapes)
{
    if (shape is IVideoFrame videoFrame)
    {
        var trimFromStart = videoFrame.TrimFromStart;
        var trimFromEnd = videoFrame.TrimFromEnd;

        Console.WriteLine($"Trim from start: {trimFromStart} ms");
        Console.WriteLine($"Trim from end: {trimFromEnd} ms");

        break;
    }
}

Gestionar subtítulos de video

Aspose.Slides permite gestionar subtítulos cerrados para los marcos de video en presentaciones de PowerPoint. Los subtítulos se almacenan en formato WebVTT y se exponen a través de la propiedad IVideoFrame.CaptionTracks .

Añadir subtítulos a un marco de video

Para añadir subtítulos a un marco de video:

  1. Crear una instancia de la clase Presentation .
  2. Añadir un video a la presentación.
  3. Añadir un objeto IVideoFrame a una diapositiva.
  4. Utilizar la colección CaptionTracks para añadir una pista de subtítulos WebVTT.
  5. Guardar la presentación modificada.

El siguiente código muestra cómo añadir subtítulos a un marco de video:

using (Presentation presentation = new Presentation())
{
    byte[] videoData = File.ReadAllBytes("video.mp4");
    IVideo video = presentation.Videos.AddVideo(videoData);

    ISlide slide = presentation.Slides[0];
    IVideoFrame videoFrame = slide.Shapes.AddVideoFrame(0, 0, 100, 100, video);

    // Añade una nueva pista de subtítulos desde un archivo WebVTT.
    presentation.Save("video_with_captions.pptx", SaveFormat.Pptx);
}

La interfaz ICaptionsCollection también proporciona una sobrecarga que permite añadir subtítulos desde un flujo.

Extraer subtítulos de un marco de video

  1. Cargar la presentación que contiene el video.
  2. Encontrar el objeto IVideoFrame objetivo.
  3. Iterar a través de la colección CaptionTracks .
  4. Guardar cada pista de subtítulos en un archivo .vtt .

El siguiente código muestra cómo extraer subtítulos de un marco de video:

using (Presentation presentation = new Presentation("video_with_captions.pptx"))
{
    ISlide slide = presentation.Slides[0];
    foreach (IShape shape in slide.Shapes)
    {
        if (shape is IVideoFrame videoFrame)
        {
            foreach (ICaptions captionTrack in videoFrame.CaptionTracks)
            {
                // Guarda la pista de subtítulos en un archivo WebVTT.
                string filePath = $"{captionTrack.CaptionId}.vtt";
                File.WriteAllBytes(filePath, captionTrack.BinaryData);
            }
        }
    }
}

Cada objeto ICaptions expone el identificador del subtítulo, la etiqueta, los datos binarios y el texto del subtítulo como una cadena UTF-8.

Eliminar subtítulos de un marco de video

  1. Cargar la presentación que contiene el video.
  2. Obtener el objeto IVideoFrame objetivo.
  3. Eliminar las pistas de subtítulos de la colección CaptionTracks .
  4. Guardar la presentación modificada.

El siguiente código muestra cómo eliminar todos los subtítulos de un marco de video:

using (Presentation presentation = new Presentation("video_with_captions.pptx"))
{
    ISlide slide = presentation.Slides[0];
    IVideoFrame videoFrame = slide.Shapes[0] as IVideoFrame;

    // Elimina todos los subtítulos del marco de video.
    videoFrame.CaptionTracks.Clear();

    presentation.Save("video_without_captions.pptx", SaveFormat.Pptx);
}

Si necesitas eliminar solo una pista de subtítulos, utiliza los métodos Remove o RemoveAt en lugar de Clear .

Extraer video de una diapositiva

Además de añadir videos a las diapositivas, Aspose.Slides permite extraer videos incrustados en presentaciones.

  1. Crear una instancia de la clase Presentation para cargar la presentación que contiene el video.
  2. Iterar a través de todos los objetos ISlide .
  3. Iterar a través de todos los objetos IShape para encontrar un VideoFrame .
  4. Guardar el video en el disco.

Este código C# muestra cómo extraer el video de una diapositiva de una presentación:

// Instancia un objeto Presentation que representa un archivo de presentación 
Presentation presentation = new Presentation("Video.pptx");

// Itera a través de las diapositivas
foreach (ISlide slide in presentation.Slides)
{
    // Itera a través de las formas
    foreach (IShape shape in presentation.Slides[0].Shapes)
    {
        // Guarda el video en disco una vez se encuentra un VideoFrame que contiene el video
        if (shape is VideoFrame)
        {
            IVideoFrame vf = shape as IVideoFrame;
            String type = vf.EmbeddedVideo.ContentType;
            int ss = type.LastIndexOf('/');
            type = type.Remove(0, type.LastIndexOf('/') + 1);
            Byte[] buffer = vf.EmbeddedVideo.BinaryData;
            using (FileStream stream = new FileStream("NewVideo_out." + type, FileMode.Create, FileAccess.Write, FileShare.Read))
            {                                                     
                stream.Write(buffer, 0, buffer.Length);
            }
        }
    }
}

Preguntas frecuentes

¿Qué parámetros de reproducción de video se pueden cambiar para un VideoFrame?

Puedes controlar el modo de reproducción (automático o al hacer clic) y el bucle. Estas opciones están disponibles a través de las propiedades del objeto VideoFrame .

¿Afecta la adición de un video al tamaño del archivo PPTX?

Sí. Cuando incrustas un video local, los datos binarios se incluyen en el documento, por lo que el tamaño de la presentación crece proporcionalmente al tamaño del archivo. Cuando añades un video en línea, se incrustan un enlace y una miniatura, por lo que el aumento de tamaño es menor.

¿Puedo reemplazar el video en un VideoFrame existente sin cambiar su posición y tamaño?

Sí. Puedes intercambiar el contenido del video dentro del marco manteniendo la geometría de la forma; este es un escenario común para actualizar medios en un diseño existente.

¿Se puede determinar el tipo de contenido (MIME) de un video incrustado?

Sí. Un video incrustado tiene un tipo de contenido que puedes leer y usar, por ejemplo al guardarlo en el disco.