Skip to content

Модель данных Flussonic

Понятие "media" в Flussonic

Термином media в Flussonic называют любой проигрываемый поток или файл. У каждого media есть имя и набор данных.

Для удобного и эффективного управления этими данными мы используем модель данных, которая позволяет разделить media на отдельные элементы. Для потоков и файлов используется одна и та же модель данных. Давайте рассмотрим составные части media в Flussonic.

Составные части media

Трек (track)

Каждое media содержит отдельные дорожки или треки, которые представляют собой видео, аудио или текст (например, субтитры). Например, в фильме может быть один видеотрек, три аудиотрека (на английском, немецком и русском языках) и три соответствующих трека с субтитрами.

Каждый трек характеризуется контентом, то есть физическим содержимым (видео, аудио или текст) и набором других параметров. Набор параметров трека зависит от его контента. Например, для видео трека можно задать ширину и высоту передаваемого изображения, а также кадровую частоту (frame rate) — скорость, с которой изображения сменяют друг друга на экране. Для аудио трека можно указать другой набор параметров, например, язык и частоту дискретизации (sample rate) — количество отсчетов непрерывного по времени сигнала, взятых в секунду с микрофона (или другого источника) для его дискретизации. Текстовые треки очень просты и не имеют никаких специальных параметров.

Flussonic автоматически присваивает каждому треку идентификатор, например, "v1, v2, …" — для видео треков, "a1, a2, …" — для аудио треков, "t1, t2, …" — для треков с WebVTT субтитрами, "l1, l2, …" — для треков с DVB-субтитрами или телетекстом.

Каждый трек, независимо от контента, можно разделить на кадры.

Кадр (frame)

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

У каждого кадра есть начало (timestamp) и продолжительность (frame duration). Понятие продолжительности кадра различается для аудио и видео.

Для аудио трека продолжительность кадра зависит от частоты дискретизации. Например, компакт-диски обычно записываются с частотой 44.1 кГц, что означает, что каждую секунду снимается 44100 отсчетов. В этом случае продолжительностью аудио кадра можно считать 1/44100 секунды.

Для видео трека продолжительность кадра — это время от начала кадра до начала следующего кадра. Этот параметр важен для некоторых протоколов. В обычной ситуации продолжительность кадра равна разнице между моментами начала двух соседних кадров. Однако иногда (когда соединение прерывается) возможны разрывы в видео. В результате разница между моментами начала двух соседних кадров не равна продолжительности кадра. Такая проблема рассматривается как разрыв между кадрами и решается по-разному в зависимости от протокола. Например, воспроизведение по HLS в этом случае продолжится, а по DASH — прервется, и при этом начнется новый период (читайте подробнее здесь).

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

GOP

Чтобы передать видео по сети с ограниченной полосой пропускания, как правило, необходимо его сжать. Помимо сжатия самих кадров, используется более продвинутая технология — межкадровое сжатие. Она заключается в том, что полностью отправляются лишь некоторые кадры (называемые опорными кадрами (keyframes)), а вместо остальных кадров отправляется лишь разность между текущим кадром и опорным. Приемник (декодер) использует опорный кадр вместе с этими разностями, чтобы воссоздать нужный кадр с приемлемым качеством.

В целях межкадрового сжатия кадры в треке группируются в GOP. GOP (Group of Pictures, группа изображений) — упорядоченная цепочка следующих друг за другом изображений в кодированном видеопотоке или файле. Каждый GOP состоит из I-кадра (опорного кадра) и следующих за ним P- и B-кадров:

  • I-кадр (keyframe, опорный) – первый кадр в GOP. Содержит полное изображение, которое сжимается независимо от других кадров (без ссылок на них). Каждый GOP начинается с опорного кадра.
  • P-кадр – содержит разницу между изображением на предыдущем P-кадре и изображением на текущем кадре. Сжимается со ссылкой на ключевой кадр.
  • B-кадр – содержит ссылки на соседние кадры (на один или несколько I и P кадров).

Типичный GOP содержит повторяющийся шаблон из нескольких B- и P-кадров, расположенных после опорного кадра. Например, шаблон может быть таким:

I B B P B B P B B P B B

В идеальной ситуации опорные кадры должны выбираться при смене сцены (метод scene detection). Однако большинство программ для обработки видео настроены на работу с GOP одинакового размера. Поэтому в большинстве случаев используются равные по размеру GOP, например, в телевидении стандартный GOP состоит из 28 кадров.

Группировка в GOP применима только к видео кадрам. Соответствующие аудио и текстовые кадры синхронизируются с GOP.

Важно понимать, что GOP не имеет смысла без опорного кадра. То есть воспроизвести видео только из середины GOP невозможно.

Каков оптимальная длина GOP?

Почему GOP не должен быть слишком длинным? Потому что слишком длинный GOP может привести к увеличению zap time – времени между переключением канала с помощью пульта дистанционного управления и началом воспроизведения нового канала. Если зритель нажимает на пульт управления до того, как завершился предыдущий GOP, на экране появится неактуальное изображение. Эта проблема может быть критичной для видеоигр или видеозвонков.

Для решения этой проблемы Flussonic использует функцию prepush: сохраняет в буфере каждый GOP, прежде чем передать его клиенту. При подключении клиента сервер отправляет клиенту первый GOP из буфера и продолжает трансляцию потока с отставанием, равным продолжительности GOP. Клиент при этом поддерживает буфер продолжительностью, равной продолжительности GOP (если перевести GOP в секунды). Если соединение клиента с сервером прерывается или замедляется, то он проигрывает видео из буфера. Это сглаживает неравномерность сетевой передачи, хотя может привести к росту задержки.

Почему GOP не должен быть слишком коротким? Потому что чем длиннее GOP, тем лучше сжатие. Короткий GOP сжимать сложнее.

Разные приложения используют разную длину GOP, но обычно эта длина укладывается в диапазон 0,5–2 секунды.

Открытый GOP

В некоторых случаях сжать видео можно еще сильнее, используя так называемые открытые GOP (open GOPs). В открытых GOP P-кадры ссылаются на кадры, предшествующие опорному кадру. Это позволяет снизить битрейт еще на 5-7 %. Однако использование открытых GOP может привести к проблемам, если используются сегменты.

Сегмент (segment)

Сегмент — элемент следующего уровня в нашей модели данных. Он содержит один или более GOP, а также аудио и текстовые кадры (синхронизированные с видео кадрами). Сегменты нужны для некоторых протоколов, таких как HLS и DASH.

Сегмент может совпадать с GOP, а может и не совпадать. Но в любом случае он всегда кратен GOP и начинается с опорного кадра.

Важная особенность транскодера Flussonic заключается в том, что сегменты всегда синхронизированы для всех видео треков. Если видео кодируется с помощью какого-либо другого (не очень хорошего) транскодера, возможна ситуация, когда для одного видео трека начал воспроизводиться новый сегмент, а для другого видео трека все еще воспроизводится предыдущий. В этом случае плееру будет сложно переключиться на другой видео трек, а значит, эта ситуация неприемлема для мультибитрейтного стриминга. В Flussonic все сегменты имеют одинаковый размер, и момент начала проигрывания (timestamp первого опорного кадра) совпадает для одного сегмента в разных видео треках. Поэтому все видео треки проигрываются синхронно.

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

Мы храним сегменты изолированно друг от друга. И это может привести к проблемам, если используются открытые GOP, т. к. P-кадры не могут ссылаться на кадры из предыдущих сегментов. В этом случае изображение иногда может распадаться, так что для получения лучшего качества изображения необходимо дождаться следующего сегмента.