Управление видеокадрами в презентациях с использованием Python
Введение
Хорошо размещённое видео в презентации может сделать ваше сообщение более убедительным и повысить уровень вовлечённости аудитории.
PowerPoint позволяет добавить видео на слайд в презентации двумя способами:
- Добавить или встроить локальное видео (хранящееся на вашем компьютере)
- Добавить онлайн‑видео (из веб‑источника, например YouTube).
Чтобы добавить видео (объекты video) в презентацию, Aspose.Slides предоставляет класс Video , класс VideoFrame и другие соответствующие типы.
Создание встроенных видеокадров
Если видеофайл, который вы хотите добавить на слайд, хранится локально, вы можете создать видеокадр для встраивания видео в презентацию.
- Создайте экземпляр класса Presentation .
- Получите ссылку на слайд по его индексу.
- Добавьте объект Video и передайте данные видеофайла, чтобы встроить видео в презентацию.
- Добавьте объект VideoFrame , чтобы создать кадр для видео.
- Сохраните изменённую презентацию.
Этот код на 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), вы можете добавить его в презентацию по веб‑ссылке.
- Создайте экземпляр класса Presentation .
- Получите ссылку на слайд по его индексу.
- Добавьте объект VideoFrame , передав ссылку на видео.
- Установите миниатюру для видеокадра.
- Сохраните презентацию.
Этот код на 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 . Оба значения указываются в миллисекундах и определяют, сколько времени пропустить в начале и в конце видео соответственно. Эти настройки изменяют параметры воспроизведения видео в презентации; они не обрезают и не изменяют бинарные данные встроенного видео.
Установка параметров обрезки
Чтобы создать видеокадр и задать параметры обрезки:
- Создайте экземпляр класса Presentation .
- Добавьте объект Video в презентацию.
- Добавьте объект VideoFrame на слайд.
- Задайте значения trim-from-start и trim-from-end с помощью VideoFrame.setTrimFromStart и VideoFrame.setTrimFromEnd .
- Сохраните изменённую презентацию.
Следующий пример кода пропускает первые 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 .
Добавление субтитров к видеокадру
- Создайте экземпляр класса Presentation .
- Добавьте видео в презентацию.
- Добавьте объект VideoFrame на слайд.
- Используйте объект CaptionsCollection , возвращаемый методом getCaptionTracks , чтобы добавить дорожку субтитров WebVTT.
- Сохраните изменённую презентацию.
Следующий код показывает, как добавить субтитры к видеокадру:
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 также предоставляет перегрузку, позволяющую добавить субтитры из потока.
Извлечение субтитров из видеокадра
- Загрузите презентацию, содержащую видео.
- Найдите целевой объект VideoFrame .
- Пройдите по дорожкам субтитров в CaptionsCollection .
- Сохраните каждую дорожку субтитров в файл с расширением
.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.
Удаление субтитров из видеокадра
- Загрузите презентацию, содержащую видео.
- Получите целевой объект VideoFrame .
- Удалите дорожки субтитров из CaptionsCollection .
- Сохраните изменённую презентацию.
Следующий код показывает, как удалить все субтитры из видеокадра:
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 позволяет извлекать видео, встроенное в презентации.
- Создайте экземпляр класса Presentation для загрузки презентации, содержащей видео.
- Пройдите по всем объектам Slide .
- Пройдите по всем объектам Shape , чтобы найти VideoFrame .
- Сохраните видео на диск.
Этот код на 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()
FAQ
Какие параметры воспроизведения видео можно изменить для VideoFrame?
Вы можете управлять режимом воспроизведения (авто или по щелчку) и цикличностью. Эти параметры доступны через свойства объекта VideoFrame .
Влияет ли добавление видео на размер файла PPTX?
Да. При встраивании локального видео его бинарные данные включаются в документ, поэтому размер презентации растёт пропорционально размеру файла. При добавлении онлайн‑видео в презентацию встраиваются только ссылка и миниатюра, поэтому увеличение размера значительно меньше.
Можно ли заменить видео в существующем VideoFrame, не меняя его позицию и размер?
Да. Вы можете заменить видеоконтент внутри кадра, сохранив геометрию фигуры; это типичный сценарий обновления медиа в уже существующей разметке.
Можно ли определить тип содержимого (MIME) встроенного видео?
Да. Встроенное видео имеет тип содержимого, который можно считать и использовать, например, при сохранении его на диск.