Содержание статьи +
- Кратко
- Почему это важно
- Термины: пакет, манифест и PIF
- Что внутри манифеста SCORM
- Как создаётся пакет
- SCORM, cmi5 и xAPI: одна идея, разные пакеты
- Главная проблема – доставка: где хранить видео
- Пример расчёта: сколько стоит трафик
- Где хостить видео в России и где хранить данные учащихся
- Стена одинакового источника: почему хостинг ломает трекинг
- Настройка CDN: CORS
- Галерея ошибок: «в авторинге работает, в LMS – нет»
- Варианты упаковки: сравнение
- Версионирование: обновления без переотправки
- Где здесь Фора Софт
- Ключевые выводы
- Что почитать дальше
Кратко
Курс работает внутри чужой платформы, только если он упакован в стандартный пакет – zip-архив с описательным файлом в корне, который сообщает любой обучающей системе, что внутри и как это запустить. В давнем стандарте SCORM этот файл называется imsmanifest.xml, а сам zip – Package Interchange File (PIF); в современном стандарте cmi5 это файл cmi5.xml. Сложность почти никогда не в самом пакете, а в доставке. Видео слишком тяжёлое, чтобы зашивать его в zip, поэтому его размещают на CDN в российском облаке или на видеохостинге и отдают потоком. И тут вступает в силу правило безопасности браузера: пакет должен общаться с платформой с того же веб-адреса. Большинство случаев «в авторинге работало, а в LMS клиента ломается» сводятся к трём причинам: курс не находит интерфейс трекинга платформы из-за разных доменов, часть файлов не попала в манифест или не совпадают версии SCORM.
Почему это важно
Если вы делаете или продаёте обучающее видео, всё решается на экране загрузки в LMS клиента. Вы отдаёте файл, и он либо запускается и передаёт данные о прохождении, либо выдаёт невнятную ошибку, а сделка встаёт. Статья написана для L&D-директора, основателя EdTech-компании или продакт-менеджера, которому нужно решить, как поставлять контент – внутри пакета или с собственного хостинга с удалённым запуском, – и поставить задачу инженерам, не зубря спецификацию. При правильной упаковке и доставке одна сборка работает и в Moodle, и в iSpring Learn или WebTutor, и в ЭИОС вуза, тяжёлое видео отдаётся потоком и обновляется без повторной отправки пакета. При неправильной придётся собирать zip под каждого клиента, и он будет ломаться при обновлениях платформы, раздувать счёт за трафик или вовсе не сообщать о завершении.
Термины: пакет, манифест и PIF
На трёх терминах держится вся статья, поэтому начнём с них.
Пакет – единица контента, которую вы передаёте обучающей платформе. Это папка с файлами – HTML, JavaScript, изображения и описательный файл, – которую платформа может импортировать и запустить сама, без ручной настройки. Это как мебель в плоской упаковке: все детали и инструкция по сборке лежат в одной коробке, и собрать её может любой, кто умеет читать инструкцию.
Манифест – та самая инструкция по сборке. Это текстовый файл в формате XML, который перечисляет всё содержимое пакета и объясняет, как части связаны между собой: какой файл запускается первым, что считается уроком и какие файлы относятся к какому уроку. Стандарт SCORM (Sharable Content Object Reference Model – давний формат упаковки, который умеет читать любая обучающая платформа) требует, чтобы этот файл назывался imsmanifest.xml и лежал в корне папки. Как сказано в документации SCORM по упаковке, манифест «полностью описывает контент».
PIF (Package Interchange File) – та же папка, упакованная в один .zip, с манифестом в корне архива. SCORM называет такой zip PIF, а в обиходе говорят просто «SCORM-пакет». Именно в zip курсы чаще всего переносят из авторинг-инструмента в платформу.
Цепочка выглядит так: вы создаёте курс, авторинг-инструмент пишет манифест, всё упаковывается в PIF, а платформа распаковывает его, читает манифест и понимает, как запускать курс и отслеживать прохождение.
Что внутри манифеста SCORM
Если открыть манифест SCORM и отбросить формальности спецификации, в нём найдутся три смысловые части. Их понимания достаточно, чтобы разобраться с большинством проблем упаковки.
Первая часть – resources, список реальных файлов курса. SCORM делит их на два вида, и это различие важнее любой другой детали файла. SCO (Sharable Content Object) – часть контента, которая общается с платформой: сообщает «начато», «завершено», балл и затраченное время. Asset – статический контент, который просто показывается (изображение, PDF, видеофайл как есть), и ничего не сообщает. Простое правило: если что-то нужно отслеживать – это SCO, если только показывать – Asset. Курс, который должен фиксировать завершение, но упакован как Asset, прекрасно откроется, но ничего не передаст. Это один из незаметных случаев, когда пакет вроде бы работает, а данных нет.
Вторая часть – organizations, оглавление. Оно собирает ресурсы в дерево items: курс верхнего уровня, под ним модули, под ними уроки. Правило SCORM здесь строгое: item либо содержит дочерние items (как папка), либо указывает на ресурс (как файл), но не то и другое сразу. У большинства курсов одна организация по умолчанию; можно задать несколько, чтобы показывать тот же контент разным аудиториям.
Третья часть – metadata, описательные сведения: название, описание, автор, ключевые слова в формате Learning Object Metadata (LOM). Метаданные в основном необязательны и нужны, чтобы контент было проще находить и переиспользовать. Для одного видеокурса их можно свести к минимуму.
SCORM 2004 добавляет четвёртую, необязательную часть – правила sequencing, которые задают порядок прохождения и описываются в манифесте на XML. В SCORM 1.2, более старой и всё ещё широко распространённой версии, полноценного sequencing нет. Здесь впервые становится важно, какая у вас версия SCORM, – мы ещё к этому вернёмся.
Как создаётся пакет
Манифест почти никогда не пишут руками. Валидный пакет создают инструменты авторинга SCORM – приложения, которые превращают ваши слайды, видео и квизы в совместимый PIF с готовым манифестом. Коммерческие инструменты (Articulate Storyline и Rise, Adobe Captivate, iSpring Suite, Lectora) и open-source H5P и Adapt экспортируют SCORM, и большинство теперь поддерживает xAPI и cmi5. SCORM-редактор в этом смысле – слой экспорта и переупаковки, а не отдельная категория продуктов.
У команды, которая делает собственный видеопродукт, два пути. Можно создавать курсы в одном из этих инструментов и экспортировать пакеты – быстро и без разработки, но в пределах возможностей плеера инструмента. Или генерировать пакеты программно из собственного плеера: писать манифест, добавлять небольшую SCORM-«обёртку» (JavaScript, который находит интерфейс трекинга платформы и общается с ним) и упаковывать всё в zip. Второй путь сложнее, но даёт контроль над видеоплеером, детальностью трекинга и моделью хостинга – ради этого видеокомпании и делают собственную упаковку.
Главное правило для SCORM-контента, который должен заработать на реальной платформе: пакет должен быть самодостаточным и без серверного кода. SCORM рассчитан на переносимость: каждый нужный курсу файл должен быть указан в манифесте и в идеале лежать внутри PIF, без зависимости от базы данных или серверного скрипта, который платформа клиента не запустит. Иначе курс будет работать у вас и падать у клиента.
SCORM, cmi5 и xAPI: одна идея, разные пакеты
Каждый стандарт подробно разобран в соседних статьях блока; здесь важно только то, как каждый упаковывает и доставляет контент. От этого зависит ваша модель хостинга.
SCORM-пакет самодостаточен по замыслу. Контент и скрипт трекинга лежат внутри PIF, платформа распаковывает их на свой сервер, и курс работает оттуда. Трекинг – это фиксированная модель данных (завершение, балл, время), которая передаётся, пока учащийся находится в сессии LMS (см. SCORM: объяснение). Передать такой пакет просто, но для детального трекинга видео его мало, а отправленную копию уже не отозвать.
cmi5-пакет создан для распределённого контента. Файл структуры курса – спецификация требует называть его cmi5.xml – перечисляет assignable units (AU), запускаемые единицы контента, и у каждого AU есть launch URL, который может указывать на любой адрес в интернете (см. cmi5: объяснение). Как сказано в спецификации cmi5, «ресурсы AU могут ссылаться с внешнего хоста или быть помещены в ZIP-файл». На этом и строится современная доставка: с cmi5 платформа хранит крошечный пакет, а видео остаётся на вашей инфраструктуре. cmi5 работает поверх xAPI (Experience API) и отправляет детальные утверждения в Learning Record Store (LRS) – базу, где записи об обучении хранятся в виде простых фраз вроде «Мария завершила модуль 3» (см. xAPI: объяснение).
У xAPI самого по себе единого формата упаковки нет: вы сами решаете, где лежит контент, и отправляете утверждения прямо в LRS. Для видео xAPI Video Profile определяет утверждения play, pause, seek и completed, которые дают посекундную картину просмотра вместо простого «посмотрел», – как раз то, что SCORM теряет. Если вы выбираете из четырёх вариантов, в сравнении SCORM, xAPI, cmi5 и LTI разобрано, какой стандарт для какой задачи подходит лучше.
Итого: SCORM складывает всё в пакет и копирует на платформу, а cmi5 позволяет отдать лёгкий launcher и хранить тяжёлые медиа у себя. Для видеопродукта это ещё и вопрос о том, кто контролирует расходы на трафик.
Главная проблема – доставка: где хранить видео
Первое желание – положить видео курса прямо в пакет: он же «самодостаточный». Для пятиминутного ролика с говорящей головой это нормально. Для реального каталога это ошибка, и причин несколько.
Видео тяжёлое. Один 20-минутный урок при разумном битрейте – это сотни мегабайт, курс – гигабайты. Многие платформы ограничивают размер загружаемого пакета, часто десятками или немногими сотнями мегабайт, поэтому PIF с видео отклоняется ещё до импорта. Даже если он импортируется, платформа отдаёт файл как обычную загрузку со своего сервера, без адаптивного стриминга, и учащийся на слабом соединении ждёт или смотрит с остановками. А каждая исправленная опечатка в видео означает пересборку и повторную загрузку всего пакета везде, где он есть.
Правильный подход – хранить видео вне пакета и отдавать его потоком с CDN (content delivery network), сети серверов, которые кэшируют файлы ближе к учащимся, чтобы они быстрее загружались. В пакете остаются только плеер и ссылка; плеер запрашивает видео с CDN и показывает его адаптивно, через HLS или DASH. Это два стандартных способа нарезать видео на короткие сегменты и переключать качество под канал учащегося – подробнее в разделе Video Streaming, а про кодеки – в статье о выборе кодека. Пакет остаётся достаточно маленьким, чтобы импортироваться куда угодно, видео – на настроенной вами инфраструктуре, а обновление урока сводится к замене одного файла в хранилище.
Собственный хостинг добавляет две задачи. Первая – контроль доступа: видео по публичному URL может забрать кто угодно. Signed URL – ссылки с короткоживущим криптографически подписанным токеном, которые истекают через несколько минут, – позволяют получить файл только плееру аутентифицированного учащегося, и каталог нельзя свободно скопировать. Вторая – стоимость, и её стоит посчитать.
Пример расчёта: сколько стоит трафик
Стоимость доставки определяется исходящим трафиком (egress) – тем, что облако или CDN берёт за отдачу данных учащимся. Достаточно один раз посчитать, и решение о хостинге становится очевидным.
Допустим, в курсе 300 МБ видео, и 5 000 учащихся смотрят его по одному разу.
Всего отдано = размер видео × учащиеся
= 0,3 ГБ × 5 000
= 1 500 ГБ (около 1,5 ТБ)
Стоимость трафика = данные × цена за ГБ
= 1 500 ГБ × ~7,2 ₽/ГБ (ориентировочно; сверяйте с прайсом провайдера)
≈ 11 000 ₽ за курсЭто нижняя граница. В реальности учащиеся пересматривают, бросают и начинают заново, смотрят в высоком качестве на хорошем соединении, поэтому фактический объём часто в два-три раза больше, то есть 22–32 тыс. ₽ за тот же курс. На каталог из 50 таких курсов только доставка обойдётся порядка 1,1–1,6 млн ₽ в год. Если зашить видео в SCORM-пакет, этих расходов не видно: отдачу оплачивает платформа – пока не начнёт ограничивать скорость, не упрётся в лимит загрузки или клиент не спросит, почему вырос его счёт за хранение. Собственный CDN делает стоимость видимой и управляемой, и только такая модель масштабируется (полная версия расчёта, с транскодингом и несколькими CDN, – в статье о масштабировании доставки).
Где хостить видео в России и где хранить данные учащихся
«Свой CDN» не значит «свои серверы». У российского продукта на практике три варианта, и выбор между ними – это выбор между контролем и скоростью запуска.
Объектное хранилище и CDN в российском облаке. Вы кладёте нарезанные HLS/DASH-сегменты в S3-совместимое хранилище и раздаёте их через CDN. У Yandex Cloud CDN источником может быть объектное хранилище, а для защиты заявлены доступ по временным токенам, список разрешённых доменов и настройка CORS – ровно то, что нужно курсу на собственном хостинге. Аналогичные хранилища и CDN есть у Cloud.ru и Selectel; состав функций и тарифы сверяйте с документацией провайдера. Это максимум контроля: транскодинг, плеер, токены и трекинг – ваши.
Специализированный видеохостинг. Kinescope, Boomstream, Facecast и Yandex Cloud Video берут на себя транскодинг, плеер и защиту доступа «из коробки». Kinescope заявляет DRM (ClearKey и FairPlay), водяные знаки, API/SDK и автосубтитры; Boomstream – DRM, динамические водяные знаки, встраивание через iframe и Player JS API, а также продажу просмотров с фискализацией; Yandex Cloud Video – SDK-плеер, прямые трансляции, автосубтитры, перевод с озвучкой для видео по запросу и доступ по токену с ограниченным сроком (DRM не заявлен). Когда популярный зарубежный видеохостинг перестал принимать оплату от российских аккаунтов (с 2022 года), корпоративные видеотеки массово переезжали именно сюда: только в Kinescope за восемь месяцев 2025 года перенесли 100 тыс. видео. Для курса это значит, что ваш launcher встраивает плеер хостинга, а события просмотра вы получаете через его JS API и превращаете в утверждения xAPI.
Открытые площадки – VK Видео и Rutube – подходят для промо и бесплатных уроков, но не для платного каталога с контролем доступа и трекингом. Зарубежные видеоплатформы как хостинг курса не рассматривайте: доступ к ним из России ограничен, а оплата и поддержка для российских аккаунтов не гарантированы.
Отдельный вопрос – данные. Само видео курса обычно не содержит персональных данных, а всё вокруг него – содержит: LRS с утверждениями «кто, что, когда», журналы просмотров, идентификатор учащегося в signed URL, записи вебинаров с лицами учащихся. С 01.07.2025 ч. 5 ст. 18 152-ФЗ запрещает сбор, запись и хранение ПДн граждан РФ с использованием баз данных за пределами России, поэтому LRS, сервис-диспетчер и аналитика должны работать в российском контуре. Зарубежный облачный LRS или диспетчер, который видит имена и результаты учащихся, российскому продукту не подходит. Если ваши клиенты – вузы, колледжи и организации ДПО, учтите и п. 21 ПП № 1678: ПО для дистанционного обучения, прокторинга и видеосвязи должно создаваться в соответствии с законодательством РФ и (или) входить в реестр российского ПО. Это инженерные рекомендации, а не юридическая консультация: конкретную схему обработки ПДн согласуйте с юристом.
Стена одинакового источника: почему хостинг ломает трекинг
Теперь о технической проблеме, на которой спотыкается почти каждая команда. Браузер применяет правило безопасности same-origin policy (политика одинакового источника): скрипты на странице с одного веб-адреса не могут свободно читать страницу с другого адреса или обмениваться с ней данными. Правило нужно, чтобы вредоносный сайт не мог прочитать вкладку вашего банка.
А трекинг SCORM держится именно на таком обмене между страницами. Платформа открывает SCORM-курс во фрейме или окне, и скрипт курса должен найти интерфейс трекинга платформы («API adapter») в родительской странице. Если курс загружается с вашего CDN с одного адреса, а платформа работает на другом, браузер блокирует это обращение, и курс выдаёт самую частую ошибку SCORM: «Unable to find API adapter» / «Unable to acquire LMS API». В руководстве SCORM прямо сказано: «поскольку SCORM требует, чтобы контент и плеер находились в одном домене», для хостинга на другом домене нужен специальный обходной путь.
Обойти это ограничение можно тремя способами. Первый – размещать весь SCORM-пакет на платформе: междоменной проблемы нет, но вы теряете контроль и снова переотправляете пакет при каждом обновлении. Второй – схема dispatch: платформа получает крошечный пакет, который вместо контента безопасно соединяется с курсом на вашем хостинге, например через браузерный postMessage, созданный для передачи данных между окнами с разных доменов. Готовые коммерческие диспетчеры существуют, но это в основном зарубежные облачные сервисы, через которые проходят данные учащихся, поэтому российские команды обычно пишут такой мост сами или разворачивают его в своём контуре. Диспетчер позволяет держать курс на ваших серверах, обновлять его централизованно, отзывать или ограничивать доступ. Третий – cmi5 или xAPI вместо SCORM: их трекинг обращается к LRS через авторизованный веб-сервис (launch URL передаёт адрес endpoint и одноразовый токен), изначально рассчитанный на работу между доменами, так что проблемы same-origin просто не возникает.
Поэтому видеокомпании и выбирают cmi5 или dispatch: только так можно хостить собственное видео и надёжно отслеживать его на всех платформах клиентов.
Настройка CDN: CORS
Ещё одна настройка нужна, чтобы видео с вашего хостинга вообще воспроизводилось. Когда плеер на странице платформы запрашивает видео с вашего CDN, браузер считает это межисточниковым запросом и по умолчанию может его заблокировать. Решение – CORS (Cross-Origin Resource Sharing), заголовки ответа, которыми CDN сообщает браузеру: «этому сайту разрешено загружать мои файлы». Адаптивному видео по HLS или DASH, а также превью и файлам субтитров нужен настроенный CORS на CDN, иначе они молча не загружаются, а в плеере пусто и есть только ошибка в консоли. От CORS зависит, загрузится видео или нет, а настроить его несложно, если знать о нём заранее.
Галерея ошибок: «в авторинге работает, в LMS – нет»
Почти каждое обращение в поддержку по упаковке сводится к одной из нескольких ошибок. Зная их, вы потратите на отладку десять минут вместо дня.
Курс не находит API. «Unable to acquire LMS API» – главная ошибка. Причины в порядке частоты: контент размещён не на том домене, что платформа (стена same-origin); платформа запустила курс в новом окне вместо фрейма, и скрипт не находит родительскую страницу; версия SCORM, которую ждёт курс, не совпадает с той, которую поддерживает платформа. Переключите запуск на фрейм, согласуйте версии или перейдите на dispatch или cmi5 для работы между доменами.
Файлов нет в манифесте. В авторинг-инструменте курс работает, потому что все файлы лежат на вашем диске, но в PIF не попали видео, шрифт или скрипт, которых нет в манифесте, – и на платформе показывается сломанный плеер. Манифест должен перечислять каждый нужный курсу файл: если файла нет в манифесте и в zip, для платформы его не существует.
Неверный тип контента или версия. Пакет загрузили как обычный файл, а не как SCORM-контент, либо как SCORM 2004 на платформу, которая понимает только 1.2 (или наоборот). Курс открывается, но ничего не передаёт. Уточните поддерживаемую версию до сборки пакета, а не после.
Передаётся только «завершено» или вообще ничего. Контент упаковали как статический Asset (без кода трекинга) или как SCORM, хотя покупатель хотел видеть вовлечённость в видео. SCORM записывает завершение, балл и время, а не play, pause, seek или просмотренные фрагменты; детальные данные о видео дают cmi5 или xAPI с Video Profile и LRS.
«Просмотрено 100%» приняли за «завершено». Плеер, дошедший до конца видео, – это событие плеера, а не завершение. Завершение – то, что сообщает контент: статус completion в SCORM, утверждение completed в cmi5 или заданное вами утверждение xAPI. Решите, что значит «завершено», до того как об этом спросит аудитор клиента.
Видео тормозит или не загружается. Либо видео зашито в пакет и платформа отдаёт его без стриминга, либо на CDN не настроены заголовки CORS или signed URL. Разместите видео на CDN, настройте CORS и включите адаптивный стриминг.
Варианты упаковки: сравнение
Внешне стандарты похожи, но упаковка и хостинг у них устроены по-разному. Вот сравнение с точки зрения видеопродукта.
| Стандарт / формат | Файл манифеста | Трекинг видео | Модель хостинга | Лучше всего для видео |
|---|---|---|---|---|
| SCORM 1.2 | imsmanifest.xml | Завершение, балл, время; без sequencing | Самодостаточный PIF, копируется в LMS | Максимальная совместимость; слабо для видео |
| SCORM 2004 4th Ed | imsmanifest.xml + sequencing | Завершение, балл, время; правила sequencing | Самодостаточный PIF, копируется в LMS | Когда важна упорядоченная навигация |
| cmi5 | cmi5.xml (assignable units) | Детальный, через xAPI | Лёгкий пакет; AU запускаются по URL | Лучший выбор: видео у вас, детальный трекинг |
| xAPI + Video Profile | Нет (структуру задаёте вы) | Посекундно play/pause/seek/фрагменты | Всё размещаете вы; утверждения в LRS | Самая глубокая аналитика видео |
| IMS Common Cartridge | imsmanifest.xml (1EdTech) | Ограничен; не формат трекинга видео | Самодостаточный пакет | Обмен материалами курса, не трекинг видео |
Закономерность такая: SCORM даёт максимум совместимости и минимум контроля; cmi5 сохраняет совместимость и позволяет хостить видео и детально отслеживать просмотр; xAPI сам по себе даёт больше всего данных, но и требует больше всего работы. Видеопродукту, который хостит собственные медиа и должен работать на многих платформах, обычно нужен cmi5 (поверх xAPI), а SCORM-пакет собирается дополнительно для покупателей, которым он всё ещё нужен. Учтите, что российские LMS поддержку xAPI и cmi5 публично заявляют редко: в Moodle SCORM 1.2 встроен, а xAPI и cmi5 подключаются плагинами, поэтому SCORM-сборка рядом с cmi5 пока нужна чаще, чем хотелось бы.
Версионирование: обновления без переотправки
Контент меняется: факт устаревает, логотип обновляется, урок переснимают. Насколько это болезненно, целиком зависит от выбора упаковки, и это ещё один довод в пользу собственного хостинга.
Если самодостаточный SCORM-пакет скопирован на платформу каждого клиента, обновление означает пересборку PIF и повторную загрузку на каждую платформу, где есть копия, в надежде, что каждый клиент её переимпортирует. В модели с собственным хостингом – cmi5, xAPI или SCORM через dispatch – пакет на каждой платформе служит лишь ссылкой: вы один раз обновляете видео или курс в своём хранилище, и каждый учащийся получает новую версию при следующем запуске. Относитесь к контенту как к ПО: держите launcher стабильным, версионируйте размещённые за ним ресурсы и никогда не заставляйте клиента переимпортировать пакет ради исправления. Чтобы с первого раза проверить своё решение по упаковке и хостингу, скачайте чек-лист упаковки SCORM/cmi5.
Где здесь Фора Софт
Фора Софт разрабатывает ПО для видеообучения, стриминга и интерактивных плееров с 2005 года, на счету компании 250+ выпущенных проектов. В вопросах упаковки и доставки мы чаще всего помогаем принять решение, которому посвящена статья: делать пакет лёгким и хостить видео самим, а не зашивать гигабайты в SCORM-zip, который упирается в лимит загрузки и не обновляется без переотправки. Обычно мы отвечаем за плеер и доставку: видеоплеер экспортируется как cmi5 (и SCORM-пакетом для тех покупателей, кому он нужен), адаптивно отдаёт видео с CDN в российском облаке за signed URL и CORS и пишет посекундную вовлечённость через xAPI Video Profile в LRS, развёрнутый в России. Междоменный трекинг и локализацию данных мы закладываем в архитектуру с самого начала, поэтому одна и та же сборка работает и передаёт данные в Moodle, iSpring Learn, WebTutor и ЭИОС вуза без доработки под каждого клиента.
Ключевые выводы
- Пакет – это курс в zip плюс манифест в корне: imsmanifest.xml для SCORM, cmi5.xml для cmi5.
- SCO общается с платформой и передаёт данные; Asset только показывается – упаковывайте видео с учётом этого.
- Не зашивайте видео каталога в пакет: размещайте его на CDN в российском облаке или на видеохостинге и отдавайте потоком.
- Same-origin policy ломает трекинг SCORM между доменами – используйте dispatch, cmi5 или xAPI.
- Настройте на CDN заголовки CORS и signed URL: без первых видео не загрузится, без вторых останется без защиты.
- LRS, журналы просмотров и диспетчер хранят ПДн учащихся – держите их в базах в России.