تحويل PowerPoint إلى فيديو

باستخدام تحويل العرض التقديمي الخاص بك من PowerPoint إلى فيديو، ستحصل على

  • زيادة في إمكانية الوصول: جميع الأجهزة (بغض النظر عن النظام) مزودة بمشغلات فيديو بشكل افتراضي مقارنة بتطبيقات فتح العروض التقديمية، لذا يجد المستخدمون أنه من الأسهل فتح أو تشغيل مقاطع الفيديو.
  • وصول أكبر: من خلال مقاطع الفيديو، يمكنك الوصول إلى جمهور كبير واستهدافهم بمعلومات قد تبدو مملة بخلاف ذلك في عرض تقديمي. تشير معظم الاستطلاعات والإحصائيات إلى أن الناس يشاهدون ويستهلكون مقاطع الفيديو أكثر من أشكال المحتوى الأخرى، وعادة ما يفضلون هذا النوع من المحتوى.

تحويل PowerPoint إلى فيديو باستخدام Aspose.Slides

في Aspose.Slides 22.11، قمنا بتنفيذ دعم تحويل العرض التقديمي إلى فيديو.

  • استخدم Aspose.Slides لإنشاء مجموعة من الإطارات (من شرائح العرض التقديمي) التي تتوافق مع FPS معين (إطار في الثانية)
  • استخدم أداة خارجية مثل ffmpeg (لـ java) لإنشاء فيديو استنادًا إلى الإطارات.

تحويل PowerPoint إلى فيديو

  1. أضف هذا إلى ملف POM الخاص بك:
   <dependency>
     <groupId>net.bramp.ffmpeg</groupId>
     <artifactId>ffmpeg</artifactId>
     <version>0.7.0</version>
   </dependency>
  1. قم بتنزيل ffmpeg هنا.

  2. قم بتشغيل كود Java لتحويل PowerPoint إلى فيديو.

يوضح لك هذا الكود كيفية تحويل عرض تقديمي (يحتوي على شكل وصفتين متحركتين) إلى فيديو:

Presentation presentation = new Presentation();
try {
    // يضيف شكل ابتسامة ثم يحركه
    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();
    }

    // تكوين مجلد ثنائيات ffmpeg. انظر هذه الصفحة: 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();
}

تأثيرات الفيديو

يمكنك تطبيق الرسوم المتحركة على الكائنات على الشرائح واستخدام الانتقالات بين الشرائح.

تجعل الرسوم المتحركة والانتقالات عروض الشرائح أكثر جاذبية وإثارة للاهتمام - وتفعل نفس الشيء بالنسبة لمقاطع الفيديو. دعنا نضيف شريحة أخرى وانتقال إلى الكود الخاص بالعرض التقديمي السابق:

// يضيف شكل ابتسامة ويحركه

// ...

// يضيف شريحة جديدة وانتقال متحرك

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 أيضًا الرسوم المتحركة للنصوص. لذا نقوم بتحريك الفقرات على الكائنات، والتي ستظهر واحدة تلو الأخرى (مع التأخير المحدد لثانية واحدة):

Presentation presentation = new Presentation();
try {
    // يضيف نصوصًا ورسومًا متحركة
    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("تحويل عرض PowerPoint مع النص إلى فيديو"));

    Paragraph para3 = new Paragraph();
    para3.getPortions().add(new Portion("فقرة بعد فقرة"));
    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();
    }

    // تكوين مجلد ثنائيات ffmpeg. انظر هذه الصفحة: 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();
}

فصول تحويل الفيديو

لتمكينك من أداء مهام تحويل PowerPoint إلى فيديو، يوفر Aspose.Slides PresentationAnimationsGenerator و PresentationPlayer الفصول.

يسمح لك PresentationAnimationsGenerator بتعيين حجم الإطار للفيديو (الذي سيتم إنشاؤه لاحقًا) من خلال منشئه. إذا قمت بتمرير مثيل للعرض التقديمي، فسيتم استخدام Presentation.SlideSize ويولد رسومًا متحركة تستخدمها PresentationPlayer.

