Управление видеокадрами в презентациях на Android

Введение

Хорошо размещённое видео в презентации может сделать ваше сообщение более убедительным и повысить уровень вовлечённости аудитории.

PowerPoint позволяет добавлять видео на слайд в презентации двумя способами:

  • Добавить или встроить локальное видео (хранящееся на вашем компьютере)
  • Добавить онлайн‑видео (из веб‑источника, например YouTube).

Для того чтобы добавить видео‑объекты в презентацию, Aspose.Slides предоставляет интерфейс IVideo, интерфейс IVideoFrame и другие соответствующие типы.

Создание встроенного кадра видео

Если файл видео, который вы хотите добавить на слайд, хранится локально, вы можете создать кадр видео для встраивания в презентацию.

  1. Создайте экземпляр класса Presentation.
  2. Получите ссылку на слайд через его индекс.
  3. Добавьте объект IVideo и передайте путь к файлу видео, чтобы встроить его в презентацию.
  4. Добавьте объект IVideoFrame для создания кадра видео.
  5. Сохраните изменённую презентацию.

Этот Java‑код показывает, как добавить локальное видео в презентацию:

// Создаёт экземпляр класса Presentation
Presentation pres = new Presentation("pres.pptx");
try {
    // Загружает видео
    FileInputStream fileStream = new FileInputStream("Wildlife.mp4");
    
    IVideo video = pres.getVideos().addVideo(fileStream, LoadingStreamBehavior.KeepLocked);

    // Получает первый слайд и добавляет видеокадр
    pres.getSlides().get_Item(0).getShapes().addVideoFrame(10, 10, 150, 250, video);

    // Сохраняет презентацию на диск
    pres.save("pres-with-video.pptx", SaveFormat.Pptx);
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

В качестве альтернативы можно добавить видео, передав путь к файлу напрямую в метод addVideoFrame(float x,float y,float width,float height,IVideo video):

Presentation pres = new Presentation();
try {
	ISlide sld = pres.getSlides().get_Item(0);
	IVideoFrame vf = sld.getShapes().addVideoFrame(50, 150, 300, 150, "video1.avi");
} finally {
	if (pres != null) pres.dispose();
}

Создание кадра видео с видео из веб‑источника

Новые версии Microsoft PowerPoint поддерживают онлайн‑видео в презентациях. Если нужное вам видео доступно в интернете (например, на YouTube), вы можете добавить его в презентацию по ссылке.

  1. Создайте экземпляр класса Presentation.
  2. Получите ссылку на слайд через его индекс.
  3. Добавьте объект IVideo и передайте ссылку на видео.
  4. Установите миниатюру для кадра видео.
  5. Сохраните презентацию.

Этот Java‑код показывает, как добавить видео из интернета на слайд в презентации PowerPoint:

// Создаёт объект Presentation, представляющий файл презентации
Presentation pres = new Presentation();
try {
    addVideoFromYouTube(pres, "Tj75Arhq5ho");
    pres.save("out.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}
private static void addVideoFromYouTube(Presentation pres, String videoID)
{
    // Добавляет видеокадр
    IVideoFrame videoFrame = pres.getSlides().get_Item(0).getShapes().addVideoFrame(
            10, 10, 427, 240, "https://www.youtube.com/embed/" + videoID);
    videoFrame.setPlayMode(VideoPlayModePreset.Auto);

    // Загружает миниатюру
    String thumbnailUri = "http://img.youtube.com/vi/" + videoID + "/hqdefault.jpg";
    URL url;

    try {
        url = new URL(thumbnailUri);
        videoFrame.getPictureFormat().getPicture().setImage(pres.getImages().addImage(url.openStream()));
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Обрезка кадра видео

Aspose.Slides позволяет управлять тем, какая часть видео будет воспроизводиться, задавая значения trim‑from‑start и trim‑from‑end через методы IVideoFrame.setTrimFromStart и IVideoFrame.setTrimFromEnd. Оба значения указываются в миллисекундах и определяют, сколько времени пропускается с начала и с конца видео соответственно. Эти параметры меняют настройку воспроизведения видео в презентации; они не обрезают и не изменяют бинарные данные встроенного видео.

Установка параметров обрезки

Для создания кадра видео и задания ему параметров обрезки:

  1. Создайте экземпляр класса Presentation.
  2. Добавьте объект IVideo в презентацию.
  3. Добавьте объект IVideoFrame на слайд.
  4. Задайте значения trim‑from‑start и trim‑from‑end через методы IVideoFrame.setTrimFromStart и IVideoFrame.setTrimFromEnd.
  5. Сохраните изменённую презентацию.

Следующий пример кода пропускает первые 2,5 секунды и последнюю секунду встроенного видео при воспроизведении:

Presentation presentation = new Presentation();
try {
    FileInputStream videoStream = new FileInputStream("video.mp4");
    try {
        IVideo video = presentation.getVideos().addVideo(
                videoStream, LoadingStreamBehavior.ReadStreamAndRelease);
        ISlide slide = presentation.getSlides().get_Item(0);
        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 {
        videoStream.close();
    }
} finally {
    presentation.dispose();
}

Чтение параметров обрезки

Чтобы получить текущие параметры обрезки, загрузите презентацию, найдите объект IVideoFrame среди фигур на первом слайде и прочитайте значения через методы IVideoFrame.getTrimFromStart и IVideoFrame.getTrimFromEnd.

Следующий пример кода находит первый кадр видео на первом слайде и выводит его параметры обрезки в миллисекундах:

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;
            float trimFromStart = videoFrame.getTrimFromStart();
            float trimFromEnd = videoFrame.getTrimFromEnd();

            System.out.println("Trim from start: " + trimFromStart + " ms");
            System.out.println("Trim from end: " + trimFromEnd + " ms");
            break;
        }
    }
} finally {
    presentation.dispose();
}

Управление субтитрами видео

Aspose.Slides позволяет управлять закрытыми субтитрами для видеокадров в презентациях PowerPoint. Субтитры хранятся в формате WebVTT и доступны через метод IVideoFrame.getCaptionTracks.

Добавление субтитров к кадру видео

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

  1. Создайте экземпляр класса Presentation.
  2. Добавьте видео в презентацию.
  3. Добавьте объект IVideoFrame на слайд.
  4. Используйте объект ICaptionsCollection, возвращаемый методом getCaptionTracks, чтобы добавить дорожку субтитров WebVTT.
  5. Сохраните изменённую презентацию.

Следующий код показывает, как добавить субтитры к видеокадру:

Presentation presentation = new Presentation();
try {
    byte[] videoData = // "video.mp4";
    IVideo video = presentation.getVideos().addVideo(videoData);

    ISlide slide = presentation.getSlides().get_Item(0);
    IVideoFrame videoFrame = slide.getShapes().addVideoFrame(0, 0, 100, 100, video);

    // Добавляет новую дорожку субтитров из файла WebVTT.
    videoFrame.getCaptionTracks().add("English", "track.vtt");

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

Интерфейс ICaptionsCollection также предоставляет перегрузку, позволяющую добавить субтитры из потока.

Извлечение субтитров из кадра видео

Чтобы извлечь субтитры из видеокадра:

  1. Загрузите презентацию, содержащую видео.
  2. Найдите целевой объект IVideoFrame.
  3. Пройдитесь по дорожкам субтитров, возвращаемым методом getCaptionTracks.
  4. Сохраните каждую дорожку в файл с расширением .vtt.

Следующий код показывает, как извлечь субтитры из видеокадра:

Presentation presentation = new Presentation("video_with_captions.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    for (IShape shape : slide.getShapes()) {
        if (shape instanceof IVideoFrame) {
            IVideoFrame videoFrame = (IVideoFrame) shape;
            for (ICaptions captionTrack : videoFrame.getCaptionTracks()) {
                // Сохраняет дорожку субтитров в файл WebVTT.
                FileOutputStream outputStream = new FileOutputStream(captionTrack.getCaptionId() + ".vtt");
                outputStream.write(captionTrack.getBinaryData());
                outputStream.close();
            }
        }
    }
} finally {
    presentation.dispose();
}

Каждый объект ICaptions раскрывает идентификатор субтитров, метку, бинарные данные и текст субтитров в виде строки UTF‑8.

Удаление субтитров из кадра видео

Чтобы удалить субтитры из видеокадра:

  1. Загрузите презентацию, содержащую видео.
  2. Получите целевой объект IVideoFrame.
  3. Удалите дорожки субтитров из коллекции, возвращаемой методом getCaptionTracks.
  4. Сохраните изменённую презентацию.

Следующий код показывает, как удалить все субтитры из видеокадра:

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 позволяет извлекать видео, встроенное в презентации.

  1. Создайте экземпляр класса Presentation для загрузки презентации, содержащей видео.
  2. Пройдитесь по всем объектам ISlide.
  3. Пройдитесь по всем объектам IShape в поиске VideoFrame.
  4. Сохраните видео на диск.

Этот Java‑код показывает, как извлечь видео со слайда презентации:

// Создаёт объект Presentation, представляющий файл презентации 
Presentation pres = new Presentation("VideoSample.pptx");
try {
    for (ISlide slide : pres.getSlides()) 
    {
        for (IShape shape : slide.getShapes()) 
        {
            if (shape instanceof VideoFrame) 
            {
                IVideoFrame vf = (IVideoFrame) shape;
                String type = vf.getEmbeddedVideo().getContentType();
                int ss = type.lastIndexOf('-');
                byte[] buffer = vf.getEmbeddedVideo().getBinaryData();

                // Получает расширение файла
                int charIndex = type.indexOf("/");
                type = type.substring(charIndex + 1);

                FileOutputStream fop = new FileOutputStream("testing2." + type);
                fop.write(buffer);
                fop.flush();
                fop.close();
            }
        }
    }
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

FAQ

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

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

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

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

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

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

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

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