在 Python 中管理簡報中的影片框格
介紹
影片可以協助說明概念並吸引觀眾。Aspose.Slides for Python via .NET 讓您可以將影片框格加入投影片、調整播放設定、管理字幕,並擷取嵌入的影片資料。
PowerPoint 支援本機影片以及指向線上影片(例如 YouTube 影片)的連結。
為了表示影片資料與影片框格,Aspose.Slides 提供了 影片 類別、影片框格 類別,以及其他相關型別。
建立嵌入式影片框格
如果要加入的影片檔案位於本機,您可以建立影片框格將影片嵌入簡報中。
此範例將本機影片嵌入現有簡報的第一張投影片,並將結果儲存。框格座標與尺寸的單位為點。因為 LoadingStreamBehavior.KEEP_LOCKED 會在簡報使用期間保持鎖定,所以串流會持續開啟,直到儲存完成為止。
import aspose.slides as slides
with slides.Presentation("presentation.pptx") as presentation:
slide = presentation.slides[0]
with open("video.mp4", "rb") as video_stream:
video = presentation.videos.add_video(video_stream, slides.LoadingStreamBehavior.KEEP_LOCKED)
slide.shapes.add_video_frame(10, 10, 150, 250, video)
presentation.save("embedded_video.pptx", slides.export.SaveFormat.PPTX)
您也可以直接將本機影片路徑傳遞給 add_video_frame。此範例將影片嵌入新簡報的第一張投影片。影片必須在簡報儲存之前保持可存取。
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
slide.shapes.add_video_frame(50, 150, 300, 150, "video.avi")
presentation.save("video_from_path.pptx", slides.export.SaveFormat.PPTX)
建立來自網路來源的影片框格
Microsoft PowerPoint 支援在簡報中使用線上影片。您可以建立連結至線上影片(例如 YouTube 影片)的影片框格。
此範例將 YouTube 影片連結與縮圖加入第一張投影片。將影片識別碼替換為其他影片即可使用其他影片。play_mode 設定要求自動播放。下載縮圖與播放影片需要網路存取,簡報檢視器亦必須支援線上影片播放。
from urllib.request import urlopen
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
video_id = "aqz-KE-bpKQ"
video_url = f"https://www.youtube.com/embed/{video_id}"
video_frame = slide.shapes.add_video_frame(10, 10, 427, 240, video_url)
video_frame.play_mode = slides.VideoPlayModePreset.AUTO
thumbnail_url = f"https://img.youtube.com/vi/{video_id}/hqdefault.jpg"
with urlopen(thumbnail_url) as response:
thumbnail_data = response.read()
thumbnail = presentation.images.add_image(thumbnail_data)
video_frame.picture_format.picture.image = thumbnail
presentation.save("online_video.pptx", slides.export.SaveFormat.PPTX)
全螢幕播放影片
在培訓簡報中,您可以全螢幕播放軟體示範,讓觀眾看到細節。將 full_screen_mode 設為 True,即可在播放期間啟用此行為。
此範例開啟簡報,找出第一張投影片上的第一個 VideoFrame,並啟用全螢幕播放。輸入簡報必須至少在第一張投影片上包含一個已存在的影片框格。
import aspose.slides as slides
with slides.Presentation("training.pptx") as presentation:
slide = presentation.slides[0]
for shape in slide.shapes:
if isinstance(shape, slides.VideoFrame):
shape.full_screen_mode = True
break
presentation.save("full_screen_video.pptx", slides.export.SaveFormat.PPTX)
全螢幕播放決定影片的顯示方式。獨立地,play_mode 控制它是自動播放或點擊播放,而 play_loop_mode 則控制是否重複播放。若要選擇開始行為,請將播放模式設為 VideoPlayModePreset.AUTO 或 VideoPlayModePreset.ON_CLICK。此範例會保留既有的開始與迴圈設定。
播放完畢後倒回影片
在培訓簡報中,將示範影片倒回開頭可使簡報者再次播放。將 rewind_video 設為 True,即可在播放結束後將影片倒回開頭。
此範例開啟簡報,找出第一張投影片上的第一個 VideoFrame,並啟用倒回。它會停用迴圈,使播放能完整結束,並將播放設定為點擊開始。輸入簡報必須至少在第一張投影片上包含一個已存在的影片框格。
import aspose.slides as slides
with slides.Presentation("training.pptx") as presentation:
slide = presentation.slides[0]
for shape in slide.shapes:
if isinstance(shape, slides.VideoFrame):
shape.rewind_video = True
shape.play_loop_mode = False
shape.play_mode = slides.VideoPlayModePreset.ON_CLICK
break
presentation.save("rewind_video.pptx", slides.export.SaveFormat.PPTX)
倒回會將影片返回開頭而不會再次啟動。相反地,啟用 play_loop_mode 會自動重複播放。當您希望影片結束後保持可重播狀態時,請停用迴圈。play_mode 獨立控制自動或點擊啟動;此範例使用 VideoPlayModePreset.ON_CLICK,讓簡報者自行決定何時開始播放。請在設定迴圈之後再設定播放模式,如範例所示。倒回與 full_screen_mode 獨立運作。
剪裁影片框格
使用 VideoFrame.trim_from_start 與 VideoFrame.trim_from_end 可在播放期間跳過影片開頭或結尾的部分。兩個值的單位為毫秒。剪裁會變更播放設定,但不會修改嵌入的影片資料。
設定剪裁
此範例將本機影片嵌入,並在播放時跳過前 2.5 秒與最後 1 秒。請使用長於 3.5 秒的影片,以確保仍有可播放的段落。
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
with open("video.mp4", "rb") as video_stream:
video_data = video_stream.read()
video = presentation.videos.add_video(video_data)
video_frame = slide.shapes.add_video_frame(50, 50, 640, 360, video)
video_frame.trim_from_start = 2500.0
video_frame.trim_from_end = 1000.0
presentation.save("video_with_trim.pptx", slides.export.SaveFormat.PPTX)
讀取剪裁設定
此範例以毫秒為單位輸出第一張投影片上第一個影片框格的剪裁值。簡報必須至少包含一張投影片;若該投影片沒有影片框格,則不會輸出任何內容。前面的範例會產生 2500 與 1000 兩個值。
import aspose.slides as slides
with slides.Presentation("video_with_trim.pptx") as presentation:
slide = presentation.slides[0]
for shape in slide.shapes:
if isinstance(shape, slides.VideoFrame):
print(f"Trim from start: {shape.trim_from_start} ms")
print(f"Trim from end: {shape.trim_from_end} ms")
break
管理影片字幕
Aspose.Slides 允許您在 PowerPoint 簡報的影片框格中管理隱蔽字幕。字幕以 WebVTT 格式儲存,並可透過 VideoFrame.caption_tracks屬性存取。
為影片框格加入字幕
此範例將本機影片嵌入,並加入標記為 English 的 WebVTT 字幕軌道。字幕時間戳記必須與影片相符。儲存的簡報會同時包含影片與其字幕。
import aspose.slides as slides
with slides.Presentation() as presentation:
slide = presentation.slides[0]
with open("video.mp4", "rb") as video_stream:
video_data = video_stream.read()
video = presentation.videos.add_video(video_data)
video_frame = slide.shapes.add_video_frame(0, 0, 100, 100, video)
video_frame.caption_tracks.add("English", "track.vtt")
presentation.save("video_with_captions.pptx", slides.export.SaveFormat.PPTX)
CaptionsCollection 類別亦提供一個多載,允許您從串流加入字幕。
從影片框格擷取字幕
此範例將第一張投影片上所有影片框格的字幕軌道保存為個別的 WebVTT 檔案。使用連續編號以確保輸出檔案唯一。主控台會報告擷取的軌道數量。簡報必須至少包含一張投影片。
import aspose.slides as slides
with slides.Presentation("video_with_captions.pptx") as presentation:
slide = presentation.slides[0]
track_count = 0
for shape in slide.shapes:
if isinstance(shape, slides.VideoFrame):
for caption_track in shape.caption_tracks:
track_count += 1
output_path = f"captions_{track_count}.vtt"
with open(output_path, "wb") as track_stream:
track_stream.write(bytes(caption_track.binary_data))
print(f"Caption tracks extracted: {track_count}")
每個 Captions 物件會公開字幕識別碼、標籤、二進位資料以及作為 UTF-8 字串的字幕文字。
從影片框格移除字幕
此範例移除第一張投影片上第一個形狀位置的影片框格的所有字幕,並儲存結果。它假設該投影片與形狀皆存在且該形狀為影片框格。
import aspose.slides as slides
with slides.Presentation("video_with_captions.pptx") as presentation:
slide = presentation.slides[0]
video_frame = slide.shapes[0]
video_frame.caption_tracks.clear()
presentation.save("video_without_captions.pptx", slides.export.SaveFormat.PPTX)
如果只需要移除單一字幕軌道,請使用 remove 或 remove_at 方法,取代 clear。
從投影片中擷取影片
除了將影片加入投影片,Aspose.Slides 也允許您從簡報中擷取嵌入的影片。
此範例將每張投影片中的嵌入影片擷取為獨立的編號二進位檔案。連結影片會被跳過,因為它們沒有嵌入資料。主控台會列印每支影片的 MIME 型別與總計數量。輸出使用通用的 .bin 副檔名;必要時可依報告的媒體型別更改副檔名。
import aspose.slides as slides
with slides.Presentation("presentation_with_videos.pptx") as presentation:
video_count = 0
for slide in presentation.slides:
for shape in slide.shapes:
if isinstance(shape, slides.VideoFrame):
video = shape.embedded_video
if video is None:
print("Skipped a linked video: no embedded data is available.")
continue
video_count += 1
output_path = f"extracted_video_{video_count}.bin"
with open(output_path, "wb") as video_stream:
video_stream.write(bytes(video.binary_data))
print(f"Video {video_count}: {video.content_type}")
print(f"Embedded videos extracted: {video_count}")
常見問題
可以變更影片框格的哪些播放參數?
您可以控制 playback mode(自動或點擊)與 looping。這些選項可透過 VideoFrame 物件的屬性取得。
加入影片會影響 PPTX 檔案大小嗎?
會。若將本機影片嵌入,二進位資料會被寫入文件,簡報大小會隨影片檔案大小成比例增長。若連結線上影片並加入縮圖,簡報僅儲存連結與預覽影像,而非影片資料,通常會使檔案大小增幅較小。
可以在不變更位置與尺寸的情況下替換既有影片框格中的影片嗎?
可以。您可以交換影片框格內的 video content,同時保留形狀的幾何屬性;這是更新既有版面中媒體的常見情境。
能否判斷嵌入影片的內容類型 (MIME)?
可以。嵌入的影片具有可讀取的 content type,您可以在例如儲存至磁碟時使用它。