Практическое руководство: добавление (в реальном времени)
Практическое руководство: добавление (в реальном времени)
Введение
Опираясь на общие знания о добавлении, рассмотрим добавление ресурсов в режиме реального времени по мере их создания. Данный подход позволяет добавлять файлы во время записи, рендеринга или потоковой передачи до того, как их окончательный размер станет известен.
API-интерфейс добавления в режиме реального времени позволяет воспроизводить ресурсы в Frame.io всего через несколько секунд после завершения записи, что значительно повышает эффективность технологического процесса.
Демонстрационное видео
Краткий обзор этой функции есть в демонстрационном видео. В видео показано добавление рендера из Adobe Media Encoder в режиме реального времени, при этом видео можно воспроизвести в Frame.io всего через 5 секунд после завершения рендеринга.
Требования
Если вы еще не сделали этого, прочитайте руководство Реализация C2C: настройка. Вам понадобится access_token, полученный в процессе аутентификации и авторизации. Мы будем использовать в наших примерах тот же тестовый ресурс из руководства по базовому добавлению. Рекомендуем ознакомиться с руководством по базовому добавлению, поскольку мы будем использовать понятия и принципы, которые там объясняются.
Создание ресурса в режиме реального времени
Добавления в режиме реального времени начинаются с создания измененного ресурса. При создании ресурса установите для параметра is_realtime_upload значение true и не указывайте параметр filesize (или установите для него значение null), поскольку окончательный размер во время создания неизвестен:
Спецификация конечной точки API-интерфейса
Документацию для /v2/devices/assets можно найти здесь.
Расширение и имя файла
Для ресурсов в режиме реального времени требуется расширение файла. Если при создании ресурса имя файла неизвестно, можно использовать поле extension (формат: '.mp4'). Рекомендуем этот способ, если вы планируете обновить название ресурса позже.
Ответ для ресурсов в режиме реального времени упрощен по сравнению со стандартным созданием ресурса:
Обратите внимание, что upload_urls отсутствует — для добавлений в режиме реального времени мы будем создавать URL-адреса добавления по требованию по мере создания файла.
Запрос URL-адресов добавления
Запрашиваем URL-адрес для первой половины нашего файла (10 568 125 байт), используя asset_id из предыдущего ответа:
Спецификация конечной точки API-интерфейса
Документацию для /v2/devices/assets/{asset_id}/realtime_upload/parts можно найти здесь.
Описание параметров запроса:
-
parts: список фрагментов добавления, для которых нужны URL. Запрос нескольких URL в одном вызове повышает эффективность. -
number: порядковый номер фрагмента, начиная с 1. Номера можно пропускать, а фрагменты добавлять в любом порядке, но собираться они будут последовательно. Не может превышать 10 000 (ограничение AWS). *size: размер фрагмента в байтах. Должен соответствовать ограничениям многочастного добавления AWS. *is_final: указывает, является ли этот фрагмент последним фрагментом файла.
Ответ содержит запрашиваемые URL добавления:
Список upload_urls напрямую соответствует порядку запроса parts.
Теперь добавьте первый фрагмент, как описано в руководстве по базовому добавлению:
Затем запросите URL для второго и последнего фрагмента:
Обратите внимание на важные дополнения:
- для параметра
is_finalустановлено значениеtrueдля последнего фрагмента, которое показывает, что после этого добавление будет завершено; asset_filesizeуказывает общий размер файла. Эта информация требуется, когда любой фрагмент имеет параметрis_final: true.
После получения URL-адреса в ответе:
Добавьте последний фрагмент:
Обработка последнего фрагмента
Когда последний фрагмент добавлен, Frame.io начинает сборку полного файла. Этот процесс включает 60-секундный резервный период для завершения добавления любых оставшихся фрагментов. Рекомендуем добавлять последний фрагмент только после успешного добавления всех остальных фрагментов.
Вот и все! Перейдя на Frame.io, вы увидите успешно добавленный ресурс в реальном времени. 🎉
Управление именами ресурсов
Если при создании ресурса имя файла неизвестно, вы можете использовать поле расширение без имени:
Система назначит имя по умолчанию:
Вы можете обновить это имя, включив поле asset_name при запросе URL-адресов для добавления:
Имя будет обновлено только в том случае, если ресурс все еще использует имя, присвоенное по умолчанию; если он был переименован в интерфейсе Frame.io или имя уже было изменено, запрос будет проигнорирован.
Оптимизация запросов URL
Для повышения эффективности запрашивайте URL-адреса для всех фрагментов, для которых у вас есть доступные данные, сразу, а не по отдельности. Это особенно важно для больших файлов, где скорость добавления может отставать от создания данных.
Обработка заголовков медиафайлов
Некоторые медиаформаты требуют заголовка в начале файла, которые записываются только после завершения всего файла. Это создает проблему, когда заголовок меньше минимального размера фрагмента AWS в 5 МиБ (5 242 880 байт).
Что мы рекомендуем:
- Зарезервируйте первые 5 242 880 байт медиаданных без добавления.
- Начинайте добавление фрагментов с
part_number=2. - Когда файл будет завершен, добавьте шапку к зарезервированным данным.
- Запросите URL для
part_number=1и добавьте этот объединенный фрагмент.
Это гарантирует, что первый фрагмент будет соответствовать требованиям к минимальному размеру, и при этом сохранится правильная структура файла.
Масштабирование размера фрагментов для оптимизации производительности
AWS устанавливает ограничения, которые влияют на стратегию добавления:
- максимальный размер файла: 5 ТиБ (5 497 558 138 880 байт);
- максимальное количество фрагментов: 10 000;
- минимальный размер фрагмента: 5 МиБ (5 242 880 байт).
Фиксированный размер фрагмента накладывает ограничения:
- если все 10 000 фрагментов имеют минимальный размер (5 МиБ), общий размер файла будет не больше ~52,4 ГБ
- При равномерном распределении файла максимального размера блоки будут иметь размер ~550 МБ — слишком большой для эффективной потоковой передачи файлов меньшего размера.
Нам нужно сбалансировать эти ограничения: с одной стороны, обеспечить небольшие фрагменты для гибкого добавления, с другой — гарантировать, что при необходимости мы сможем обработать очень большие файлы.
Рекомендуемая формула размера фрагмента
Вот предлагаемый подход в Python:
… где part_number имеет значение от 1 до 10_000 включительно, а format_bytes_per_second — это ожидаемое среднее количество байтов, которое ваш файл должен потреблять в секунду. О том, как была получена формула, — ниже.
Значение переменной scalar
Переменная scalar и расчет могут показаться немного запутанными на первый взгляд, но это математический инструмент, который гарантирует, что, независимо от значения, которое мы используем для format_bytes_per_second, если мы введем в функцию все допустимые значения part_number от 1 до 10_0000, то получим набор значений, общая сумма которых составит точно наш лимит размера файла 5 ТиБ — настолько точно, насколько это возможно. Ниже мы показываем, как мы пришли к этой формуле.
Округление до меньшего
Используя округление до меньшего, мы оставляем некоторые байты неиспользованными, но гарантируем, что обычное округление более 10 000 фрагментов не приведет случайно к превышению максимально допустимого размера файла. В худшем случае 10 000 байтов, то есть 10 КБ, останутся неиспользованными — это приемлемый компромисс.
Важные характеристики этой формулы:
- при добавлении 10 000 фрагментов общий объем загружаемых данных будет отличаться от предельного размера файла (5 ТиБ) максимум на 10 КБ;
- оптимизация за счет размещения меньших, более эффективных полезных нагрузок в начале для улучшения отклика при добавлении коротких и средних клипов;
- у очень длинных клипов время между окончанием записи файла и возможностью его воспроизведения будет больше.
Недостатки третьего пункта компенсируются вторым пунктом и тем, что большинство клипов не достигнет размера, при котором третий пункт сыграет свою роль. Мы обеспечиваем быстрый отклик для БОЛЬШИНСТВА, соглашаясь на медленный отклик для очень немногих.
Более продвинутая и эффективная версия нашей формулы (которая создает анонимную функцию part_size_calculator с предварительно вычисленными и встроенными статическими скалярными значениями и скоростью данных) может выглядеть так:
Как работает формула.
Рассмотрим результаты вычислений, полученных с помощью приведенной выше формулы, для нескольких распространенных типов файлов.
Пример 1: веб-формат
Для форматов, воспроизводимых в веб-среде, со скоростью не более ~5,3 МБ/с (большинство файлов H.264/H.265/HEVC) мы получим следующую прогрессию размера полезной нагрузки:
Эти значения хорошо сбалансированы для добавления в режиме реального времени, особенно для кодеков веб-воспроизведения, таких как H.264; большинство будет менее 10,7 ГБ и поэтому потребует не более 1000 фрагментов. Ожидается, что размер полезной нагрузки никогда не превысит 21,6 МБ.
Если мы обработаем даже половину наших фрагментов, размер полезной нагрузки все равно никогда не превысит 413,5 МБ. Общий размер добавления составит 707 ГБ, что более чем достаточно для подавляющего большинства веб-файлов.
Только когда разрешенное количество фрагментов начинает заканчиваться, размер файла будет увеличиваться. Однако он никогда не превышает 1,7 ГБ, что значительно ниже лимита AWS в 5 ГиБ на часть.
Пример 2. Prores 422 LT Prores 422 LT имеет скорость передачи данных 102 Мбит/с и создает следующую таблицу:
В этой таблице показаны полезные свойства по сравнению с нашей формулой, оптимизированной для веб-среды. В первых 1000 фрагментах мы можем добавить на 8 ГБ больше файлов. Большие полезные нагрузки в начале означают, что нам не нужно будет слишком быстро запрашивать URL-адреса в начале. В результате добавление идет эффективнее при более высокой скорости передачи данных. Размер полезной нагрузки в конце процесса добавления остается большим.
Пример 2. Camera Raw
Теперь попробуем формат RAW со скоростью передачи данных 280 МБ/с. При такой быстрой передаче данных попытка добавления фрагментами по 5 МиБ в начале просто не имеет смысла.
Ранние полезные нагрузки не только более эффективны, но и позволяют сэкономить более половины гигабайта ближе к концу, так что эти сетевые вызовы менее восприимчивы к перебоям в работе сети.
Какую работу мы проделали
Прежде чем собрать все это вместе в примере средства добавления, мы хотим продемонстрировать, как мы получили эту формулу.
Нам нужна была формула, которая откладывала бы большие, более тяжелые полезные нагрузки на более поздние разрешенные фрагменты — до которых в большинстве добавлений дело не дойдет, — а более легкие и эффективные полезные нагрузки размещала бы в начале, где каждое добавление имеет преимущество. В то же время нужно было гарантировать, что алгоритм попадет в диапазон ограничений размера файла (5 ТиБ) точно на фрагменте номер 10 000.
На этом этапе в игру вступил математический анализ.
Чтобы график рос экспоненциально, формула должна выглядеть примерно так:
… где n — номер фрагмента. Кроме того, нужно, чтобы каждый фрагмент равнялся как минимум скорости передачи данных для нашей формулы, которую мы обозначим r:
Теперь нам нужно найти формулу, которая может дать нам сумму этой формулы для первых 10 000 натуральных чисел (1, 2, 3, …). Символ сигма Σ обозначает суммирование. Добавим его к нашей формуле:
… и переопределим n как ряд натуральных чисел от 1 до 10 000 включительно. Это равенство пока не слишком полезно. Интуитивно оно выглядит правильно, но, если задать n=10,000 и r=5,242,880, как нам нужно, оно просто выдает результат: 385,812,135,000 (385 ГБ). Результат не только намного ниже нашего ограничения размера файла в 5 ТиБ — нет ни одного способа изменить формулу, чтобы получить этот результат.
Попробуем ввести регулятор для настройки:
… где x — скалярное значение, которое можно вычислить, чтобы получить 5 ТиБ в качестве результата. Теперь можно приравнять равенство к нашему ограничению размера файла и вычислить x:
Часто суммирование выполняется итеративно, как в цикле for или while. Но оказывается, у нас есть прекрасная формула: известный способ легко вычислить сумму квадратов первых n натуральных чисел:
Преобразование в полином упрощает вид:
Переменные x и r можно добавить к обеим сторонам:
Наконец, приравниваем нашу новую формулу к 5 ТиБ:
Теперь нам нужно решить ее для x, установив n=10,000 (общее количество фрагментов). Это даст возможность вычислить статический скаляр для заданной скорости передачи данных. Вместо того, чтобы решать вручную, подставим это в Wolfram Alpha:
Это уже кое-что! Если бы скорость передачи данных была равна минимальному размеру фрагмента (5 МиБ), мы бы получили статическое скалярное значение:
В компьютерном мире это представляет значение float64, равное 16.33293799427617. Наша формула для определения размера фрагмента ти в этом случае будет такой:
Где s — размер фрагмента.
Но остается еще одна проблема. В реальном мире не может быть полезной нагрузки с нецелыми байтами. Нам нужно округлить каждое значение. Мы будем использовать Python и округлим вниз:
Мы пришли к конкретному примеру исходной функции, приведенной в этом руководстве.
Создание базового средства добавления
Рассмотрим простой псевдокод в стиле Python для добавления файла, отображаемого в реальном времени, используя все, что мы изучили в этом руководстве:
Расширенное добавление
Приведенный выше код демонстрирует только базовый процесс добавления файла в реальном времени. На самом деле эту логику нужно будет дополнить обработкой ошибок и способами расширенного добавления.
Далее
Добавления в реальном времени позволяют максимально сократить отклик вашей интеграции — ресурсы можно воспроизвести в Frame.io через несколько секунд после завершения записи. В другом руководстве рассматриваются способы расширенного добавления и требования к нему. Хотя оно написано для базовых добавлений, основная часть руководства применима и к добавлениям в реальном времени.
Если вы еще этого не сделали, рекомендуем связаться с нашей командой, а затем перейти к следующему руководству. Надеемся на скорую обратную связь!