Управление видеокадрами в презентациях с помощью 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 or 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 секунды и последняя секунда. Используйте видео длинее 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 .

Добавить субтитры к видеокадру

В этом примере встраивается локальное видео и добавляется дорожка субтитров WebVTT с меткой English. Метки времени субтитров должны соответствовать видео. Сохранённая презентация содержит как видео, так и его субтитры.

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

Часто задаваемые вопросы

Какие параметры воспроизведения видео можно изменить для видеокадра?

Вы можете управлять режимом воспроизведения (авто или по щелчку) и повтором. Эти параметры доступны через методы объекта VideoFrame.

Влияет ли добавление видео на размер файла PPTX?

Да. При встраивании локального видео бинарные данные включаются в документ, поэтому размер презентации увеличивается пропорционально размеру файла. При ссылке на онлайн‑видео и добавлении миниатюры презентация сохраняет только ссылку и предварительное изображение, а не данные видео, поэтому рост размера обычно меньше.

Могу ли я заменить видео в существующем видеокадре, не меняя его позицию и размеры?

Да. Вы можете заменить видеоконтент внутри кадра, сохранив геометрию формы; это распространённый сценарий обновления медиа в существующей раскладке.

Можно ли определить тип содержимого (MIME) встроенного видео?

Да. Встроенное видео имеет тип содержимого, который можно прочитать и использовать, например при сохранении на диск.