使用 Java 管理簡報中的影片畫格

簡介

影片可以幫助說明概念並吸引觀眾。Aspose.Slides for Java 可讓您將視頻畫格新增至投影片,調整播放設定,管理字幕,並擷取內嵌的視頻資料。

PowerPoint 支援本機影片以及指向線上影片的連結,例如 YouTube 影片。

為了表示影片資料和影片畫格,Aspose.Slides 提供了 IVideo 介面、IVideoFrame 介面以及其他相關類型。

建立內嵌影片畫格

如果您要新增至投影片的影片檔案儲存在本機,您可以建立影片畫格,以將影片內嵌至簡報中。

此範例將本機影片內嵌於現有簡報的第一張投影片,並儲存結果。畫格座標與尺寸以點為單位。因為 LoadingStreamBehavior.KeepLocked 在簡報使用期間會保持串流鎖定,所以串流會持續開啟直到儲存完成。

import com.aspose.slides.*;
import java.io.FileInputStream;

Presentation presentation = new Presentation("presentation.pptx");
try (FileInputStream videoStream = new FileInputStream("video.mp4")) {
    ISlide slide = presentation.getSlides().get_Item(0);

    IVideo video = presentation.getVideos().addVideo(videoStream, LoadingStreamBehavior.KeepLocked);
    slide.getShapes().addVideoFrame(10, 10, 150, 250, video);

    presentation.save("embedded_video.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

您也可以直接將本機影片路徑傳遞給 addVideoFrame。此範例將影片內嵌於新簡報的第一張投影片。影片必須在簡報儲存之前保持可存取。

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    slide.getShapes().addVideoFrame(50, 150, 300, 150, "video.avi");

    presentation.save("video_from_path.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

建立來自網站來源的影片畫格

Microsoft PowerPoint 在簡報中支援線上影片。您可以建立連結至線上影片(例如 YouTube 影片)的影片畫格。

此範例在第一張投影片加入 YouTube 影片連結與縮圖。請替換影片識別碼以使用其他影片。setPlayMode 方法會要求自動播放。下載縮圖與播放影片皆需網際網路存取。簡報檢視器也必須支援線上影片播放。

import com.aspose.slides.*;
import java.io.InputStream;
import java.net.URL;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    String videoId = "aqz-KE-bpKQ";
    String videoUrl = "https://www.youtube.com/embed/" + videoId;
    IVideoFrame videoFrame = slide.getShapes().addVideoFrame(10, 10, 427, 240, videoUrl);
    videoFrame.setPlayMode(VideoPlayModePreset.Auto);

    String thumbnailUrl = "https://img.youtube.com/vi/" + videoId + "/hqdefault.jpg";
    URL thumbnailLocation = new URL(thumbnailUrl);
    try (InputStream thumbnailStream = thumbnailLocation.openStream()) {
        IPPImage thumbnail = presentation.getImages().addImage(thumbnailStream);
        videoFrame.getPictureFormat().getPicture().setImage(thumbnail);
    }

    presentation.save("online_video.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

以全螢幕模式播放影片

在訓練簡報中,您可以以全螢幕模式播放軟體示範,讓觀眾看到細節。於播放期間呼叫 setFullScreenMode 並傳入 true,即可啟用此行為。

此範例開啟簡報,於第一張投影片中找到第一個 IVideoFrame,並啟用全螢幕播放。輸入簡報必須至少在第一張投影片上含有一個現有的影片畫格。

import com.aspose.slides.*;

Presentation presentation = new Presentation("training.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    for (IShape shape : slide.getShapes()) {
        if (shape instanceof IVideoFrame) {
            IVideoFrame videoFrame = (IVideoFrame) shape;
            videoFrame.setFullScreenMode(true);
            break;
        }
    }

    presentation.save("full_screen_video.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

全螢幕播放會控制影片的顯示方式。另一方面,setPlayMode 控制影片是自動開始或點擊播放,setPlayLoopMode 控制是否重複播放。若要選擇開始行為,請將播放模式設定為 VideoPlayModePreset.Auto 或 VideoPlayModePreset.OnClick。此範例保留了現有的開始與循環設定。

在播放後倒帶影片

在訓練簡報中,將示範影片倒回開頭可讓簡報者再次播放。於播放結束後呼叫 setRewindVideo 並傳入 true,即可將影片倒回開頭。

此範例開啟簡報,於第一張投影片中找到第一個 IVideoFrame,並啟用倒帶。它會停用循環,使播放能完整結束,並將播放設定為點擊開始。輸入簡報必須至少在第一張投影片上包含一個現有的影片畫格。

import com.aspose.slides.*;

Presentation presentation = new Presentation("training.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    for (IShape shape : slide.getShapes()) {
        if (shape instanceof IVideoFrame) {
            IVideoFrame videoFrame = (IVideoFrame) shape;
            videoFrame.setRewindVideo(true);
            videoFrame.setPlayLoopMode(false);
            videoFrame.setPlayMode(VideoPlayModePreset.OnClick);
            break;
        }
    }

    presentation.save("rewind_video.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

倒帶會將影片返回開頭而不會再次啟動。相較之下,將 setPlayLoopMode 設為 true 會自動重複播放。若希望影片結束後保持可重新播放,請保持循環停用。setPlayMode 獨立控制自動或點擊啟動;本範例使用 VideoPlayModePreset.OnClick,讓簡報者自行決定何時開始播放。正如範例所示,請在設定循環之後再設定播放模式。倒帶的運作與 setFullScreenMode 無關。

裁剪影片畫格

使用 IVideoFrame.setTrimFromStart 和 IVideoFrame.setTrimFromEnd 可於播放時略過影片開頭或結尾的部分。兩個值皆以毫秒為單位。裁剪會變更播放設定,但不會修改內嵌的影片資料。

設定裁剪

此範例將本機影片內嵌,並在播放時略過前 2.5 秒與最後 1 秒。請使用長度超過 3.5 秒的影片,以保留可播放的片段。

import com.aspose.slides.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    Path videoPath = Paths.get("video.mp4");
    byte[] videoData = Files.readAllBytes(videoPath);
    IVideo video = presentation.getVideos().addVideo(videoData);

    IVideoFrame videoFrame = slide.getShapes().addVideoFrame(50, 50, 640, 360, video);
    videoFrame.setTrimFromStart(2500f);
    videoFrame.setTrimFromEnd(1000f);

    presentation.save("video_with_trim.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

讀取裁剪設定

此範例以毫秒為單位印出第一張投影片上第一個影片畫格的裁剪值。簡報必須至少包含一張投影片。若該投影片沒有影片畫格,則不會印出任何內容。前一個範例會產生 2500 與 1000 的值。

import com.aspose.slides.*;

Presentation presentation = new Presentation("video_with_trim.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    for (IShape shape : slide.getShapes()) {
        if (shape instanceof IVideoFrame) {
            IVideoFrame videoFrame = (IVideoFrame) shape;
            System.out.println("Trim from start: " + videoFrame.getTrimFromStart() + " ms");
            System.out.println("Trim from end: " + videoFrame.getTrimFromEnd() + " ms");
            break;
        }
    }
} finally {
    presentation.dispose();
}

管理影片字幕

Aspose.Slides 允許您管理 PowerPoint 簡報中影片畫格的隱藏字幕。字幕以 WebVTT 格式儲存,並可透過 IVideoFrame.getCaptionTracks 方法取得。

為影片畫格新增字幕

此範例將本機影片內嵌,並新增一條標註為 English 的 WebVTT 字幕軌。字幕的時間戳記應與影片相符。儲存的簡報同時包含影片與其字幕。

import com.aspose.slides.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    Path videoPath = Paths.get("video.mp4");
    byte[] videoData = Files.readAllBytes(videoPath);
    IVideo video = presentation.getVideos().addVideo(videoData);

    IVideoFrame videoFrame = slide.getShapes().addVideoFrame(0, 0, 100, 100, video);
    videoFrame.getCaptionTracks().add("English", "track.vtt");

    presentation.save("video_with_captions.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

ICaptionsCollection 介面亦提供一個重載,可讓您從串流加入字幕。

從影片畫格擷取字幕

此範例將第一張投影片上所有影片畫格的字幕軌儲存為個別的 WebVTT 檔案。使用連續編號以區分輸出檔案。主控台會報告擷取的軌道數量。簡報必須至少包含一張投影片。

import com.aspose.slides.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

Presentation presentation = new Presentation("video_with_captions.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    int trackCount = 0;
    for (IShape shape : slide.getShapes()) {
        if (shape instanceof IVideoFrame) {
            IVideoFrame videoFrame = (IVideoFrame) shape;
            for (ICaptions captionTrack : videoFrame.getCaptionTracks()) {
                trackCount++;
                Path outputPath = Paths.get("captions_" + trackCount + ".vtt");
                Files.write(outputPath, captionTrack.getBinaryData());
            }
        }
    }

    System.out.println("Caption tracks extracted: " + trackCount);
} finally {
    presentation.dispose();
}

每個 ICaptions 物件會公開字幕識別碼、標籤、二進位資料,以及以 UTF-8 字串表示的字幕文字。

從影片畫格移除字幕

此範例移除第一張投影片第一個圖形位置之影片畫格的所有字幕,並儲存結果。它假設該投影片與圖形皆存在且圖形為影片畫格。

import com.aspose.slides.*;

Presentation presentation = new Presentation("video_with_captions.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    IVideoFrame videoFrame = (IVideoFrame) slide.getShapes().get_Item(0);
    videoFrame.getCaptionTracks().clear();

    presentation.save("video_without_captions.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

如果您只需要移除單一字幕軌,請使用 remove 或 removeAt 方法,而非 clear。

從投影片擷取影片

除了將影片新增至投影片外,Aspose.Slides 也允許您擷取簡報中內嵌的影片。

此範例將每張投影片內嵌的影片擷取為分別編號的二進位檔案。連結的影片會被略過,因為它們沒有內嵌資料。主控台會印出每支影片的 MIME 類型與總數。輸出使用通用的 .bin 副檔名;必要時可依報告的媒體類型更改副檔名。

import com.aspose.slides.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

Presentation presentation = new Presentation("presentation_with_videos.pptx");
try {
    int videoCount = 0;
    for (ISlide slide : presentation.getSlides()) {
        for (IShape shape : slide.getShapes()) {
            if (shape instanceof IVideoFrame) {
                IVideoFrame videoFrame = (IVideoFrame) shape;
                IVideo video = videoFrame.getEmbeddedVideo();
                if (video == null) {
                    System.out.println("Skipped a linked video: no embedded data is available.");
                    continue;
                }

                videoCount++;
                Path outputPath = Paths.get("extracted_video_" + videoCount + ".bin");
                Files.write(outputPath, video.getBinaryData());
                System.out.println("Video " + videoCount + ": " + video.getContentType());
            }
        }
    }

    System.out.println("Embedded videos extracted: " + videoCount);
} finally {
    presentation.dispose();
}

常見問題

可以變更影片畫格的哪種播放參數?

您可以透過 playback mode(自動或點擊)與 looping 來控制。這些選項可透過 VideoFrame 物件的方法使用。

加入影片會影響 PPTX 檔案大小嗎?

會。當您內嵌本機影片時,二進位資料會寫入文件,簡報大小會隨檔案大小成比例增加。當您連結至線上影片並加入縮圖時,簡報僅儲存連結與預覽圖像,而非影片資料,因此大小增幅通常較小。

我可以在不更改位置與尺寸的情況下,取代現有影片畫格中的影片嗎?

可以。您可以在保持形狀幾何不變的情況下,交換畫格內的 video content,這是更新既有版面媒體的常見情境。

可以判斷內嵌影片的內容類型(MIME)嗎?

可以。內嵌影片具有可讀取的 content type,您可以使用它,例如在儲存至磁碟時。