Converter apresentações PowerPoint para vídeo em JavaScript

Introdução

Ao converter sua apresentação PowerPoint em vídeo, você obtém

  • Aumento da acessibilidade: Todos os dispositivos (independentemente da plataforma) vêm equipados com reprodutores de vídeo por padrão, ao contrário dos aplicativos de abertura de apresentações, portanto os usuários acham mais fácil abrir ou reproduzir vídeos.
  • Maior alcance: Por meio de vídeos, você pode alcançar um grande público e direcioná‑lo com informações que, de outra forma, pareceriam tediosas em uma apresentação. A maioria das pesquisas e estatísticas indica que as pessoas assistem e consomem vídeos mais do que outros tipos de conteúdo, e geralmente preferem esse tipo de conteúdo.

Conversão de PowerPoint para Vídeo no Aspose.Slides

Aspose.Slides oferece suporte à conversão de apresentações em vídeo.

  • Use Aspose.Slides para gerar um conjunto de quadros (a partir dos slides da apresentação) que correspondam a uma certa taxa de FPS (quadros por segundo)
  • Use uma ferramenta de terceiros como ffmpeg (para java) para criar um vídeo com base nos quadros.

Converter PowerPoint para Vídeo

  1. Baixe o ffmpeg aqui.

  2. Execute o código JavaScript de PowerPoint para vídeo.

Este código JavaScript mostra como converter uma apresentação (contendo uma figura e dois efeitos de animação) em um vídeo:

var presentation = new aspose.slides.Presentation();
try {
    // Adiciona uma forma de sorriso e então a anima
    var smile = presentation.getSlides().get_Item(0).getShapes().addAutoShape(aspose.slides.ShapeType.SmileyFace, 110, 20, 500, 500);
    var mainSequence = presentation.getSlides().get_Item(0).getTimeline().getMainSequence();
    var effectIn = mainSequence.addEffect(smile, aspose.slides.EffectType.Fly, aspose.slides.EffectSubtype.TopLeft, aspose.slides.EffectTriggerType.AfterPrevious);
    var effectOut = mainSequence.addEffect(smile, aspose.slides.EffectType.Fly, aspose.slides.EffectSubtype.BottomRight, aspose.slides.EffectTriggerType.AfterPrevious);
    effectIn.getTiming().setDuration(2.0);
    effectOut.setPresetClassType(aspose.slides.EffectPresetClassType.Exit);
    final var fps = 33;
    var frames = java.newInstanceSync("java.util.ArrayList");
    var animationsGenerator = new aspose.slides.PresentationAnimationsGenerator(presentation);
    try {
        var player = new aspose.slides.PresentationPlayer(animationsGenerator, fps);
        try {
            player.setFrameTick((sender, arguments) -> {
                try {
                    var frame = java.callStaticMethodSync("java.lang.String", "format", "frame_%04d.png", sender.getFrameIndex());
                    arguments.getFrame().save(frame, aspose.slides.ImageFormat.Png);
                    frames.add(frame);
                } catch (e) {console.log(e);
                    throw java.newInstanceSync("java.lang.RuntimeException", e);
                }
            });
            animationsGenerator.run(presentation.getSlides());
        } finally {
            if (player != null) {
                player.dispose();
            }
        }
    } finally {
        if (animationsGenerator != null) {
            animationsGenerator.dispose();
        }
    }
    // Configura a pasta de binários do ffmpeg. Veja esta página: https://github.com/rosenbjerg/FFMpegCore#installation
    var ffmpeg = java.newInstanceSync("FFmpeg", "path/to/ffmpeg");
    var ffprobe = java.newInstanceSync("FFprobe", "path/to/ffprobe");
    var builder = java.newInstanceSync("FFmpegBuilder").addExtraArgs("-start_number", "1").setInput("frame_%04d.png").addOutput("output.avi").setVideoFrameRate(java.getStaticFieldValue("FFmpeg", "FPS_24")).setFormat("avi").done();
    var executor = java.newInstanceSync("FFmpegExecutor", ffmpeg, ffprobe);
    executor.createJob(builder).run();
} catch (e) {console.log(e);
    console.log(e);
}

