إدارة إطارات الفيديو في العروض التقديمية باستخدام بايثون

المقدمة

يمكن لفيديو موضعه بشكل جيد في عرض تقديمي أن يجعل رسالتك أكثر إقناعًا ويزيد من مستويات التفاعل مع جمهورك.

يسمح لك PowerPoint بإضافة مقاطع الفيديو إلى شريحة في عرض تقديمي بطريقتين:

  • إضافة أو تضمين فيديو محلي (مخزن على جهازك)
  • إضافة فيديو عبر الإنترنت (من مصدر ويب مثل YouTube).

لتتيح لك إضافة مقاطع الفيديو (كائنات الفيديو) إلى عرض تقديمي، توفر Aspose.Slides فئة Video وVideoFrame وفئات أخرى ذات صلة.

إنشاء إطارات فيديو مدمجة

إذا كان ملف الفيديو الذي تريد إضافته إلى الشريحة مخزنًا محليًا، يمكنك إنشاء إطار فيديو لتضمين الفيديو في عرضك التقديمي.

  1. إنشاء كائن من فئة Presentation .
  2. الحصول على مرجع إلى شريحة باستخدام فهرستها.
  3. إضافة كائن Video وتمرير بيانات ملف الفيديو لتضمين الفيديو في العرض.
  4. إضافة كائن VideoFrame لإنشاء إطار للفيديو.
  5. حفظ العرض التقديمي المعدل.

يظهر لك هذا الكود بلغة Python كيفية إضافة فيديو مخزن محليًا إلى عرض تقديمي:

from pathlib import Path

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation("pres.pptx")
try:
    video_data = Path("Wildlife.mp4").read_bytes()
    java_video_data = jpype.JArray(jpype.JByte)(video_data)
    video = presentation.getVideos().addVideo(java_video_data)
    presentation.getSlides().get_Item(0).getShapes().addVideoFrame(10, 10, 150, 250, video)
    presentation.save("pres-with-video.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

بدلاً من ذلك، يمكنك إضافة فيديو بتمرير مسار ملفه مباشرة إلى طريقة addVideoFrame :

import jpype
import asposeslides

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

from asposeslides.api import Presentation

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)
    video_frame = slide.getShapes().addVideoFrame(50, 150, 300, 150, "video1.avi")
finally:
    presentation.dispose()

إنشاء إطارات فيديو باستخدام فيديو من مصادر ويب

يدعم Microsoft PowerPoint 2013 والإصدارات الأحدث مقاطع فيديو YouTube في العروض التقديمية. إذا كان الفيديو الذي تريد استخدامه متاحًا على الإنترنت (مثلًا على YouTube)، يمكنك إضافته إلى عرضك التقديمي عبر رابط الويب الخاص به.

  1. إنشاء كائن من فئة Presentation .
  2. الحصول على مرجع إلى شريحة باستخدام فهرستها.
  3. إضافة كائن VideoFrame وتمرير رابط الفيديو.
  4. تعيين صورة مصغرة لإطار الفيديو.
  5. حفظ العرض التقديمي.

يظهر لك هذا الكود بلغة Python كيفية إضافة فيديو من الويب إلى شريحة في عرض PowerPoint:

from urllib.request import urlopen

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, VideoPlayModePreset

video_id = "Tj75Arhq5ho"
presentation = Presentation()
try:
    video_frame = presentation.getSlides().get_Item(0).getShapes().addVideoFrame(10, 10, 427, 240, "https://www.youtube.com/embed/" + video_id)
    video_frame.setPlayMode(VideoPlayModePreset.Auto)

    # تحميل الصورة المصغرة.
    thumbnail_uri = "https://img.youtube.com/vi/" + video_id + "/hqdefault.jpg"
    try:
        with urlopen(thumbnail_uri) as response:
            thumbnail_data = response.read()
        java_thumbnail_data = jpype.JArray(jpype.JByte)(thumbnail_data)
        thumbnail = presentation.getImages().addImage(java_thumbnail_data)
        video_frame.getPictureFormat().getPicture().setImage(thumbnail)
    except OSError as error:
        print("Could not load the thumbnail:", error)

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

تقليم إطار فيديو

