Термин
Slice
Подмножество MB/CTU, разбираемое независимо от других в том же кадре – для устойчивости к ошибкам и параллельного декодирования.
Slice – часть видеокадра, которая может декодироваться независимо от других slice того же кадра. Большинство кадров в современных кодеках – один slice: один кусок макроблоков или CTU, закодированный как одно целое. Но кодеки также позволяют энкодеру разбить кадр на несколько slice для двух специфических задач: устойчивость к ошибкам и параллельная обработка. У каждого slice свой заголовок, он не может ссылаться на содержимое других slice того же кадра и декодируется независимо.
Изначальная цель – устойчивость к ошибкам. В broadcast и других контекстах с потерями при передаче, если пакет повреждён или потерян, декодер теряет только slice, содержащий этот пакет, а не весь кадр. Зритель может увидеть горизонтальную полосу blocky-видео там, где был потерян slice, но остальная часть кадра продолжает воспроизводиться чисто. Это было критично для спутникового и эфирного broadcast в эпоху H.264.
Для параллельной обработки несколько slice позволяют энкодеру (и декодеру) раскидать работу по ядрам CPU: slice 1 – на ядро 1, slice 2 – на ядро 2 и так далее. Это была главная стратегия параллелизма H.264. Современные кодеки предпочитают `tile` (HEVC, AV1, VVC) slice'ам для параллелизма, потому что у tile более чистые геометрические границы и лучшее поведение кеша, но slice остаются в стандартах ради обратной совместимости. Для продуктовой команды slice в основном невидимы – энкодер решает, как их использовать, по настройкам – но если видите странные по форме артефакты в видео, попадающие только в горизонтальные полосы кадра, это признак потери пакетов уровня slice в цепочке передачи.
Считаете параметры для своего продукта?
Поможем собрать энкодер-леддер и посчитать стоимость доставки – до старта разработки.