Gestionar marcos de vídeo en presentaciones en Android
Introducción
Un vídeo bien colocado en una presentación puede hacer que su mensaje sea más convincente y aumentar los niveles de compromiso con su audiencia.
PowerPoint le permite añadir videos 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 videos (objetos de vídeo) a una presentación, Aspose.Slides proporciona la interfaz IVideo , la interfaz IVideoFrame y otros tipos relevantes.
Crear un marco de vídeo incrustado
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.
- Cree una instancia de la clase Presentation.
- Obtenga una referencia a la diapositiva mediante su índice.
- Añada un objeto IVideo y pase la ruta del archivo de vídeo para incrustar el vídeo en la presentación.
- Añada un objeto IVideoFrame para crear un marco para el vídeo.
- Guarde la presentación modificada.
Este código Java le muestra cómo añadir un vídeo almacenado localmente a una presentación:
// Instancia la clase Presentation
Presentation pres = new Presentation("pres.pptx");
try {
// Carga el vídeo
FileInputStream fileStream = new FileInputStream("Wildlife.mp4");
IVideo video = pres.getVideos().addVideo(fileStream, LoadingStreamBehavior.KeepLocked);
// Obtiene la primera diapositiva y añade un videoframe
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 (IOException e) {
} finally {
if (pres != null) 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, IVideo video) :
Presentation pres = new Presentation();
try {
ISlide sld = pres.getSlides().get_Item(0);
IVideoFrame vf = sld.getShapes().addVideoFrame(50, 150, 300, 150, "video1.avi");
} finally {
if (pres != null) pres.dispose();
}
Crear un marco de vídeo con vídeo de una fuente web
Las versiones más recientes de Microsoft PowerPoint admiten vídeos en línea en las 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.
- Cree una instancia de la clase Presentation
- Obtenga una referencia a la diapositiva mediante su índice.
- Añada un objeto IVideo y pase el enlace al vídeo.
- Establezca una miniatura para el marco de vídeo.
- Guarde la presentación.
Este código Java le muestra cómo añadir un vídeo desde la web a una diapositiva en una presentación de PowerPoint:
// Instancia un objeto Presentation que representa un archivo de presentación
Presentation pres = new Presentation();
try {
addVideoFromYouTube(pres, "Tj75Arhq5ho");
pres.save("out.pptx", SaveFormat.Pptx);
} finally {
if (pres != null) pres.dispose();
}
private static void addVideoFromYouTube(Presentation pres, String videoID)
{
// Añade un marco de vídeo
IVideoFrame videoFrame = pres.getSlides().get_Item(0).getShapes().addVideoFrame(
10, 10, 427, 240, "https://www.youtube.com/embed/" + videoID);
videoFrame.setPlayMode(VideoPlayModePreset.Auto);
// Carga la miniatura
String thumbnailUri = "http://img.youtube.com/vi/" + videoID + "/hqdefault.jpg";
URL url;
try {
url = new URL(thumbnailUri);
videoFrame.getPictureFormat().getPicture().setImage(pres.getImages().addImage(url.openStream()));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
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 IVideoFrame.setTrimFromStart y IVideoFrame.setTrimFromEnd. Ambos valores se especifican en milisegundos y definen cuánto tiempo se omite al inicio y al final del vídeo, respectivamente. Estas configuraciones cambian la reproducción del vídeo en la presentación; no recortan ni modifican los datos binarios del vídeo incrustado.
Establecer la configuración de recorte
Para crear un marco de vídeo y establecer sus configuraciones de recorte:
- Cree una instancia de la clase Presentation.
- Añada un objeto IVideo a la presentación.
- Añada un objeto IVideoFrame a una diapositiva.
- Establezca los valores trim-from-start y trim-from-end mediante IVideoFrame.setTrimFromStart y IVideoFrame.setTrimFromEnd.
- Guarde la presentación modificada.
El siguiente ejemplo de código omite los primeros 2,5 segundos y el último segundo de un vídeo incrustado durante la reproducción:
Presentation presentation = new Presentation();
try {
FileInputStream videoStream = new FileInputStream("video.mp4");
try {
IVideo video = presentation.getVideos().addVideo(
videoStream, LoadingStreamBehavior.ReadStreamAndRelease);
ISlide slide = presentation.getSlides().get_Item(0);
IVideoFrame videoFrame = slide.getShapes().addVideoFrame(50, 50, 640, 360, video);
videoFrame.setTrimFromStart(2500f);
videoFrame.setTrimFromEnd(1000f);
presentation.save("video_with_trim.pptx", SaveFormat.Pptx);
} finally {
videoStream.close();
}
} finally {
presentation.dispose();
}
Leer la configuración de recorte
Para inspeccionar las configuraciones de recorte existentes, cargue una presentación, busque un objeto IVideoFrame entre las formas de la primera diapositiva y lea los valores mediante IVideoFrame.getTrimFromStart y IVideoFrame.getTrimFromEnd.
El siguiente ejemplo de código encuentra el primer marco de vídeo en la primera diapositiva y muestra sus configuraciones de recorte en milisegundos:
Presentation presentation = new Presentation("video_with_trim.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
for (IShape shape : slide.getShapes()) {
if (shape instanceof IVideoFrame) {
IVideoFrame videoFrame = (IVideoFrame) shape;
float trimFromStart = videoFrame.getTrimFromStart();
float trimFromEnd = videoFrame.getTrimFromEnd();
System.out.println("Trim from start: " + trimFromStart + " ms");
System.out.println("Trim from end: " + trimFromEnd + " ms");
break;
}
}
} finally {
presentation.dispose();
}
Gestionar subtítulos de vídeo
Aspose.Slides le permite gestionar 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 IVideoFrame.getCaptionTracks.
Añadir subtítulos a un marco de vídeo
Para añadir subtítulos a un marco de vídeo:
- Cree una instancia de la clase Presentation.
- Añada un vídeo a la presentación.
- Añada un objeto IVideoFrame a una diapositiva.
- Utilice la ICaptionsCollection devuelta por getCaptionTracks para añadir una pista de subtítulos WebVTT.
- Guarde la presentación modificada.
Presentation presentation = new Presentation();
try {
byte[] videoData = // "video.mp4";
IVideo video = presentation.getVideos().addVideo(videoData);
ISlide slide = presentation.getSlides().get_Item(0);
IVideoFrame 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 interfaz ICaptionsCollection también proporciona una sobrecarga que le permite añadir subtítulos desde un flujo.
Extraer subtítulos de un marco de vídeo
Para extraer subtítulos de un marco de vídeo:
- Cargue la presentación que contiene el vídeo.
- Encuentre el objeto IVideoFrame objetivo.
- Itere a través de las pistas de subtítulos devueltas por getCaptionTracks.
- Guarde cada pista de subtítulos en un archivo
.vtt.
Presentation presentation = new Presentation("video_with_captions.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
for (IShape shape : slide.getShapes()) {
if (shape instanceof IVideoFrame) {
IVideoFrame videoFrame = (IVideoFrame) shape;
for (ICaptions captionTrack : videoFrame.getCaptionTracks()) {
// Guarda la pista de subtítulos en un archivo WebVTT.
FileOutputStream outputStream = new FileOutputStream(captionTrack.getCaptionId() + ".vtt");
outputStream.write(captionTrack.getBinaryData());
outputStream.close();
}
}
}
} finally {
presentation.dispose();
}
Cada objeto ICaptions expone el identificador del subtítulo, la etiqueta, los datos binarios y los datos del subtítulo como una cadena UTF-8.
Eliminar subtítulos de un marco de vídeo
Para eliminar subtítulos de un marco de vídeo:
- Cargue la presentación que contiene el vídeo.
- Obtenga el objeto IVideoFrame objetivo.
- Elimine las pistas de subtítulos de la colección devuelta por getCaptionTracks.
- Guarde la presentación modificada.
Presentation presentation = new Presentation("video_with_captions.pptx");
try {
ISlide slide = presentation.getSlides().get_Item(0);
IVideoFrame videoFrame = (IVideoFrame) slide.getShapes().get_Item(0);
// 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 video de una diapositiva
Además de añadir videos a las diapositivas, Aspose.Slides le permite extraer los videos incrustados en presentaciones.
- Cree una instancia de la clase Presentation para cargar la presentación que contiene el video.
- Itere a través de todos los objetos ISlide.
- Itere a través de todos los objetos IShape para encontrar un VideoFrame.
- Guarde el video en disco.
// Instancia un objeto Presentation que representa un archivo de presentación
Presentation pres = new Presentation("VideoSample.pptx");
try {
for (ISlide slide : pres.getSlides())
{
for (IShape shape : slide.getShapes())
{
if (shape instanceof VideoFrame)
{
IVideoFrame vf = (IVideoFrame) shape;
String type = vf.getEmbeddedVideo().getContentType();
int ss = type.lastIndexOf('-');
byte[] buffer = vf.getEmbeddedVideo().getBinaryData();
// Obtiene la extensión del archivo
int charIndex = type.indexOf("/");
type = type.substring(charIndex + 1);
FileOutputStream fop = new FileOutputStream("testing2." + type);
fop.write(buffer);
fop.flush();
fop.close();
}
}
}
} catch (IOException e) {
} finally {
if (pres != null) pres.dispose();
}
Preguntas frecuentes
¿Qué parámetros de reproducción de video pueden modificarse para un VideoFrame?
Puede controlar el modo de reproducción (automático o al hacer clic) y el bucle de reproducción. Estas opciones están disponibles a través de las propiedades del objeto VideoFrame.
¿Afecta la incorporación de un video al tamaño del archivo PPTX?
Sí. Cuando incrusta un video local, los datos binarios se incluyen en el documento, de modo que el tamaño de la presentación crece en proporción al tamaño del archivo. Cuando añade 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í. Puede intercambiar el contenido del video dentro del marco conservando 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 puede leer y utilizar, por ejemplo, al guardarlo en disco.