تتيح لك Aspose.Slides التحكم في الجزء الذي يتم تشغيله من الفيديو من خلال تعيين قيمتي trim-from-start و trim-from-end عبر VideoFrame.setTrimFromStart وVideoFrame.setTrimFromEnd. تُحدد القيمتان بالميليثانية وتحدد مقدار الوقت المتخطى من بداية الفيديو ونهايته، على التوالي. تقوم هذه الإعدادات بتغيير إعدادات تشغيل الفيديو في العرض التقديمي؛ فهي لا تقص أو تعدل بيانات الفيديو الثنائية المضمنة.

ضبط إعدادات التقليم

لإنشاء إطار فيديو وضبط إعدادات التقليم الخاصة به:

  1. إنشاء كائن من فئة Presentation .
  2. إضافة كائن Video إلى العرض.
  3. إضافة كائن VideoFrame إلى شريحة.
  4. تعيين قيمتي trim-from-start وtrim-from-end عبر VideoFrame.setTrimFromStart وVideoFrame.setTrimFromEnd .
  5. حفظ العرض التقديمي المعدل.

يتخطى مثال الكود التالي الثانية الأولى 2.5 والثانية الأخيرة من الفيديو المدمج أثناء التشغيل:

from pathlib import Path

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation()
try:
    video_data = Path("video.mp4").read_bytes()
    java_video_data = jpype.JArray(jpype.JByte)(video_data)
    video = presentation.getVideos().addVideo(java_video_data)
    slide = presentation.getSlides().get_Item(0)
    video_frame = slide.getShapes().addVideoFrame(50, 50, 640, 360, video)

    video_frame.setTrimFromStart(2500.0)
    video_frame.setTrimFromEnd(1000.0)
    presentation.save("video_with_trim.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

قراءة إعدادات التقليم

لتفحص إعدادات التقليم الحالية، قم بتحميل عرض تقديمي، وابحث عن كائن VideoFrame بين الأشكال على الشريحة الأولى، ثم اقرأ القيم عبر VideoFrame.getTrimFromStart وVideoFrame.getTrimFromEnd .

يجد مثال الكود التالي أول إطار فيديو على الشريحة الأولى ويبلغ عن إعدادات التقليم الخاصة به بالميليثانية:

import jpype
import asposeslides

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

from asposeslides.api import Presentation, VideoFrame

presentation = Presentation("video_with_trim.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    for shape in slide.getShapes():
        if isinstance(shape, VideoFrame):
            trim_from_start = shape.getTrimFromStart()
            trim_from_end = shape.getTrimFromEnd()
            print(f"Trim from start: {trim_from_start} ms")
            print(f"Trim from end: {trim_from_end} ms")
            break
finally:
    presentation.dispose()

إدارة تسميات الفيديو

تتيح لك Aspose.Slides إدارة النصوص المغلقة لإطارات الفيديو في عروض PowerPoint التقديمية. يتم تخزين العناوين بتنسيق WebVTT وتُعرض عبر طريقة VideoFrame.getCaptionTracks .

إضافة تسميات إلى إطار فيديو

لإضافة تسميات إلى إطار فيديو:

  1. إنشاء كائن من فئة Presentation .
  2. إضافة فيديو إلى العرض.
  3. إضافة كائن VideoFrame إلى شريحة.
  4. استخدام CaptionsCollection التي تُرجعها getCaptionTracks لإضافة مسار تسمية WebVTT.
  5. حفظ العرض التقديمي المعدل.

يظهر لك الكود التالي كيفية إضافة تسميات إلى إطار فيديو:

from pathlib import Path

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat

presentation = Presentation()
try:
    video_data = Path("video.mp4").read_bytes()
    java_video_data = jpype.JArray(jpype.JByte)(video_data)
    video = presentation.getVideos().addVideo(java_video_data)
    slide = presentation.getSlides().get_Item(0)
    video_frame = slide.getShapes().addVideoFrame(0, 0, 100, 100, video)

    # إضافة مسار توضيحات جديد من ملف WebVTT.
    video_frame.getCaptionTracks().add("English", "track.vtt")
    presentation.save("video_with_captions.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

توفر فئة CaptionsCollection أيضًا طريقة تتيح لك إضافة تسميات من تدفق.

استخراج التسميات من إطار فيديو

لاستخراج التسميات من إطار فيديو:

  1. تحميل العرض التقديمي الذي يحتوي على الفيديو.
  2. العثور على كائن VideoFrame المستهدف.
  3. التكرار عبر مسارات التسميات في CaptionsCollection .
  4. حفظ كل مسار تسمية إلى ملف .vtt .

يظهر لك الكود التالي كيفية استخراج التسميات من إطار فيديو:

from pathlib import Path

import jpype
import asposeslides

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

from asposeslides.api import Presentation, VideoFrame

presentation = Presentation("video_with_captions.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    for shape in slide.getShapes():
        if isinstance(shape, VideoFrame):
            for caption_track in shape.getCaptionTracks():
                # حفظ مسار التسمية إلى ملف WebVTT.
                file_path = Path(str(caption_track.getCaptionId()) + ".vtt")
                caption_data = bytes(caption_track.getBinaryData())
                file_path.write_bytes(caption_data)
finally:
    presentation.dispose()

كل كائن Captions يكشف عن معرف التسمية، التسمية، البيانات الثنائية، ونص التسمية كسلسلة UTF-8.

إزالة التسميات من إطار فيديو

لإزالة التسميات من إطار فيديو:

  1. تحميل العرض التقديمي الذي يحتوي على الفيديو.
  2. الحصول على كائن VideoFrame المستهدف.
  3. إزالة مسارات التسميات من CaptionsCollection .
  4. حفظ العرض التقديمي المعدل.

يظهر لك الكود التالي كيفية إزالة جميع التسميات من إطار فيديو:

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, VideoFrame

presentation = Presentation("video_with_captions.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    video_frame = slide.getShapes().get_Item(0)
    if isinstance(video_frame, VideoFrame):
        # إزالة جميع التسميات من إطار الفيديو.
        video_frame.getCaptionTracks().clear()
        presentation.save("video_without_captions.pptx", SaveFormat.Pptx)
    else:
        print("The shape is not a video frame.")
finally:
    presentation.dispose()

إذا كنت بحاجة إلى إزالة مسار تسمية واحد فقط، استخدم طرق remove أو removeAt بدلاً من clear .

استخراج الفيديو من الشرائح

بالإضافة إلى إضافة مقاطع الفيديو إلى الشرائح، تسمح لك Aspose.Slides باستخراج مقاطع الفيديو المضمنة في العروض التقديمية.

  1. إنشاء كائن من فئة Presentation لتحميل العرض التقديمي الذي يحتوي على الفيديو.
  2. التكرار عبر جميع كائنات Slide .
  3. التكرار عبر جميع كائنات Shape للعثور على VideoFrame .
  4. حفظ الفيديو إلى القرص.

يظهر لك هذا الكود بلغة Python كيفية استخراج الفيديو على شريحة من العرض التقديمي:

from pathlib import Path

import jpype
import asposeslides

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

from asposeslides.api import Presentation, VideoFrame

presentation = Presentation("VideoSample.pptx")
try:
    for slide in presentation.getSlides():
        for shape in slide.getShapes():
            if isinstance(shape, VideoFrame):
                video = shape.getEmbeddedVideo()
                if video is not None:
                    content_type = str(video.getContentType())
                    file_extension = content_type.split("/", 1)[-1]
                    video_data = bytes(video.getBinaryData())
                    Path("testing2." + file_extension).write_bytes(video_data)
                else:
                    print("The video frame has no embedded video.")
finally:
    presentation.dispose()

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

ما هي معلمات تشغيل الفيديو التي يمكن تعديلها لإطار VideoFrame؟

يمكنك التحكم في وضع التشغيل (تلقائي أو عند النقر) والتكرار . تتوفر هذه الخيارات عبر خصائص كائن VideoFrame .

هل يؤثر إضافة فيديو على حجم ملف PPTX؟

نعم. عندما تقوم بتضمين فيديو محلي، تُضمّن البيانات الثنائية في المستند، وبالتالي ينمو حجم العرض التقديمي بنسبة حجم الملف. عندما تضيف فيديوًا عبر الإنترنت، يتم تضمين رابط وصورة مصغرة، لذا يكون زيادة الحجم أصغر.

هل يمكنني استبدال الفيديو في إطار VideoFrame موجود دون تغيير موقعه وحجمه؟

نعم. يمكنك استبدال محتوى الفيديو داخل الإطار مع حفظ هندسة الشكل؛ هذا سيناريو شائع لتحديث الوسائط في تخطيط موجود.

هل يمكن تحديد نوع المحتوى (MIME) للفيديو المدمج؟

نعم. يحتوي الفيديو المدمج على نوع المحتوى يمكنك قراءته واستخدامه، على سبيل المثال عند حفظه إلى القرص.