Python में PowerPoint प्रस्तुतियों को वीडियो में बदलें

समग्र विवरण

PowerPoint या OpenDocument प्रस्तुति को वीडियो में परिवर्तित करने से दर्शक प्रस्तुति एप्लिकेशन को खोले बिना उसकी सामग्री को वीडियो प्लेयर में देख सकते हैं। Aspose.Slides for Python via Java प्रस्तुति एनीमेशन और ट्रांज़िशन को इमेज फ्रेम्स में रेंडर करता है। एक अलग एन्कोडर, जैसे FFmpeg, उन फ्रेम्स को एक वीडियो फ़ाइल में संयोजित करता है।

PowerPoint को वीडियो में बदलें

रूपांतरण दो चरणों में होता है: चुनी गई फ्रेम दर पर PNG फ्रेम्स उत्पन्न करना, फिर इमेज अनुक्रम को MP4 के रूप में एन्कोड करना। एनीमेशन टाइमिंग को बनाए रखने के लिए दोनों चरणों में समान फ्रेम दर उपयोग करें।

उदाहरण चलाने से पहले:

  1. Aspose.Slides for Python via Java सेट अप करें।
  2. FFmpeg डाउनलोड करें और उसका executable PATH में उपलब्ध कराएं। उदाहरण libx264 एन्कोडर वाले बिल्ड का उपयोग करता है।
  3. निम्नलिखित Python कोड को एक लिखने योग्य डायरेक्टरी में चलाएँ।

यह उदाहरण प्रवेश और निकास एनीमेशन के साथ एक मुस्कुराते हुए आकार को बनाता है, 30 FPS पर फ्रेम रेंडर करता है, और output.mp4 बनाने के लिए FFmpeg को कॉल करता है। एक नई फ्रेम डायरेक्टरी पहले चलाए गए फ्रेम्स को वीडियो में शामिल होने से रोकती है।

import shutil
import subprocess
import tempfile
from pathlib import Path

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import EffectPresetClassType, EffectSubtype, EffectTriggerType, EffectType, ImageFormat, Presentation, PresentationAnimationsGenerator, PresentationPlayer, ShapeType

fps = 30
frames_directory = Path(tempfile.mkdtemp(prefix="video_frames_", dir="."))
frame_count = 0

def save_frame(sender, arguments):
    global frame_count
    frame_path = frames_directory / f"frame_{frame_count:06d}.png"
    frame = arguments.getFrame()
    try:
        frame.save(str(frame_path), ImageFormat.Png)
    finally:
        frame.dispose()
    frame_count += 1

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    smile = slide.getShapes().addAutoShape(ShapeType.SmileyFace, 110, 20, 500, 500)
    sequence = slide.getTimeline().getMainSequence()
    entrance = sequence.addEffect(smile, EffectType.Fly, EffectSubtype.TopLeft, EffectTriggerType.AfterPrevious)
    entrance.getTiming().setDuration(2.0)
    exit_effect = sequence.addEffect(smile, EffectType.Fly, EffectSubtype.BottomRight, EffectTriggerType.AfterPrevious)
    exit_effect.setPresetClassType(EffectPresetClassType.Exit)
    exit_effect.getTiming().setDuration(2.0)

    generator = PresentationAnimationsGenerator(presentation)
    try:
        player = PresentationPlayer(generator, fps)
        try:
            callback = jpype.JProxy("com.aspose.slides.PresentationPlayer$FrameTick", dict(invoke=save_frame))
            player.setFrameTick(callback)
            generator.run(presentation.getSlides())
        finally:
            player.dispose()
    finally:
        generator.dispose()
finally:
    presentation.dispose()

ffmpeg = shutil.which("ffmpeg")
if frame_count == 0:
    print("No frames were generated.")
elif ffmpeg is None:
    print(f"FFmpeg was not found on PATH. PNG frames are available in {frames_directory}.")
else:
    input_pattern = str(frames_directory / "frame_%06d.png")
    command = [ffmpeg, "-n", "-framerate", str(fps), "-start_number", "0", "-i", input_pattern, "-vf", "pad=ceil(iw/2)*2:ceil(ih/2)*2", "-c:v", "libx264", "-pix_fmt", "yuv420p", "output.mp4"]
    result = subprocess.run(command, check=False)
    if result.returncode == 0:
        print("Saved output.mp4")
    else:
        print(f"FFmpeg failed with exit code {result.returncode}. Frames are available in {frames_directory}.")

