Gestionar marcos de vídeo en presentaciones usando PHP

Introducción

Un vídeo bien colocado en una presentación puede hacer que su mensaje sea más persuasivo y aumentar los niveles de compromiso con su audiencia.

PowerPoint permite agregar vídeos a una diapositiva en una presentación de dos formas:

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

Para permitirle añadir vídeos (objetos de vídeo) a una presentación, Aspose.Slides proporciona la clase Video, la clase VideoFrame y otros tipos relevantes.

Crear marcos de vídeo incrustados

Si el archivo de vídeo que desea añadir a su diapositiva está almacenado localmente, puede crear un marco de vídeo para incrustar el vídeo en su presentación.

  1. Cree una instancia de la clase Presentation.
  2. Obtenga la referencia de una diapositiva mediante su índice.
  3. Añada un objeto Video y pase la ruta del archivo de vídeo para incrustar el vídeo en la presentación.
  4. Añada un objeto VideoFrame para crear un marco para el vídeo.
  5. Guarde la presentación modificada.
  # Instancia la clase Presentation
  $pres = new Presentation("pres.pptx");
  try {
    # Carga el vídeo
    $fileStream = new Java("java.io.FileInputStream", "Wildlife.mp4");
    $video = $pres->getVideos()->addVideo($fileStream, LoadingStreamBehavior->KeepLocked);
    # Obtiene la primera diapositiva y añade un marco de vídeo
    $pres->getSlides()->get_Item(0)->getShapes()->addVideoFrame(10, 10, 150, 250, $video);
    # Guarda la presentación en disco
    $pres->save("pres-with-video.pptx", SaveFormat::Pptx);
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Alternativamente, puede añadir un vídeo pasando directamente su ruta de archivo al método addVideoFrame(float x, float y, float width, float height, Video video) :

  $pres = new Presentation();
  try {
    $sld = $pres->getSlides()->get_Item(0);
    $vf = $sld->getShapes()->addVideoFrame(50, 150, 300, 150, "video1.avi");
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Crear marcos de vídeo con vídeo de fuentes web

Microsoft PowerPoint 2013 y versiones posteriores admiten vídeos de YouTube en presentaciones. Si el vídeo que desea usar está disponible en línea (p. ej., en YouTube), puede añadirlo a su presentación mediante su enlace web.

  1. Cree una instancia de la clase Presentation.
  2. Obtenga la referencia de una diapositiva mediante su índice.
  3. Añada un objeto Video y pase el enlace al vídeo.
  4. Establezca una miniatura para el marco de vídeo.
  5. Guarde la presentación.
  # Instancia un objeto Presentation que representa un archivo de presentación
  $pres = new Presentation();
  try {
    addVideoFromYouTube($pres, "Tj75Arhq5ho");
    $pres->save("out.pptx", SaveFormat::Pptx);
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Recortar un marco de vídeo

Aspose.Slides le permite controlar qué parte de un vídeo se reproduce estableciendo los valores trim-from-start y trim-from-end mediante VideoFrame::setTrimFromStart y VideoFrame::setTrimFromEnd. Ambos valores se especifican en milisegundos y definen cuánto tiempo se salta al principio y al final del vídeo, respectivamente. Estos ajustes modifican la configuración de reproducción del vídeo en la presentación; no recortan ni alteran de otra forma los datos binarios del vídeo incrustado.

Establecer ajustes de recorte

Para crear un marco de vídeo y establecer sus ajustes de recorte:

  1. Cree una instancia de la clase Presentation.
  2. Añada un objeto Video a la presentación.
  3. Añada un objeto VideoFrame a una diapositiva.
  4. Establezca los valores trim-from-start y trim-from-end mediante VideoFrame::setTrimFromStart y VideoFrame::setTrimFromEnd.
  5. Guarde la presentación modificada.
$presentation = new Presentation();
$videoStream = null;
try {
    $videoStream = new Java("java.io.FileInputStream", "video.mp4");
    $video = $presentation->getVideos()->addVideo(
        $videoStream, LoadingStreamBehavior::ReadStreamAndRelease);
    $slide = $presentation->getSlides()->get_Item(0);
    $videoFrame = $slide->getShapes()->addVideoFrame(50, 50, 640, 360, $video);

    $videoFrame->setTrimFromStart(2500);
    $videoFrame->setTrimFromEnd(1000);

    $presentation->save("video_with_trim.pptx", SaveFormat::Pptx);
} finally {
    if ($videoStream !== null) {
        $videoStream->close();
    }
    $presentation->dispose();
}

Leer ajustes de recorte

Para inspeccionar los ajustes de recorte existentes, cargue una presentación, encuentre un objeto VideoFrame entre las formas de la primera diapositiva y lea los valores mediante VideoFrame::getTrimFromStart y VideoFrame::getTrimFromEnd.

$presentation = new Presentation("video_with_trim.pptx");
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $shapeCount = java_values($slide->getShapes()->size());
    for ($shapeIndex = 0; $shapeIndex < $shapeCount; $shapeIndex++) {
        $shape = $slide->getShapes()->get_Item($shapeIndex);
        if (java_instanceof($shape, new JavaClass("com.aspose.slides.VideoFrame"))) {
            $videoFrame = $shape;
            $trimFromStart = java_values($videoFrame->getTrimFromStart());
            $trimFromEnd = java_values($videoFrame->getTrimFromEnd());

            echo "Trim from start: " . $trimFromStart . " ms\n";
            echo "Trim from end: " . $trimFromEnd . " ms\n";
            break;
        }
    }
} finally {
    $presentation->dispose();
}

Gestionar subtítulos de vídeo

Aspose.Slides le permite gestionar los subtítulos cerrados para los marcos de vídeo en presentaciones de PowerPoint. Los subtítulos se almacenan en formato WebVTT y se exponen mediante el método VideoFrame::getCaptionTracks.

Añadir subtítulos a un marco de vídeo

  1. Cree una instancia de la clase Presentation.
  2. Añada un vídeo a la presentación.
  3. Añada un objeto VideoFrame a una diapositiva.
  4. Utilice la colección CaptionsCollection devuelta por getCaptionTracks para añadir una pista de subtítulos WebVTT.
  5. Guarde la presentación modificada.
$presentation = new Presentation();
try {
    $videoData = file_get_contents("video.mp4");
    $video = $presentation->getVideos()->addVideo($videoData);

    $slide = $presentation->getSlides()->get_Item(0);
    $videoFrame = $slide->getShapes()->addVideoFrame(0, 0, 100, 100, $video);

    // Añade una nueva pista de subtítulos desde un archivo WebVTT.
    $videoFrame->getCaptionTracks()->add("English", "track.vtt");

    $presentation->save("video_with_captions.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

La clase CaptionsCollection también ofrece una sobrecarga que le permite añadir subtítulos desde un flujo.

Extraer subtítulos de un marco de vídeo

  1. Cargue la presentación que contiene el vídeo.
  2. Encuentre el objeto VideoFrame objetivo.
  3. Itere a través de la colección getCaptionTracks.
  4. Guarde cada pista de subtítulos en un archivo .vtt.
$presentation = new Presentation("video_with_captions.pptx");
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $shapeCount = java_values($slide->getShapes()->size());
    for ($shapeIndex = 0; $shapeIndex < $shapeCount; $shapeIndex++) {
        $shape = $slide->getShapes()->get_Item($shapeIndex);
        if (java_instanceof($shape, new JavaClass("com.aspose.slides.VideoFrame"))) {
            $videoFrame = $shape;
            $trackCount = java_values($videoFrame->getCaptionTracks()->getCount());
            for ($trackIndex = 0; $trackIndex < $trackCount; $trackIndex++) {
                $captionTrack = $videoFrame->getCaptionTracks()->get_Item($trackIndex);
                // Guarda la pista de subtítulos en un archivo WebVTT.
                $filePath = $captionTrack->getCaptionId() . ".vtt";
                file_put_contents($filePath, $captionTrack->getBinaryData());
            }
        }
    }
} finally {
    $presentation->dispose();
}

Cada objeto Captions 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 vídeo

  1. Cargue la presentación que contiene el vídeo.
  2. Obtenga el objeto VideoFrame objetivo.
  3. Elimine las pistas de subtítulos de la colección getCaptionTracks.
  4. Guarde la presentación modificada.
$presentation = new Presentation("video_with_captions.pptx");
try {
    $slide = $presentation->getSlides()->get_Item(0);
    $videoFrame = $slide->getShapes()->get_Item(0); // tipo: VideoFrame

    // Elimina todos los subtítulos del marco de vídeo.
    $videoFrame->getCaptionTracks()->clear();

    $presentation->save("video_without_captions.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

Si necesita eliminar solo una pista de subtítulos, utilice los métodos remove o removeAt en lugar de clear.

Extraer vídeo de diapositivas

Además de añadir vídeos a diapositivas, Aspose.Slides le permite extraer los vídeos incrustados en presentaciones.

  1. Cree una instancia de la clase Presentation para cargar la presentación que contiene el vídeo.
  2. Itere a través de todos los objetos Slide.
  3. Itere a través de todos los objetos Shape para encontrar un VideoFrame.
  4. Guarde el vídeo en disco.
  # Instancia un objeto Presentation que representa un archivo de presentación
  $pres = new Presentation("VideoSample.pptx");
  try {
    foreach($pres->getSlides() as $slide) {
      foreach($slide->getShapes() as $shape) {
        if (java_instanceof($shape, new JavaClass("com.aspose.slides.VideoFrame"))) {
          $vf = $shape;
          $type = $vf->getEmbeddedVideo()->getContentType();
          $ss = $type->lastIndexOf('-');
          $buffer = $vf->getEmbeddedVideo()->getBinaryData();
          # Obtiene la extensión del archivo
          $charIndex = $type->indexOf("/");
          $type = $type->substring($charIndex + 1);
          $fop = new Java("java.io.FileOutputStream", "testing2." . $type);
          $fop->write($buffer);
          $fop->flush();
          $fop->close();
        }
      }
    }
  } catch (JavaException $e) {
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

Preguntas frecuentes

¿Qué parámetros de reproducción de vídeo se pueden cambiar en un VideoFrame?

Puede controlar el playback mode (automático o al hacer clic) y el looping. Estas opciones están disponibles a través de las propiedades del objeto VideoFrame.

¿Afecta la incorporación de un vídeo al tamaño del archivo PPTX?

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

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

Sí. Puede intercambiar el video content dentro del marco manteniendo la geometría de la forma; este es un escenario habitual para actualizar medios en un diseño existente.

¿Se puede determinar el tipo de contenido (MIME) de un vídeo incrustado?

Sí. Un vídeo incrustado tiene un content type que puede leer y utilizar, por ejemplo al guardarlo en disco.