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

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

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

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

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


API и SDK Shotstack

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

Мы также будем использовать Shotstack видеомонтаж Python SDK для этого
руководство. Для 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 или текстовом редакторе. Вы можете называть его как хотите, но для этого урока мы создали файл с именем водяной знак-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 = "
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 = "
)
Войти в полноэкранный режим

Выйти из полноэкранного режима

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

video_clip = Clip(
    asset = video_asset,
    start = 0.0,
    length = 10.0
)
Войти в полноэкранный режим

Выйти из полноэкранного режима


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

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

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

image_asset = ImageAsset(
    src = "
)
Войти в полноэкранный режим

Выйти из полноэкранного режима

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

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]
    )
Войти в полноэкранный режим

Выйти из полноэкранного режима


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

Далее нам нужно настроить наш выход. Мы устанавливаем выход format к mp4. Давайте установим разрешение видео на hd который генерирует видео размером 1280 x 720 пикселей при 25 кадрах в секунду. Вы также можете настроить другие свойства, такие как repeat для автоповтора, используемого в гифках, 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 = "

    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 = "
        )

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

        image_asset = ImageAsset(
        src = "
        )

        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 для отображения конечной точки статуса. Создайте файл с именем
статус.py и вставьте следующий код:

import sys
import os
import shotstack_sdk as shotstack

from shotstack_sdk.api import edit_api

if __name__ == "__main__":
    host = "
    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} с идентификатором, возвращенным из водяной знак-video.py сценарий. Перезапускайте скрипт status.py каждые 4-5
секунд, пока статус не Выполнено и возвращается URL. Если что-то пойдет не так, статус будет отображаться как не удалось.
Если все прошло успешно, теперь у вас должен быть URL конечного видео, точно такой же, как в начале
руководство.


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

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


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

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

Панель инструментов Shotstack


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

Как вы можете видеть, как легко поставить водяной знак на видео с помощью 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',
    '
]
Войти в полноэкранный режим

Выйти из полноэкранного режима

Следующий скрипт добавляет водяные знаки к списку видео. Если вы хотите проверить это, создайте новый файл с именем
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 = "

    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',
        '
    ]

    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 = "
            )

            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 а также YouTube видео чтобы быстрее изучать программные медиа и создавать видеоприложения.