एक मौजूदा फ़ाइल को बदलने के लिए, उसके पाथ के साथ Presentation को इनिशियलाइज़ करें और shape‑creation तथा animation‑creation कथनों को छोड़ दें।

FFmpeg कमांड एक क्रमांकित image sequence को पढ़ता है, विषम आयामों को बराबर मूल्यों तक पैड करता है, और yuv420p पिक्सेल फ़ॉर्मेट के साथ H.264 वीडियो लिखता है। -n विकल्प मौजूदा आउटपुट फ़ाइल को ओवरराइट होने से रोकता है। उत्पन्न PNG फ़ाइलें फ्रेम डायरेक्टरी में रहती हैं; जब आवश्यक न हों तो उन्हें हटाएँ।

वीडियो इफ़ेक्ट्स

एनीमेशन नियंत्रित करते हैं कि स्लाइड ऑब्जेक्ट्स कैसे दिखते, मूव होते या गायब होते हैं। ट्रांज़िशन स्लाइडों के बीच परिवर्तन को नियंत्रित करता है। वीडियो फ्रेम्स उत्पन्न करने से पहले इन इफ़ेक्ट्स को जोड़ें।

देखें PowerPoint Animation, Shape Animation, Shape Effects, और Slide Transitions

स्लाइड ट्रांज़िशन जोड़ें

निम्नलिखित स्वतंत्र उदाहरण दो स्लाइड्स वाला एक प्रस्तुति बनाता है। दूसरी स्लाइड का बैकग्राउंड मैजेंटा है और इसमें पुश ट्रांज़िशन है। प्रस्तुति को सेव करें, फिर उसे ऊपर के फ्रेम‑जनरेशन उदाहरण की इनपुट के रूप में उपयोग करें।

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import BackgroundType, FillType, Presentation, SaveFormat, ShapeType, TransitionType

Color = jpype.JClass("java.awt.Color")

