Водяные знаки — это распространенный способ маркировки цифрового контента. Это позволяет брендам и создателям добавлять брендинг к своему контенту. Особенно в эту эпоху гиперсвязей, когда видео распространяются в мгновение ока, важно, чтобы бренды могли легко добавлять брендинг в свою работу.

Конечно, вы можете использовать доступные видеоредакторы или веб-приложения. Они, безусловно, просты и легко добавляют водяные знаки к одному или нескольким видео. Но что, если вам нужно поставить водяной знак на тысячи видео? Более того, что, если вы сможете создать приложение, позволяющее пользователям ставить водяные знаки на видео?

Это то, чему этот учебник призван научить — создать программу с использованием Python для автоматического добавления водяных знаков к видео. В конце концов, разработчики Python любят автоматизацию, не так ли?

Этот учебник состоит из двух частей:

  1. водяной знак на одном видео
  2. добавление водяных знаков на несколько видео с использованием списка

API и SDK Shotstack

Shotstack предоставляет облачный API для редактирования видео. Рендеринг видео требует больших ресурсов, и на редактирование и создание видео в масштабе могут уйти часы. Инфраструктура рендеринга Shotstack позволяет создавать и масштабировать мультимедийные приложения за дни, а не месяцы.

В этом руководстве мы также будем использовать Shotstack SDK для редактирования видео на Python. Для SDK требуется Python 3.

Установите и настройте Shotstack SDK

Если вы хотите пропустить этот шаг, вы можете найти исходный код этого руководства в нашем репозитории GitHub. В противном случае выполните следующие действия, чтобы установить зависимости и настроить ключ API.

Прежде всего, установите Shotstack Python SDK из командной строки:

pip install shotstack_sdk

Возможно, вам придется использовать pip3 в зависимости от того, как настроена ваша среда.

Затем установите ключ API в качестве переменной среды (Linux/Mac):

export SHOTSTACK_KEY=your_key_here

или, если вы используете Windows (не забудьте добавить SHOTSTACK_KEY к пути):

set SHOTSTACK_KEY=your_key_here

Замените your_key_here предоставленным ключом API песочницы, который можно бесплатно использовать для тестирования и разработки.

Создайте скрипт Python для водяного знака на видео

Создайте файл для сценария в вашей любимой среде IDE или текстовом редакторе. Вы можете называть его как угодно, но для этого урока мы создали файл с именем watermark-video.py. Откройте файл и начните редактирование.

Импортируйте необходимые модули

Давайте импортируем необходимые модули для проекта. Нам нужно импортировать модули из Shotstack SDK для редактирования и рендеринга нашего видео, а также пару встроенных модулей:

import shotstack_sdk as shotstack
import os
import sys
from shotstack_sdk.model.clip import Clip
from shotstack_sdk.api import edit_api
from shotstack_sdk.model.track import Track
from shotstack_sdk.model.timeline import Timeline
from shotstack_sdk.model.output import Output
from shotstack_sdk.model.edit import Edit
from shotstack_sdk.model.video_asset import VideoAsset

Настройка клиента API

Затем добавьте следующее, которое настраивает клиент API с URL-адресом и ключом API, это должно использовать ключ API, добавленный к вашим переменным среды. Если вы хотите, вы можете жестко закодировать ключ API здесь, но мы рекомендуем использовать переменные среды.

host = "https://api.shotstack.io/stage"
configuration = shotstack.Configuration(host = host)
configuration.api_key['DeveloperKey'] = os.getenv('SHOTSTACK_KEY')
with shotstack.ApiClient(configuration) as api_client:
    api_instance = edit_api.EditApi(api_client)

Понимание архитектуры временной шкалы

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

Настройка видеоклипа

Видео должно быть размещено в Интернете и доступно через общедоступный или подписанный URL-адрес. Мы будем использовать следующие 10-секундные кадры с дрона в качестве нашего видеоматериала. Вы можете заменить его собственным URL-адресом видео из любого онлайн-источника.

Добавьте следующий код, чтобы создать VideoAsset с помощью URL-адреса видео:

video_asset = VideoAsset(
    src = "https://d1uej6xx5jo4cd.cloudfront.net/sydney.mp4"
)