عند إنشاء الرسوم المتحركة، يتم إنشاء حدث NewAnimation لكل رسوم متحركة تالية، والتي تحتوي على معلمة IPresentationAnimationPlayer. هذا هو فصل يمثل مشغلًا لرسوم متحركة منفصلة.

للعمل مع IPresentationAnimationPlayer، يتم استخدام خاصية Duration (المدة الكاملة للرسوم المتحركة) وطريقة SetTimePosition. يتم تعيين كل موضع لرسوم متحركة ضمن نطاق 0 إلى المدة، ثم ستعيد طريقة GetFrame صورة BufferedImage تتوافق مع حالة الرسوم المتحركة في تلك اللحظة:

Presentation presentation = new Presentation();
try {
    // يضيف شكل ابتسامة ويحركه
    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("المدة الإجمالية للرسوم المتحركة: %f", animationPlayer.getDuration()));
            animationPlayer.setTimePosition(0); // الحالة الأولية للرسوم المتحركة
            try {
                // حالة الرسوم المتحركة الأولية
                animationPlayer.getFrame().save("firstFrame.png", ImageFormat.Png);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            animationPlayer.setTimePosition(animationPlayer.getDuration()); // الحالة النهائية للرسوم المتحركة
            try {
                // آخر إطار من الرسوم المتحركة
                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();
}

لجعل جميع الرسوم المتحركة في عرض تقديمي تعمل في نفس الوقت، يتم استخدام فصل PresentationPlayer. يأخذ هذا الفصل مثيل PresentationAnimationsGenerator وFPS للتأثيرات في منشئته ثم يستدعي حدث FrameTick لجميع الرسوم المتحركة للحصول على تشغيلها:

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();
}

ثم يمكن تجميع الإطارات الناتجة لإنتاج فيديو. راجع قسم تحويل PowerPoint إلى فيديو.

الرسوم المتحركة والتأثيرات المدعومة

الظهور:

نوع الرسوم المتحركة Aspose.Slides PowerPoint
الظهور غير مدعوم مدعوم
تلاشي مدعوم مدعوم
المجيء مدعوم مدعوم
التطفو مدعوم مدعوم
التقسيم مدعوم مدعوم
المسح مدعوم مدعوم
الشكل مدعوم مدعوم
العجلة مدعوم مدعوم
الأشرطة العشوائية مدعوم مدعوم
نمو وتدوير غير مدعوم مدعوم
تكبير مدعوم مدعوم
الدوران مدعوم مدعوم
الارتداد مدعوم مدعوم

التأكيد:

نوع الرسوم المتحركة Aspose.Slides PowerPoint
النبضة غير مدعوم مدعوم
نبضة اللون غير مدعوم مدعوم
الأرجوحة مدعوم مدعوم
الدوران مدعوم مدعوم
النمو / الانكماش غير مدعوم مدعوم
التشبع غير مدعوم مدعوم
التغميق غير مدعوم مدعوم
الإضاءة غير مدعوم مدعوم
الشفافية غير مدعوم مدعوم
لون الكائن غير مدعوم مدعوم
اللون التكميلي غير مدعوم مدعوم
لون الخط غير مدعوم مدعوم
لون التعبئة غير مدعوم مدعوم

المغادرة:

نوع الرسوم المتحركة Aspose.Slides PowerPoint
الاختفاء غير مدعوم مدعوم
تلاشي مدعوم مدعوم
المغادرة مدعوم مدعوم
الطفو للخارج مدعوم مدعوم
التقسيم مدعوم مدعوم
المسح مدعوم مدعوم
الشكل مدعوم مدعوم
الأشرطة العشوائية مدعوم مدعوم
انكماش وتدوير غير مدعوم مدعوم
تكبير مدعوم مدعوم
الدوران مدعوم مدعوم
الارتداد مدعوم مدعوم

مسارات الحركة:

نوع الرسوم المتحركة Aspose.Slides PowerPoint
خطوط مدعوم مدعوم
اقواس مدعوم مدعوم
تحولات مدعوم مدعوم
أشكال مدعوم مدعوم
حلقات مدعوم مدعوم
مسار مخصص مدعوم مدعوم