Contest

Contest

Vyacheslav Krylov

Задача конкурса — создать универсальную библиотеку для высокоскоростной обработки видео файлов на Android.

Требования

  1. Минимальная версия Android: 6.0. Поддержка более старых версий (до 4.1 включительно) будет оцениваться, но не является обязательной.
  2. Если сборка нативного кода не связана со сборкой проекта, должна быть описана подробная инструкция по воспроизведению *.so файлов.
  3. Библиотека должна использовать последнюю версию SDK Build Tools, NDK и compileSdkVersion на момент отправки работы.
  4. Использование сторонних библиотек для обработки видео и исходных кодов клиентов Telegram запрещено, но вы можете использовать их для исследований.
  5. Использование и встраивание технологий с GPL лицензией для достижения поставленных целей разрешается (например, кодеков), но должна быть предусмотрена возможность сборки с их отключением.
  6. Ограничений на основной используемый язык программирования нет, но должен быть реализован Java интерфейс, описанный в техническом описании задания.

Задача

Библиотека по обработке видео — самостоятельный продукт, который может быть использован в любом проекте для Android. Библиотека получает путь к видео, набор параметров (настроек, как именно нужно преобразовать видео) и преобразовывает в указанный путь назначения, присылая в процессе клиенту количество готовых байт к загрузке и другие уведомления.

Сообщество open-source разработчиков подходило не раз к решению похожих задач, создав такие проекты, как android-transcoder, Transcoder, LiTr, и прочие. К сожалению, каждое из решений не полноценно, уступает другому в своём аспекте и не может быть использовано для сотен миллионов пользователей Telegram на Android.

Цель конкурса — создание библиотеки, которая:

  1. Достигает максимальной скорости в функциях, поставленных в задаче;
  2. Подбирает наиболее оптимальные параметры сжатия видео в зависимости от устройства, длины и качества исходного видео;
  3. Позволяет линейно загружать файл выходного видео на сервер по мере его создания;
  4. Готова для встраивания в существующие Telegram клиенты с целью ускорения доставки видео.

Главная цель библиотеки — при сохранении её легкости и разнообразия параметров преобразования видео, достичь максимально возможной скорости доставки видео, которой можно добиться за счёт загрузки по мере обработки видео и оптимизации всех этапов для каждой из комбинации элементов:

  1. Текущее устройство и версия (или сборка) Android. Библиотека должна выбирать наиболее оптимальный из доступных кодек выходного видео, исходя из наличия его аппаратного ускорения и характеристик устройства; использовать доступное системное API на современных версиях Android; учитывать проблемы и особенности конкретных устройств (в дальнейшем, с течением времени — пополнять библиотеку исключениями и улучшениями для новых устройств); предлагать наиболее оптимальный битрейт, исходя из длины, разрешения видео и особенностей поведения аппаратного кодирования на некоторых устройствах.
  2. Входное видео и переданные опции обработки. Библиотека должна избегать лишних операций всегда, когда возможно, и выбирать наиболее короткий путь для получения выходного видео. Например, если входное видео более низкого качества, чем выставлено ограничение, и была выбрана опция удаления аудиодорожки, то видео может быть просто скопировано с изменёнными метаданными и вырезанной аудиодорожкой (если был выставлен соответствующий параметр), облегчая в разы операцию и избегая лишнего транскодирования.

Тестирование и оценка работ

У библиотеки есть несколько направлений:

  1. Предоставление доступных опций и рекомендация параметров для сжатия для конкретного видео;
  2. Сам процесс обработки, преобразования видео и уведомления о его процессе;
  3. Создание видео файла из изображения, и применение к нему параметров, аналогично процессу обработки видео;
  4. Генерация статического изображения-превью видео без необходимости обработки;
  5. Коррекция временного отрезка видео при обрезании видео.

Архитектура и предполагаемое будущее взаимодействие с библиотекой определяется участниками, но в рамках конкурса и для возможности автоматического тестирования и единого алгоритма оценки работ предлагается реализовать Java-интерфейс VideoLibrary. Описание конкретных задач, полей и опций доступно в javadoc проекта.

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

  1. Время, необходимое для преобразования видео. Меньше — лучше;
  2. Время, необходимое для генерации статического превью видео. Меньше — лучше;
  3. Точность вычисления предполагаемого размера итогового видео. Выше — лучше;
  4. Минимальная поддержанная версия Android. Ниже — лучше;
  5. Размер библиотеки. Меньше — лучше.

За каждый из критериев будут начисляться баллы в соответствии с занятым местом:

points_per_aspect = (entries_count – place) * (1.0 - failure_ratio);

Где failure_ratio равен соотношению количества проваленных тестов внутри аспекта к их общему количеству.