Затем создайте файл Clip. Клип — это контейнер для различных типов ассетов, в том числе VideoAsset. Мы можем настроить различные свойства, такие как длина (продолжительность воспроизведения) и время начала (когда на временной шкале будет воспроизводиться клип). Для нашего клипа мы используем только что созданный video_asset, начало 0 секунд и длину 10 секунд:

video_clip = Clip(
    asset = video_asset,
    start = 0.0,
    length = 10.0
)

Настройка клипа изображения

Далее нам нужно добавить изображение, которое будет водяным знаком на видео. Мы будем использовать прикрепленный логотип. Вы можете заменить его собственным URL-адресом изображения.

Аналогично настройке давайте добавим ImageAsset, добавив следующий код.

image_asset = ImageAsset(
    src = "https://shotstack-assets.s3-ap-southeast-2.amazonaws.com/logos/real-estate-black.png"
)

Давайте настроим свойства клипа, включая ImageAsset. Мы настроим длину, время начала, позицию (положение ImageAsset в области просмотра), масштаб (размер актива относительно размера области просмотра) и непрозрачность (прозрачность актива). Посетите документацию clip, чтобы узнать больше о свойствах клипа.

image_clip = Clip(
    asset = image_asset,
    start = 0.0,
    length = 10.0,
    scale = 0.25,
    position = 'bottomRight',
    opacity = 0.3
)

Добавление видеоклипа на временную шкалу

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

Давайте добавим image_clip к track_1 и video_clip к track_2, добавив следующий скрипт.

track_1 = Track(clips=[image_clip])
track_2 = Track(clips=[video_clip])

Далее давайте добавим обе дорожки на нашу временную шкалу. Убедитесь, что они упорядочены последовательно в зависимости от того, как они расположены. Если трек состоит из image_clip, он стоит вторым в списке, то он не будет отображаться на видео, так как останется позади video_clip.

timeline = Timeline(
    background = "#000000",
    tracks = [track_1, track_2]
    )

Настройка окончательного редактирования и вывода

