Gestionar fotogramas de video en presentaciones usando Python
Introducción
Un video bien colocado en una presentación puede hacer que tu mensaje sea más convincente y aumentar el nivel de compromiso con tu audiencia.
PowerPoint permite añadir vídeos a una diapositiva en una presentación de dos maneras:
- Añadir o incrustar un video local (almacenado en tu equipo)
- Añadir un video en línea (de una fuente web como YouTube).
Para permitirte añadir vídeos (objetos de video) a una presentación, Aspose.Slides proporciona la clase Video, la clase VideoFrame y otros tipos relevantes.
Crear fotogramas de video incrustados
Si el archivo de video que deseas añadir a tu diapositiva está almacenado localmente, puedes crear un fotograma de video para incrustar el video en tu presentación.
- Crea una instancia de la clase Presentation.
- Obtén una referencia a una diapositiva por su índice.
- Añade un objeto Video y pasa los datos del archivo de video para incrustar el video en la presentación.
- Añade un objeto VideoFrame para crear un fotograma para el video.
- Guarda la presentación modificada.
Este código Python muestra cómo añadir un video almacenado localmente a una presentación:
from pathlib import Path
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat
presentation = Presentation("pres.pptx")
try:
video_data = Path("Wildlife.mp4").read_bytes()
java_video_data = jpype.JArray(jpype.JByte)(video_data)
video = presentation.getVideos().addVideo(java_video_data)
presentation.getSlides().get_Item(0).getShapes().addVideoFrame(10, 10, 150, 250, video)
presentation.save("pres-with-video.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Alternativamente, puedes añadir un video pasando su ruta de archivo directamente al método addVideoFrame:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation
presentation = Presentation()
try:
slide = presentation.getSlides().get_Item(0)
video_frame = slide.getShapes().addVideoFrame(50, 150, 300, 150, "video1.avi")
finally:
presentation.dispose()
Crear fotogramas de video con video de fuentes web
Microsoft PowerPoint 2013 y versiones posteriores admite videos de YouTube en presentaciones. Si el video que deseas usar está disponible en línea (por ejemplo, en YouTube), puedes añadirlo a tu presentación mediante su enlace web.
- Crea una instancia de la clase Presentation.
- Obtén una referencia a una diapositiva por su índice.
- Añade un objeto VideoFrame y pasa el enlace al video.
- Establece una miniatura para el fotograma de video.
- Guarda la presentación.
Este código Python muestra cómo añadir un video desde la web a una diapositiva en una presentación de PowerPoint:
from urllib.request import urlopen
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat, VideoPlayModePreset
video_id = "Tj75Arhq5ho"
presentation = Presentation()
try:
video_frame = presentation.getSlides().get_Item(0).getShapes().addVideoFrame(10, 10, 427, 240, "https://www.youtube.com/embed/" + video_id)
video_frame.setPlayMode(VideoPlayModePreset.Auto)
# Cargar la miniatura.
thumbnail_uri = "https://img.youtube.com/vi/" + video_id + "/hqdefault.jpg"
try:
with urlopen(thumbnail_uri) as response:
thumbnail_data = response.read()
java_thumbnail_data = jpype.JArray(jpype.JByte)(thumbnail_data)
thumbnail = presentation.getImages().addImage(java_thumbnail_data)
video_frame.getPictureFormat().getPicture().setImage(thumbnail)
except OSError as error:
print("Could not load the thumbnail:", error)
presentation.save("out.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Recortar un fotograma de video
Aspose.Slides permite controlar qué parte de un video 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 omite al principio y al final del video, respectivamente. Estos ajustes modifican la configuración de reproducción del video en la presentación; no recortan ni modifican los datos binarios del video incrustado.
Establecer ajustes de recorte
Para crear un fotograma de video y establecer sus ajustes de recorte:
- Crea una instancia de la clase Presentation.
- Añade un objeto Video a la presentación.
- Añade un objeto VideoFrame a una diapositiva.
- Establece los valores trim-from-start y trim-from-end mediante VideoFrame.setTrimFromStart y VideoFrame.setTrimFromEnd.
- Guarda 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:
from pathlib import Path
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat
presentation = Presentation()
try:
video_data = Path("video.mp4").read_bytes()
java_video_data = jpype.JArray(jpype.JByte)(video_data)
video = presentation.getVideos().addVideo(java_video_data)
slide = presentation.getSlides().get_Item(0)
video_frame = slide.getShapes().addVideoFrame(50, 50, 640, 360, video)
video_frame.setTrimFromStart(2500.0)
video_frame.setTrimFromEnd(1000.0)
presentation.save("video_with_trim.pptx", SaveFormat.Pptx)
finally:
presentation.dispose()
Leer ajustes de recorte
Para inspeccionar los ajustes de recorte existentes, carga una presentación, encuentra un objeto VideoFrame entre las formas de la primera diapositiva y lee los valores mediante VideoFrame.getTrimFromStart y VideoFrame.getTrimFromEnd.
El siguiente ejemplo de código encuentra el primer fotograma de video en la primera diapositiva y muestra sus ajustes de recorte en milisegundos:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, VideoFrame
presentation = Presentation("video_with_trim.pptx")
try:
slide = presentation.getSlides().get_Item(0)
for shape in slide.getShapes():
if isinstance(shape, VideoFrame):
trim_from_start = shape.getTrimFromStart()
trim_from_end = shape.getTrimFromEnd()
print(f"Trim from start: {trim_from_start} ms")
print(f"Trim from end: {trim_from_end} ms")
break
finally:
presentation.dispose()
Gestionar subtítulos de video
Aspose.Slides permite gestionar subtítulos cerrados para los fotogramas de video 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 fotograma de video
Para añadir subtítulos a un fotograma de video:
- Crea una instancia de la clase Presentation.
- Añade un video a la presentación.
- Añade un objeto VideoFrame a una diapositiva.
- Utiliza la CaptionsCollection devuelta por getCaptionTracks para añadir una pista de subtítulos WebVTT.
- Guarda la presentación modificada.
El siguiente código muestra cómo añadir subtítulos a un fotograma de video:
from pathlib import Path
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat
presentation = Presentation()
try:
video_data = Path("video.mp4").read_bytes()
java_video_data = jpype.JArray(jpype.JByte)(video_data)
video = presentation.getVideos().addVideo(java_video_data)
slide = presentation.getSlides().get_Item(0)
video_frame = slide.getShapes().addVideoFrame(0, 0, 100, 100, video)
# Añadir una nueva pista de subtítulos desde un archivo WebVTT.
video_frame.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 permite añadir subtítulos desde un flujo.
Extraer subtítulos de un fotograma de video
Para extraer subtítulos de un fotograma de video:
- Carga la presentación que contiene el video.
- Encuentra el objeto VideoFrame objetivo.
- Itera a través de las pistas de subtítulos en la CaptionsCollection.
- Guarda cada pista de subtítulos en un archivo
.vtt.
El siguiente código muestra cómo extraer subtítulos de un fotograma de video:
from pathlib import Path
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, VideoFrame
presentation = Presentation("video_with_captions.pptx")
try:
slide = presentation.getSlides().get_Item(0)
for shape in slide.getShapes():
if isinstance(shape, VideoFrame):
for caption_track in shape.getCaptionTracks():
# Guardar la pista de subtítulos en un archivo WebVTT.
file_path = Path(str(caption_track.getCaptionId()) + ".vtt")
caption_data = bytes(caption_track.getBinaryData())
file_path.write_bytes(caption_data)
finally:
presentation.dispose()
Cada objeto Captions expone el identificador de subtítulo, la etiqueta, los datos binarios y el texto del subtítulo como una cadena UTF-8.
Eliminar subtítulos de un fotograma de video
Para eliminar subtítulos de un fotograma de video:
- Carga la presentación que contiene el video.
- Obtén el objeto VideoFrame objetivo.
- Elimina las pistas de subtítulos de la CaptionsCollection.
- Guarda la presentación modificada.
El siguiente código muestra cómo eliminar todos los subtítulos de un fotograma de video:
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, SaveFormat, VideoFrame
presentation = Presentation("video_with_captions.pptx")
try:
slide = presentation.getSlides().get_Item(0)
video_frame = slide.getShapes().get_Item(0)
if isinstance(video_frame, VideoFrame):
# Eliminar todos los subtítulos del fotograma de video.
video_frame.getCaptionTracks().clear()
presentation.save("video_without_captions.pptx", SaveFormat.Pptx)
else:
print("The shape is not a video frame.")
finally:
presentation.dispose()
Si necesitas eliminar solo una pista de subtítulos, usa los métodos remove o removeAt en lugar de clear.
Extraer video de diapositivas
Además de añadir videos a diapositivas, Aspose.Slides permite extraer los videos incrustados en presentaciones.
- Crea una instancia de la clase Presentation para cargar la presentación que contiene el video.
- Itera a través de todos los objetos Slide.
- Itera a través de todos los objetos Shape para encontrar un VideoFrame.
- Guarda el video en disco.
Este código Python muestra cómo extraer el video de una diapositiva de presentación:
from pathlib import Path
import jpype
import asposeslides
if not jpype.isJVMStarted():
jpype.startJVM()
from asposeslides.api import Presentation, VideoFrame
presentation = Presentation("VideoSample.pptx")
try:
for slide in presentation.getSlides():
for shape in slide.getShapes():
if isinstance(shape, VideoFrame):
video = shape.getEmbeddedVideo()
if video is not None:
content_type = str(video.getContentType())
file_extension = content_type.split("/", 1)[-1]
video_data = bytes(video.getBinaryData())
Path("testing2." + file_extension).write_bytes(video_data)
else:
print("The video frame has no embedded video.")
finally:
presentation.dispose()
Preguntas frecuentes
¿Qué parámetros de reproducción de video pueden modificarse 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 en proporción 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 de video dentro del fotograma manteniendo la geometría de la forma; es un escenario habitual 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 utilizar, por ejemplo al guardarlo en disco.