Efeitos de Vídeo

Você pode aplicar animações a objetos nos slides e usar transições entre os slides.

Animações e transições tornam apresentações de slides mais envolventes e interessantes—e fazem o mesmo por vídeos. Vamos adicionar outro slide e transição ao código da apresentação anterior:

// Adiciona uma forma de sorriso e a anima
// ...
// Adiciona um novo slide e transição animada
var newSlide = presentation.getSlides().addEmptySlide(presentation.getSlides().get_Item(0).getLayoutSlide());
newSlide.getBackground().setType(aspose.slides.BackgroundType.OwnBackground);
newSlide.getBackground().getFillFormat().setFillType(java.newByte(aspose.slides.FillType.Solid));
newSlide.getBackground().getFillFormat().getSolidFillColor().setColor(java.getStaticFieldValue("java.awt.Color", "MAGENTA"));
newSlide.getSlideShowTransition().setType(aspose.slides.TransitionType.Push);

Aspose.Slides também oferece suporte à animação de textos. Assim, animamos parágrafos em objetos, que aparecerão um após o outro (com o atraso definido para um segundo):

var presentation = new aspose.slides.Presentation();
try {
    // Adiciona texto e animações
    var autoShape = presentation.getSlides().get_Item(0).getShapes().addAutoShape(aspose.slides.ShapeType.Rectangle, 210, 120, 300, 300);
    var para1 = new aspose.slides.Paragraph();
    para1.getPortions().add(new aspose.slides.Portion("Aspose Slides for Node.js via Java"));
    var para2 = new aspose.slides.Paragraph();
    para2.getPortions().add(new aspose.slides.Portion("convert PowerPoint Presentation with text to video"));
    var para3 = new aspose.slides.Paragraph();
    para3.getPortions().add(new aspose.slides.Portion("paragraph by paragraph"));
    var paragraphCollection = autoShape.getTextFrame().getParagraphs();
    paragraphCollection.add(para1);
    paragraphCollection.add(para2);
    paragraphCollection.add(para3);
    paragraphCollection.add(new aspose.slides.Paragraph());
    var mainSequence = presentation.getSlides().get_Item(0).getTimeline().getMainSequence();
    var effect1 = mainSequence.addEffect(para1, aspose.slides.EffectType.Appear, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.AfterPrevious);
    var effect2 = mainSequence.addEffect(para2, aspose.slides.EffectType.Appear, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.AfterPrevious);
    var effect3 = mainSequence.addEffect(para3, aspose.slides.EffectType.Appear, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.AfterPrevious);
    var effect4 = mainSequence.addEffect(para3, aspose.slides.EffectType.Appear, aspose.slides.EffectSubtype.None, aspose.slides.EffectTriggerType.AfterPrevious);
    effect1.getTiming().setTriggerDelayTime(1.0);
    effect2.getTiming().setTriggerDelayTime(1.0);
    effect3.getTiming().setTriggerDelayTime(1.0);
    effect4.getTiming().setTriggerDelayTime(1.0);
    final var fps = 33;
    var frames = java.newInstanceSync("java.util.ArrayList");
    var animationsGenerator = new aspose.slides.PresentationAnimationsGenerator(presentation);
    try {
        var player = new aspose.slides.PresentationPlayer(animationsGenerator, fps);
        try {
            player.setFrameTick((sender, arguments) -> {
                try {
                    var frame = java.callStaticMethodSync("java.lang.String", "format", "frame_%04d.png", sender.getFrameIndex());
                    arguments.getFrame().save(frame, aspose.slides.ImageFormat.Png);
                    frames.add(frame);
                } catch (e) {console.log(e);
                    throw java.newInstanceSync("java.lang.RuntimeException", e);
                }
            });
            animationsGenerator.run(presentation.getSlides());
        } finally {
            if (player != null) {
                player.dispose();
            }
        }
    } finally {
        if (animationsGenerator != null) {
            animationsGenerator.dispose();
        }
    }
    // Configura a pasta de binários do ffmpeg. Veja esta página: https://github.com/rosenbjerg/FFMpegCore#installation
    var ffmpeg = java.newInstanceSync("FFmpeg", "path/to/ffmpeg");
    var ffprobe = java.newInstanceSync("FFprobe", "path/to/ffprobe");
    var builder = java.newInstanceSync("FFmpegBuilder").addExtraArgs("-start_number", "1").setInput("frame_%04d.png").addOutput("output.avi").setVideoFrameRate(java.getStaticFieldValue("FFmpeg", "FPS_24")).setFormat("avi").done();
    var executor = java.newInstanceSync("FFmpegExecutor", ffmpeg, ffprobe);
    executor.createJob(builder).run();
} catch (e) {console.log(e);
    console.log(e);
}