Далее нам нужно настроить наш [выход] (shotstack.io/docs/api/#tocs_output). Мы устанавливаем выход format на mp4. Давайте установим разрешение видео на hd, что создаст видео 1280 x 720 пикселей при 25 кадрах в секунду. Вы также можете настроить другие свойства, такие как thumbnail создание эскиза из определенной точки на временной шкале, destinations установка мест назначения для экспорта и многое другое.

output = Output(
    format = "mp4",
    resolution = "hd"
)
edit = Edit(
    timeline = timeline,
    output   = output
)

Отправка правки на отрисовку через API

Наконец, мы отправляем редактирование на обработку и рендеринг с помощью API. SDK Shotstack позаботится о преобразовании наших объектов в JSON, добавлении нашего ключа в заголовок запроса и отправке всего в API.

try:
    api_response = api_instance.post_render(edit)
    message = api_response['response']['message']
    id = api_response['response']['id']
    print(f"{message}\n")
    print(f">> render id: {id}")
except Exception as e:
    print(f"Unable to resolve API call: {e}")

Окончательный сценарий

Окончательный сценарий приведен ниже с несколькими дополнительными проверками и противовесами:

import shotstack_sdk as shotstack
import os
import sys
from shotstack_sdk.api import edit_api
from shotstack_sdk.model.clip import Clip
from shotstack_sdk.model.track import Track
from shotstack_sdk.model.timeline import Timeline
from shotstack_sdk.model.output import Output
from shotstack_sdk.model.edit import Edit
from shotstack_sdk.model.video_asset import VideoAsset
from shotstack_sdk.model.image_asset import ImageAsset
if __name__ == "__main__":
    host = "https://api.shotstack.io/stage"
    configuration = shotstack.Configuration(host = host)
    configuration.api_key['DeveloperKey'] = os.getenv("SHOTSTACK_KEY")
    with shotstack.ApiClient(configuration) as api_client:
        api_instance = edit_api.EditApi(api_client)
        video_asset = VideoAsset(
        src = "https://d1uej6xx5jo4cd.cloudfront.net/sydney.mp4"
        )
        video_clip = Clip(
            asset = video_asset,
            start = 0.0,
            length= 10.0
        )
        image_asset = ImageAsset(
        src = "https://shotstack-assets.s3-ap-southeast-2.amazonaws.com/logos/real-estate-black.png"
        )
        image_clip = Clip(
            asset = image_asset,
            start = 0.0,
            length = 10.0,
            scale = 0.25,
            position = 'bottomRight',
            opacity = 0.3
        )
        track_1 = Track(clips=[image_clip])
        track_2 = Track(clips=[video_clip])
        timeline = Timeline(
            background = "#000000",
            tracks     = [track_1, track_2]
        )
        output = Output(
            format      = "mp4",
            resolution  = "hd"
        )
        edit = Edit(
            timeline = timeline,
            output   = output
        )
        try:
            api_response = api_instance.post_render(edit)
            message = api_response['response']['message']
            id = api_response['response']['id']
            print(f"{message}\n")
            print(f">> render id: {id}")
        except Exception as e:
            print(f"Unable to resolve API call: {e}")

Запуск скрипта

Используйте команду python для запуска скрипта.

python watermark-video.py

Возможно, вам придется использовать python3 вместо python в зависимости от вашей конфигурации.

Если запрос рендеринга выполнен успешно, API вернет идентификатор рендеринга, который мы можем использовать для получения статуса рендеринга.

Проверка состояния рендеринга и выходного URL

Чтобы проверить статус, нам нужен другой скрипт, который будет вызывать API для отображения конечной точки статуса. Создайте файл с именем status.py и вставьте следующий код:

import sys
import os
import shotstack_sdk as shotstack
from shotstack_sdk.api import edit_api
if __name__ == "__main__":
    host = "https://api.shotstack.io/stage"
    configuration = shotstack.Configuration(host = host)
    configuration.api_key['DeveloperKey'] = os.getenv("SHOTSTACK_KEY")
    with shotstack.ApiClient(configuration) as api_client:
        api_instance = edit_api.EditApi(api_client)
        api_response = api_instance.get_render(sys.argv[1], data=False, merged=True)
        status = api_response['response']['status']
        print(f"Status: {status}")
        if status == "done":
            url = api_response['response']['url']
            print(f">> Asset URL: {url}")

Затем запустите скрипт с помощью командной строки:

python status.py {renderId}

Замените {renderId} на идентификатор, возвращаемый скриптом watermark-video.py. Повторно запускайте скрипт status.py каждые 4-5 секунд, пока статус не будет выполнен и не будет возвращен URL-адрес. Если что-то пойдет не так, статус будет отображаться как сбой. Если все прошло успешно, теперь у вас должен быть URL-адрес финального видео, точно такой же, как в начале руководства.

Пример видео с водяным знаком

Мы можем увидеть видео с водяными знаками ниже:

Доступ к обработанным видео с помощью панели управления

Вы можете просмотреть обработанные видео на панели инструментов Shotstack в разделе Рендеры. Видео удаляются через 24 часа, и их необходимо перенести в собственное хранилище. Однако все файлы копируются на хостинг Shotstack, и вы можете настроить другие места назначения, включая S3 и Mux.

Добавление водяных знаков на несколько видео

Как вы можете видеть, как легко поставить водяной знак на видео с помощью Shotstack Python SDK. Однако большое преимущество использования Shotstack API заключается в том, насколько легко мы можем масштабироваться без необходимости создавать и управлять инфраструктурой рендеринга.

Чтобы продемонстрировать масштабируемость, мы пометим следующий список видео тем же логотипом, который мы использовали выше. Вы также можете использовать другие ресурсы данных, такие как CSV и другие приложения, интегрирующиеся с их API.

video_links = [
    'https://d1uej6xx5jo4cd.cloudfront.net/slideshow-with-audio.mp4',
    'https://cdn.shotstack.io/au/v1/msgtwx8iw6/d724e03c-1c4f-4ffa-805a-a47aab70a28f.mp4',
    'https://cdn.shotstack.io/au/v1/msgtwx8iw6/b03c7b50-07f3-4463-992b-f5241ea15c18.mp4',
    'https://cdn.shotstack.io/au/stage/c9npc4w5c4/d2552fc9-f05a-4e89-9749-a87d9a1ae9aa.mp4',
    'https://cdn.shotstack.io/au/v1/msgtwx8iw6/c900a02f-e008-4c37-969f-7c9578279100.mp4'
]

Следующий скрипт добавляет водяные знаки к списку видео. Если вы хотите протестировать его, создайте новый файл с именем watermark-videos.py, вставьте сценарий и сохраните его.

import shotstack_sdk as shotstack
import os
import sys
from shotstack_sdk.api import edit_api
from shotstack_sdk.model.clip import Clip
from shotstack_sdk.model.track import Track
from shotstack_sdk.model.timeline import Timeline
from shotstack_sdk.model.output import Output
from shotstack_sdk.model.edit import Edit
from shotstack_sdk.model.video_asset import VideoAsset
from shotstack_sdk.model.image_asset import ImageAsset
if __name__ == "__main__":
    host = "https://api.shotstack.io/stage"
    configuration = shotstack.Configuration(host = host)
    configuration.api_key['DeveloperKey'] = os.getenv("SHOTSTACK_KEY")
    video_links = ['https://d1uej6xx5jo4cd.cloudfront.net/slideshow-with-audio.mp4',
        'https://cdn.shotstack.io/au/v1/msgtwx8iw6/d724e03c-1c4f-4ffa-805a-a47aab70a28f.mp4',
        'https://cdn.shotstack.io/au/v1/msgtwx8iw6/b03c7b50-07f3-4463-992b-f5241ea15c18.mp4',
        'https://cdn.shotstack.io/au/stage/c9npc4w5c4/d2552fc9-f05a-4e89-9749-a87d9a1ae9aa.mp4',
        'https://cdn.shotstack.io/au/v1/msgtwx8iw6/c900a02f-e008-4c37-969f-7c9578279100.mp4'
    ]
    with shotstack.ApiClient(configuration) as api_client:
        for link in video_links:
            api_instance = edit_api.EditApi(api_client)
            video_asset = VideoAsset(
            src = link
            )
            video_clip = Clip(
                asset = video_asset,
                start = 0.0,
                length= 10.0
            )
            image_asset = ImageAsset(
                src = "https://shotstack-assets.s3-ap-southeast-2.amazonaws.com/logos/real-estate-black.png"
            )
            image_clip = Clip(
                asset = image_asset,
                start = 0.0,
                length = 10.0,
                scale = 0.25,
                position = 'bottomRight',
                opacity = 0.3
            )
            track_1 = Track(clips=[image_clip])
            track_2 = Track(clips=[video_clip])
            timeline = Timeline(
                background = "#000000",
                tracks     = [track_1, track_2]
            )
            output = Output(
                format      = "mp4",
                resolution  = "hd"
            )
            edit = Edit(
                timeline = timeline,
                output   = output
            )
            try:
                api_response = api_instance.post_render(edit)
                message = api_response['response']['message']
                id = api_response['response']['id']
                print(f"{message}\n")
                print(f">> render id: {id}")
            except Exception as e:
                print(f"Unable to resolve API call: {e}")

Затем используйте команду python для запуска скрипта.

python watermark-videos.py

Чтобы проверить состояние рендеринга, запустите status.py файл, который мы создали в первой части, и запустите его с помощью командной строки:

python status.py {renderId}

Замените renderId из идентификаторов, возвращенных из watermark-videos.py.

Последние мысли

Этот учебник должен был дать вам общее представление о том, как программно редактировать и создавать видео с помощью Python и API редактирования видео Shotstack. В качестве следующего шага вы можете научиться добавлять другие активы, такие как текст и изображения, для создания простого мультимедийного приложения. Это просто вводное руководство по программной работе с мультимедиа, но мы можем сделать гораздо больше. Мы можем использовать это для многих случаев использования, таких как

Вы можете ознакомиться с другими нашими [руководствами по Python] (shotstack.io/learn/how-to) и видео на YouTube, чтобы быстрее изучать программные медиа и создавать видеоприложения.