Converter apresentações PowerPoint para vídeo no Android

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, facilitando aos usuários abrir ou reproduzir vídeos.
  • Maior alcance: Com vídeos, você pode alcançar um grande público e direcioná‑lo com informações que de outra forma poderiam parecer cansativas em uma apresentação. A maioria das pesquisas e estatísticas indica que as pessoas assistem e consomem vídeos mais do que outras formas 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 determinada taxa de FPS (frames por segundo).
  • Use um utilitário de terceiros como ffmpeg (para java) para criar um vídeo a partir dos quadros.

Converter PowerPoint para Vídeo

  1. Adicione isto ao seu arquivo POM:
   <dependency>
     <groupId>net.bramp.ffmpeg</groupId>
     <artifactId>ffmpeg</artifactId>
     <version>0.7.0</version>
   </dependency>
  1. Baixe o ffmpeg aqui.

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

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

Presentation presentation = new Presentation();
try {
    // Adiciona uma forma de sorriso e então a anima
    IAutoShape smile = presentation.getSlides().get_Item(0).getShapes().addAutoShape(ShapeType.SmileyFace, 110, 20, 500, 500);
    ISequence mainSequence = presentation.getSlides().get_Item(0).getTimeline().getMainSequence();
    IEffect effectIn = mainSequence.addEffect(smile, EffectType.Fly, EffectSubtype.TopLeft, EffectTriggerType.AfterPrevious);
    IEffect effectOut = mainSequence.addEffect(smile, EffectType.Fly, EffectSubtype.BottomRight, EffectTriggerType.AfterPrevious);
    effectIn.getTiming().setDuration(2f);
    effectOut.setPresetClassType(EffectPresetClassType.Exit);

    final int fps = 33;
    ArrayList<String> frames = new ArrayList<String>();

    PresentationAnimationsGenerator animationsGenerator = new PresentationAnimationsGenerator(presentation);
    try
    {
        PresentationPlayer player = new PresentationPlayer(animationsGenerator, fps);
        try {
            player.setFrameTick((sender, arguments) ->
            {
                try {
                    String frame = String.format("frame_%04d.png", sender.getFrameIndex());
                    arguments.getFrame().save(frame, ImageFormat.Png);
                    frames.add(frame);
                } catch (IOException e) {
                    throw new 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
    FFmpeg ffmpeg = new FFmpeg("path/to/ffmpeg");
    FFprobe ffprobe = new FFprobe("path/to/ffprobe");

    FFmpegBuilder builder = new FFmpegBuilder()
            .addExtraArgs("-start_number", "1")
            .setInput("frame_%04d.png")
            .addOutput("output.avi")
            .setVideoFrameRate(FFmpeg.FPS_24)
            .setFormat("avi")
            .done();

    FFmpegExecutor executor = new FFmpegExecutor(ffmpeg, ffprobe);
    executor.createJob(builder).run();
} catch (IOException e) {
    e.printStackTrace();
}

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 as 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

ISlide newSlide = presentation.getSlides().addEmptySlide(presentation.getSlides().get_Item(0).getLayoutSlide());

newSlide.getBackground().setType(BackgroundType.OwnBackground);

newSlide.getBackground().getFillFormat().setFillType(FillType.Solid);

newSlide.getBackground().getFillFormat().getSolidFillColor().setColor(Color.MAGENTA);

newSlide.getSlideShowTransition().setType(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 atraso definido para um segundo):

Presentation presentation = new Presentation();
try {
    // Adiciona texto e animações
    IAutoShape autoShape = presentation.getSlides().get_Item(0).getShapes().addAutoShape(ShapeType.Rectangle, 210, 120, 300, 300);
    Paragraph para1 = new Paragraph();
    para1.getPortions().add(new Portion("Aspose Slides for Java"));
    Paragraph para2 = new Paragraph();
    para2.getPortions().add(new Portion("convert PowerPoint Presentation with text to video"));

    Paragraph para3 = new Paragraph();
    para3.getPortions().add(new Portion("paragraph by paragraph"));
    IParagraphCollection paragraphCollection = autoShape.getTextFrame().getParagraphs();
    paragraphCollection.add(para1);
    paragraphCollection.add(para2);
    paragraphCollection.add(para3);
    paragraphCollection.add(new Paragraph());

    ISequence mainSequence = presentation.getSlides().get_Item(0).getTimeline().getMainSequence();
    IEffect effect1 = mainSequence.addEffect(para1, EffectType.Appear, EffectSubtype.None, EffectTriggerType.AfterPrevious);
    IEffect effect2 = mainSequence.addEffect(para2, EffectType.Appear, EffectSubtype.None, EffectTriggerType.AfterPrevious);
    IEffect effect3 = mainSequence.addEffect(para3, EffectType.Appear, EffectSubtype.None, EffectTriggerType.AfterPrevious);
    IEffect effect4 = mainSequence.addEffect(para3, EffectType.Appear, EffectSubtype.None, EffectTriggerType.AfterPrevious);

    effect1.getTiming().setTriggerDelayTime(1f);
    effect2.getTiming().setTriggerDelayTime(1f);
    effect3.getTiming().setTriggerDelayTime(1f);
    effect4.getTiming().setTriggerDelayTime(1f);

    final int fps = 33;
    ArrayList<String> frames = new ArrayList<String>();

    PresentationAnimationsGenerator animationsGenerator = new PresentationAnimationsGenerator(presentation);
    try
    {
        PresentationPlayer player = new PresentationPlayer(animationsGenerator, fps);
        try {
            player.setFrameTick((sender, arguments) ->
            {
                try {
                    String frame = String.format("frame_%04d.png", sender.getFrameIndex());
                    arguments.getFrame().save(frame, ImageFormat.Png);
                    frames.add(frame);
                } catch (IOException e) {
                    throw new 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
    FFmpeg ffmpeg = new FFmpeg("path/to/ffmpeg");
    FFprobe ffprobe = new FFprobe("path/to/ffprobe");

    FFmpegBuilder builder = new FFmpegBuilder()
            .addExtraArgs("-start_number", "1")
            .setInput("frame_%04d.png")
            .addOutput("output.avi")
            .setVideoFrameRate(FFmpeg.FPS_24)
            .setFormat("avi")
            .done();

    FFmpegExecutor executor = new FFmpegExecutor(ffmpeg, ffprobe);
    executor.createJob(builder).run();
} catch (IOException e) {
    e.printStackTrace();
}

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.

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

Quando as animações são geradas, um evento NewAnimation é criado para cada animação subsequente, que possui o parâmetro IPresentationAnimationPlayer. Este último é uma classe que representa um reprodutor para uma animação separada.

Para trabalhar com IPresentationAnimationPlayer, são usados a propriedade Duration (a duração total da animação) e o método SetTimePosition. Cada posição da animação é definida dentro do intervalo 0 a duration, e então o método GetFrame retornará um BufferedImage que corresponde ao estado da animação naquele momento:

Presentation presentation = new Presentation();
try {
    // Adiciona uma forma de sorriso e a anima
    IAutoShape smile = presentation.getSlides().get_Item(0).getShapes().addAutoShape(ShapeType.SmileyFace, 110, 20, 500, 500);
    ISequence mainSequence = presentation.getSlides().get_Item(0).getTimeline().getMainSequence();
    IEffect effectIn = mainSequence.addEffect(smile, EffectType.Fly, EffectSubtype.TopLeft, EffectTriggerType.AfterPrevious);
    IEffect effectOut = mainSequence.addEffect(smile, EffectType.Fly, EffectSubtype.BottomRight, EffectTriggerType.AfterPrevious);
    effectIn.getTiming().setDuration(2f);
    effectOut.setPresetClassType(EffectPresetClassType.Exit);

    PresentationAnimationsGenerator animationsGenerator = new PresentationAnimationsGenerator(presentation);
    try {
        animationsGenerator.setNewAnimation(animationPlayer ->
        {
            System.out.println(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", ImageFormat.Png);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            animationPlayer.setTimePosition(animationPlayer.getDuration()); // estado final da animação
            try {
                // último quadro da animação
                animationPlayer.getFrame().save("lastFrame.png", ImageFormat.Png);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });
    } finally {
        if (animationsGenerator != null) animationsGenerator.dispose();
    }
} finally {
    if (presentation != null) presentation.dispose();
}

Para fazer com que todas as animações em uma apresentação sejam reproduzidas simultaneamente, a classe PresentationPlayer é usada. Essa classe recebe uma instância de PresentationAnimationsGenerator e FPS para os efeitos em seu construtor e então chama o evento FrameTick para todas as animações, fazendo‑as reproduzir:

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

Então os quadros gerados podem ser compilados para produzir um vídeo. Veja a seção Convert PowerPoint to Video.

Animações e Efeitos Compatíveis

Entrada:

Tipo de Animação Aspose.Slides PowerPoint
Appear não suportado suportado
Fade suportado suportado
Fly In suportado suportado
Float In suportado suportado
Split suportado suportado
Wipe suportado suportado
Shape suportado suportado
Wheel suportado suportado
Random Bars suportado suportado
Grow & Turn não suportado suportado
Zoom suportado suportado
Swivel suportado suportado
Bounce suportado suportado

Ênfase:

Tipo de Animação Aspose.Slides PowerPoint
Pulse não suportado suportado
Color Pulse não suportado suportado
Teeter suportado suportado
Spin suportado suportado
Grow/Shrink não suportado suportado
Desaturate não suportado suportado
Darken não suportado suportado
Lighten não suportado suportado
Transparency não suportado suportado
Object Color não suportado suportado
Complementary Color não suportado suportado
Line Color não suportado suportado
Fill Color não suportado suportado

Saída:

Tipo de Animação Aspose.Slides PowerPoint
Disappear não suportado suportado
Fade suportado suportado
Fly Out suportado suportado
Float Out suportado suportado
Split suportado suportado
Wipe suportado suportado
Shape suportado suportado
Random Bars suportado suportado
Shrink & Turn não suportado suportado
Zoom suportado suportado
Swivel suportado suportado
Bounce suportado suportado

Caminhos de Movimento:

Tipo de Animação Aspose.Slides PowerPoint
Lines suportado suportado
Arcs suportado suportado
Turns suportado suportado
Shapes suportado suportado
Loops suportado suportado
Custom Path suportado suportado

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 na nuvem. A biblioteca foi projetada para funcionar 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. No entanto, ao trabalhar com arquivos muito grandes, podem ser necessários recursos de sistema adicionais, e às vezes é recomendado otimizar a apresentação para melhorar o desempenho.