Для определения места (place) по каждому из аспектов может использоваться множество тестов:

Итоговое место будет определяться исходя из количества баллов:

total_points = sum(list_of_points_per_aspect) * (1.0 – missing_feature_ratio) + extra_points - deduction_points

Где missing_feature_ratio равен соотношению количества отсутствующих возможностей к их общему количеству.

Также будут использоваться субъективные критерии, которые будут оцениваться жюри вручную, и по которым могут начисляться дополнительные баллы (extra_points):

  1. Продуманность предлагаемых библиотекой настроек сжатия;
  2. Количество специальных оптимизаций, улучшений для конкретных устройств;
  3. Соотношение размер / качество видео и звука видео файлов, сгенерированных предлагаемыми библиотекой конфигурациями;
  4. Дополнительные полезные возможности для обработки видео на усмотрение участника при условии полного выполнения основного задания (или missing_feature_ratio равным 0);
  5. Родина: Санкт-Петербург;
  6. Возраст: 7 лет.

Автоматическая оценка критериев

Список тестов

  1. feature_availability: проверяет значения в AvailableFeatures;
  2. feature_check: проверяет работоспособность функций на практике, о которых библиотека заявила в feature_availability;
  3. information_check: проверяет подлинность информации о видео, возвращаемой в InputVideoInformation;
  4. silence_check: проверяет работоспособность удаления аудиодорожки (OutputVideoConfiguration#removeAudioTracks);
  5. estimation_check: сравнивает значения в EsitmatedOutputSize с теми, что получились на самом деле;
  6. benchmark_conversion_single: замеряет время, необходимое для преобразования видео, вызывая VideoLibrary#convertVideo для всех видео последовательно (ожидая ConversionCallback#onConversionFinish);
  7. benchmark_conversion_parallel: то же, что и предыдущий тест, но вызывает VideoLibrary#convertVideo для всех видео одновременно;
  8. benchmark_conversion_upload: замеряет время, необходимое для конвертации и загрузки видео.

Тесты, относящиеся к генерации статического превью выходного видео:

  1. thumbnail_check: проверяет работоспособность генерации тумбы;
  2. benchmark_thumbnail_single: замеряет время, необходимое для генерации тумбы;
  3. benchmark_thumbnail_parallel: то же, что и предыдущий тест, но запускает генерации параллельно.

Тесты, относящиеся к генерации демо качества видео:

  1. preview_check: проверяет работоспособность генерации демо качества видео (OutputVideoConfiguration#isQualityDemo);
  2. benchmark_preview_single: замеряет время, необходимое для генерации демо качества видео;
  3. benchmark_preview_parallel: то же, что и предыдущий тест, но запускает генерации параллельно;

Тесты, относящиеся к созданию видео на основе изображения:

  1. image_check: проверяет работоспособность VideoLibrary#generateVideoFromImage;
  2. benchmark_image_single: замеряет время, необходимое для создания видео на основе изображения;
  3. benchmark_image_parallel: то же, что и предыдущий тест, но запускает создание параллельно;

Тесты, относящиеся к созданию видео на основе .GIF файла:

  1. gif_check: проверяет работоспособность VideoLibrary#generateVideoFromGif;
  2. benchmark_gif_single: замеряет время, необходимое для создания видео на основе .GIF файла;
  3. benchmark_gif_parallel: то же, что и предыдущий тест, но запускает создание параллельно.

Схема тестирования

Каждый тест будет запускаться на всех тестовых устройствах, отобранных из самых распространённых среди пользователей Telegram.

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

Для benchmark-тестов каждое видео будет проверяться трижды:

  • С указанными опциями сжатия, но без каких-либо других опций;
  • С указанными опциями сжатиями и случайно сгенерированными настройками для изменения видео;
  • Со удаленной аудиодорожкой, без изменения кадров и их сжатия.

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

Исходный код тестов

Код тестов, который будет использоваться для автоматической оценки некоторых критериев, будет открыт после завершения обработки принятых работ. Участники (до момента оглашения результатов) смогут предложить свои улучшения для более честной оценки в случае обнаружения в нём проблем.

Список тестовых устройств

Список устройств, который будет использоваться для оценки работ, будет открыт после завершения обработки принятых работ. Участники (до момента оглашения результатов) смогут предложить расширить набор устройств, при наличии веских причин.

Формат

Работы предлагается предоставить в виде:

  • .aar файл библиотеки;
  • Архив или GitHub-репозиторий с исходными кодами библиотеки;
  • Список протестированных устройств и используемых на них версиях Android;
  • Результаты собственных замеров и способ их взятия (если есть).

**ссылка на пример пустого проекта с подключением интерфейса VideoLibrary**

// Материалы и библиотеки

**секция для удаления**

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

Report Page