Classes de Conversão de Vídeo

Para permitir que você execute tarefas de conversão de PowerPoint para vídeo, Aspose.Slides fornece as classes PresentationAnimationsGenerator e PresentationPlayer.

PresentationAnimationsGenerator permite definir o tamanho do quadro para o vídeo (que será criado posteriormente) por meio de seu construtor. Se você passar uma instância da apresentação, Presentation.getSlideSize será usado e ele gera animações que PresentationPlayer utiliza.

Quando as animações são geradas, um evento NewAnimation é disparado para cada animação subsequente, que possui o parâmetro de player de animação da apresentação. Este último é uma classe que representa um player para uma animação separada.

Para trabalhar com o player de animação da apresentação, são usados os métodos getDuration (a duração total da animação) e setTimePosition. Cada posição de animação é definida dentro do intervalo 0 a duração, e então o método getFrame retornará um BufferedImage que corresponde ao estado da animação naquele momento:

var presentation = new aspose.slides.Presentation();
try {
    // Adiciona uma forma de sorriso e a anima
    var smile = presentation.getSlides().get_Item(0).getShapes().addAutoShape(aspose.slides.ShapeType.SmileyFace, 110, 20, 500, 500);
    var mainSequence = presentation.getSlides().get_Item(0).getTimeline().getMainSequence();
    var effectIn = mainSequence.addEffect(smile, aspose.slides.EffectType.Fly, aspose.slides.EffectSubtype.TopLeft, aspose.slides.EffectTriggerType.AfterPrevious);
    var effectOut = mainSequence.addEffect(smile, aspose.slides.EffectType.Fly, aspose.slides.EffectSubtype.BottomRight, aspose.slides.EffectTriggerType.AfterPrevious);
    effectIn.getTiming().setDuration(2.0);
    effectOut.setPresetClassType(aspose.slides.EffectPresetClassType.Exit);
    var animationsGenerator = new aspose.slides.PresentationAnimationsGenerator(presentation);
    try {
        animationsGenerator.setNewAnimation(animationPlayer -> {
            console.log(java.callStaticMethodSync("java.lang.String", "format", "Animation total duration: %f", animationPlayer.getDuration()));
            animationPlayer.setTimePosition(0);// estado inicial da animação
            try {
                // bitmap do estado inicial da animação
                animationPlayer.getFrame().save("firstFrame.png", aspose.slides.ImageFormat.Png);
            } catch (e) {console.log(e);
                throw java.newInstanceSync("java.lang.RuntimeException", e);
            }
            animationPlayer.setTimePosition(animationPlayer.getDuration());// estado final da animação
            try {
                // último quadro da animação
                animationPlayer.getFrame().save("lastFrame.png", aspose.slides.ImageFormat.Png);
            } catch (e) {console.log(e);
                throw java.newInstanceSync("java.lang.RuntimeException", e);
            }
        });
    } finally {
        if (animationsGenerator != null) {
            animationsGenerator.dispose();
        }
    }
} finally {
    if (presentation != null) {
        presentation.dispose();
    }
}