presentation = Presentation()
try:
    first_slide = presentation.getSlides().get_Item(0)
    first_slide.getShapes().addAutoShape(ShapeType.SmileyFace, 110, 20, 500, 500)
    new_slide = presentation.getSlides().addEmptySlide(first_slide.getLayoutSlide())
    new_slide.getBackground().setType(BackgroundType.OwnBackground)
    new_slide.getBackground().getFillFormat().setFillType(FillType.Solid)
    new_slide.getBackground().getFillFormat().getSolidFillColor().setColor(Color.MAGENTA)
    new_slide.getSlideShowTransition().setType(TransitionType.Push)
    presentation.save("transition.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

पैराग्राफ एनीमेट करें

टेक्स्ट पैराग्राफ दर पैराग्राफ दिखाई दे सकता है। यह उदाहरण तीन पैराग्राफ बनाता है जिनमें क्रमिक फ़ेड प्रवेश इफ़ेक्ट्स हैं, प्रत्येक पूर्व प्रभाव के एक सेकंड बाद देरी से। सहेजी गई paragraphs.pptx फ़ाइल को वीडियो‑कन्वर्ज़न उदाहरण की इनपुट के रूप में उपयोग करें।

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import EffectSubtype, EffectTriggerType, EffectType, Paragraph, Portion, Presentation, SaveFormat, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 210, 120, 300, 300)
    shape.addTextFrame("")
    paragraphs = shape.getTextFrame().getParagraphs()
    paragraphs.clear()
    sequence = slide.getTimeline().getMainSequence()
    texts = ["Aspose.Slides for Python via Java", "Convert presentation text to video", "Paragraph by paragraph"]

    for text in texts:
        paragraph = Paragraph()
        portion = Portion(text)
        paragraph.getPortions().add(portion)
        paragraphs.add(paragraph)
        effect = sequence.addEffect(paragraph, EffectType.Fade, EffectSubtype.None_, EffectTriggerType.AfterPrevious)
        effect.getTiming().setTriggerDelayTime(1.0)
        effect.getTiming().setDuration(1.0)

    presentation.save("paragraphs.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

वीडियो रूपांतरण कक्षाएँ

PresentationAnimationsGenerator स्लाइड्स के लिए एनीमेशन इवेंट्स उत्पन्न करता है। इसे एक प्रस्तुति से बनाते समय फ्रेम्स के लिए प्रस्तुति के स्लाइड आकार का उपयोग करता है। डिफ़ॉल्ट मिलीसेकंड में देरी को कॉन्फ़िगर करने के लिए setDefaultDelay का उपयोग करें।

PresentationPlayer निर्माणकर्ता द्वारा प्रदान की गई फ्रेम दर पर उत्पन्न एनीमेशन को सैंपल करता है। JPype के माध्यम से setFrameTick के साथ एक Python कॉलबैक रजिस्टर करें, फिर फ्रेम उत्पन्न करने के लिए run को कॉल करें। पहला उदाहरण अपना स्वयं का शून्य‑आधारित काउंटर उपयोग करता है ताकि फ़ाइलनाम FFmpeg के इनपुट अनुक्रम से मेल खाएँ।

व्यक्तिगत एनीमेशन स्थितियों के लिए, setNewAnimation के साथ एक कॉलबैक रजिस्टर करें। कॉलबैक को एक एनीमेशन प्लेयर प्राप्त होता है जिसे चयनित समय पर स्थित किया जा सकता है। निम्नलिखित उदाहरण प्रत्येक उत्पन्न एनीमेशन के पहले और अंतिम फ्रेम को अद्वितीय फ़ाइलनामों के साथ सहेजता है:

from pathlib import Path

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import EffectSubtype, EffectTriggerType, EffectType, ImageFormat, Presentation, PresentationAnimationsGenerator, ShapeType

output_directory = Path("animation_states")
output_directory.mkdir(exist_ok=True)
animation_index = 0

def save_animation_states(animation_player):
    global animation_index
    duration = animation_player.getDuration()
    print(f"Animation {animation_index}: {duration} milliseconds")
    for label, position in [("first", 0.0), ("last", duration)]:
        animation_player.setTimePosition(position)
        frame = animation_player.getFrame()
        try:
            frame_path = output_directory / f"animation_{animation_index:04d}_{label}.png"
            frame.save(str(frame_path), ImageFormat.Png)
        finally:
            frame.dispose()
    animation_index += 1

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    smile = slide.getShapes().addAutoShape(ShapeType.SmileyFace, 110, 20, 500, 500)
    sequence = slide.getTimeline().getMainSequence()
    effect = sequence.addEffect(smile, EffectType.Fly, EffectSubtype.TopLeft, EffectTriggerType.AfterPrevious)
    effect.getTiming().setDuration(2.0)

    generator = PresentationAnimationsGenerator(presentation)
    try:
        callback = jpype.JProxy("com.aspose.slides.PresentationAnimationsGenerator$NewAnimation", dict(invoke=save_animation_states))
        generator.setNewAnimation(callback)
        generator.run(presentation.getSlides())
    finally:
        generator.dispose()
finally:
    presentation.dispose()

समर्थित एनीमेशन और इफ़ेक्ट्स

निम्न तालिकाएँ Java रूपांतरण लेख में वर्णित रेंडरिंग समर्थन का सारांश प्रस्तुत करती हैं। जब प्रस्तुति असमर्थित इफ़ेक्ट्स का उपयोग करती है तो उत्पन्न फ्रेम्स का पूर्वावलोकन करें।

प्रवेश:

एनीमेशन प्रकार 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 सीधे MP4 फ़ाइल बनाता है?

नहीं। Aspose.Slides प्रस्तुति फ्रेम्स बनाता है। उन्हें MP4 फ़ाइल में संयोजित करने के लिए FFmpeg जैसे वीडियो एन्कोडर का उपयोग करें।

वीडियो अपेक्षा से तेज़ या धीमा क्यों चलता है?

फ़्रेम जनरेशन और एन्कोडर की इनपुट फ्रेम दर के लिए समान FPS उपयोग करें। असंगतता इमेज अनुक्रम की प्लेबैक अवधि बदल देती है।

क्या मैं पासवर्ड‑सुरक्षित प्रस्तुति को बदल सकता हूँ?

हां। सुरक्षित प्रस्तुति को लोड करते समय सही पासवर्ड प्रदान करें, फिर लोड की गई सामग्री से फ्रेम्स उत्पन्न करें।

क्या यह कार्यप्रवाह प्रस्तुति ऑडियो को संरक्षित करता है?

उदाहरण इमेज फ्रेम्स निर्यात करते हैं, इसलिए resulting video मौन है। ऑडियो शामिल करने के लिए, वीडियो एन्कोडिंग के दौरान एक ऑडियो ट्रैक अलग से प्रदान करें।

मैं अस्थायी डिस्क उपयोग को कैसे घटा सकता हूँ?

छोटी फ्रेम आकार या कम FPS उपयोग करें, और सफल एन्कोडिंग के बाद अस्थायी PNG फ़ाइलें हटाएँ। किसी भी सेटिंग को घटाते समय परिणामस्वरूप वीडियो गुणवत्ता की जाँच करें।