تحويل عروض PowerPoint إلى فيديو باستخدام JavaScript

عن طريق تحويل عرض PowerPoint إلى فيديو، ستحصل على

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

تحويل PowerPoint إلى فيديو في Aspose.Slides

يدعم Aspose.Slides تحويل العروض إلى فيديو.

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

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

  1. نزّل ffmpeg هنا.
  2. نفّذ شفرة JavaScript الخاصة بتحويل PowerPoint إلى فيديو.

تُظهر لك هذه الشفرة كيفية تحويل عرض (يحتوي على شكل وتأثيرين حركيين) إلى فيديو:

var presentation = new aspose.slides.Presentation();
try {
    // يضيف شكل ابتسامة ثم يحركه
    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();
        }
    }
    // تهيئة مجلد ملفات ffmpeg التنفيذية. راجع هذه الصفحة: 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);
}

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

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

الحركات والانتقالات تجعل عروض الشرائح أكثر جذبًا وإثارة — وتؤدي نفس الغرض للفيديوهات. لنضيف شريحة وانتقال إضافي إلى الشفرة الخاصة بالعرض السابق:

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

var presentation = new aspose.slides.Presentation();
try {
    // يضيف النص والحركات
    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();
        }
    }
    // تكوين مجلد ملفات ffmpeg التنفيذية. راجع هذه الصفحة: 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);
}

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

لتسهيل مهام تحويل PowerPoint إلى فيديو، يوفر Aspose.Slides الفئتين PresentationAnimationsGenerator وPresentationPlayer.

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

عند توليد الحركات، يُنشأ حدث NewAnimation لكل حركة لاحقة، ويتضمن معلمة مشغل حركات العرض. هذا الأخير هو فئة تمثل المشغل لحركة منفصلة.

للعمل مع مشغل حركات العرض، تُستخدم طريقة getDuration (المدة الكلية للحركة) وطريقة setTimePosition. يتم ضبط كل موقع حركة ضمن النطاق 0 إلى المدة، ثم تُرجع طريقة getFrame صورة BufferedImage تمثل حالة الحركة في تلك اللحظة:

var presentation = new aspose.slides.Presentation();
try {
    // يضيف شكل ابتسامة ويحركه
    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);// الحالة الأولية للرسوم المتحركة
            try {
                // صورة الحالة الأولية للرسوم المتحركة
                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());// الحالة النهائية للرسوم المتحركة
            try {
                // الإطار الأخير للرسوم المتحركة
                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();
    }
}

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

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

بعد ذلك يمكن تجميع الإطارات المُولدة لإنتاج فيديو. راجع قسم Convert PowerPoint to Video.

الحركات والEffects المدعومة

الدخول:

نوع الحركة Aspose.Slides PowerPoint
Appear غير مدعوم مدعوم
Fade مدعوم مدعوم
Fly In مدعوم مدعوم
Float In مدعوم مدعوم
Split مدعوم مدعوم
Wipe مدعوم مدعوم
Shape مدعوم مدعوم
Wheel مدعوم مدعوم
Random Bars مدعوم مدعوم
Grow & Turn غير مدعوم مدعوم
Zoom مدعوم مدعوم
Swivel مدعوم مدعوم
Bounce مدعوم مدعوم

التأكيد:

نوع الحركة Aspose.Slides PowerPoint
Pulse غير مدعوم مدعوم
Color Pulse غير مدعوم مدعوم
Teeter مدعوم مدعوم
Spin مدعوم مدعوم
Grow/Shrink غير مدعوم مدعوم
Desaturate غير مدعوم مدعوم
Darken غير مدعوم مدعوم
Lighten غير مدعوم مدعوم
Transparency غير مدعوم مدعوم
Object Color غير مدعوم مدعوم
Complementary Color غير مدعوم مدعوم
Line Color غير مدعوم مدعوم
Fill Color غير مدعوم مدعوم

الخروج:

نوع الحركة Aspose.Slides PowerPoint
Disappear غير مدعوم مدعوم
Fade مدعوم مدعوم
Fly Out مدعوم مدعوم
Float Out مدعوم مدعوم
Split مدعوم مدعوم
Wipe مدعوم مدعوم
Shape مدعوم مدعوم
Random Bars مدعوم مدعوم
Shrink & Turn غير مدعوم مدعوم
Zoom مدعوم مدعوم
Swivel مدعوم مدعوم
Bounce مدعوم مدعوم

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

نوع الحركة Aspose.Slides PowerPoint
Lines مدعوم مدعوم
Arcs مدعوم مدعوم
Turns مدعوم مدعوم
Shapes مدعوم مدعوم
Loops مدعوم مدعوم
Custom Path مدعوم مدعوم

الأسئلة المتكررة

هل يمكن تحويل العروض المحمية بكلمة مرور؟

نعم، يتيح Aspose.Slides العمل مع العروض المحمية بكلمة مرور. عند معالجة هذه الملفات، تحتاج إلى تقديم كلمة المرور الصحيحة حتى يتمكن المكتبة من الوصول إلى محتوى العرض.

هل يدعم Aspose.Slides الاستخدام في الحلول السحابية؟

نعم، يمكن دمج Aspose.Slides في التطبيقات والخدمات السحابية. تم تصميم المكتبة للعمل في بيئات الخوادم، مما يضمن أداءً عاليًا وقابلية توسع لمعالجة دفعات الملفات.

هل هناك قيود على حجم العروض أثناء التحويل؟

يستطيع Aspose.Slides التعامل مع عروض بحجم شبه غير محدود. ومع ذلك، عند العمل مع ملفات كبيرة جدًا قد تحتاج إلى موارد نظام إضافية، ومن المستحسن أحيانًا تحسين العرض لتحسين الأداء.