Para fazer com que todas as animações de uma apresentação sejam reproduzidas simultaneamente, usa‑se a classe PresentationPlayer. Essa classe recebe uma instância de PresentationAnimationsGenerator e FPS para os efeitos em seu construtor e, em seguida, chama o evento FrameTick para todas as animações a fim de reproduzi‑las:

var presentation = new aspose.slides.Presentation("animated.pptx");
try {
    var animationsGenerator = new aspose.slides.PresentationAnimationsGenerator(presentation);
    try {
        var player = new aspose.slides.PresentationPlayer(animationsGenerator, 33);
        try {
            player.setFrameTick((sender, arguments) -> {
                try {
                    arguments.getFrame().save(("frame_" + sender.getFrameIndex()) + ".png", aspose.slides.ImageFormat.Png);
                } catch (e) {console.log(e);
                    throw java.newInstanceSync("java.lang.RuntimeException", e);
                }
            });
            animationsGenerator.run(presentation.getSlides());
        } finally {
            if (player != null) {
                player.dispose();
            }
        }
    } finally {
        if (animationsGenerator != null) {
            animationsGenerator.dispose();
        }
    }
} finally {
    if (presentation != null) {
        presentation.dispose();
    }
}

Em seguida, os quadros gerados podem ser compilados para produzir um vídeo. Consulte a seção Converter PowerPoint para Vídeo.

Animações e Efeitos Compatíveis

Entrada:

Tipo de Animação Aspose.Slides PowerPoint
Aparecer not supported supported
Desvanecer supported supported
Entrar Voando supported supported
Flutuar Para Dentro supported supported
Dividir supported supported
Limpar supported supported
Forma supported supported
Roda supported supported
Barras Aleatórias supported supported
Crescer e Girar not supported supported
Zoom supported supported
Girar supported supported
Quicar supported supported

Ênfase:

Tipo de Animação Aspose.Slides PowerPoint
Pulsar not supported supported
Pulsar de Cor not supported supported
Oscilar supported supported
Girar supported supported
Crescer/Encolher not supported supported
Dessaturar not supported supported
Escurecer not supported supported
Clarear not supported supported
Transparência not supported supported
Cor do Objeto not supported supported
Cor Complementar not supported supported
Cor da Linha not supported supported
Cor de Preenchimento not supported supported

Saída:

Tipo de Animação Aspose.Slides PowerPoint
Desaparecer not supported supported
Desvanecer supported supported
Voar para Fora supported supported
Flutuar para Fora supported supported
Dividir supported supported
Limpar supported supported
Forma supported supported
Barras Aleatórias supported supported
Encolher e Girar not supported supported
Zoom supported supported
Girar supported supported
Quicar supported supported

Caminhos de Movimento:

Tipo de Animação Aspose.Slides PowerPoint
Linhas supported supported
Arcos supported supported
Curvas supported supported
Formas supported supported
Laços supported supported
Caminho Personalizado supported supported

Perguntas Frequentes

É possível converter apresentações protegidas por senha?

Sim, o Aspose.Slides permite trabalhar com apresentações protegidas por senha. Ao processar esses arquivos, você precisa fornecer a senha correta para que a biblioteca possa acessar o conteúdo da apresentação.

O Aspose.Slides oferece suporte ao uso em soluções de nuvem?

Sim, o Aspose.Slides pode ser integrado a aplicativos e serviços em nuvem. A biblioteca foi projetada para operar em ambientes de servidor, garantindo alto desempenho e escalabilidade para o processamento em lote de arquivos.

Existem limitações de tamanho para apresentações durante a conversão?

O Aspose.Slides é capaz de lidar com apresentações de praticamente qualquer tamanho. Contudo, ao trabalhar com arquivos muito grandes, podem ser necessários recursos de sistema adicionais, e às vezes recomenda‑se otimizar a apresentação para melhorar o desempenho.