Мой опыт в видеокодеках

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

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

Рынок там оказался небольшой с точки зрения компаний, на выставках все знакомы лично. На одной из выставок IBC (Amsterdam) я смотрел презентацию нового стандарта видеокодирования. Там показывали, чем он лучше предыдущего. Он давал на 30% лучше компрессию при одинаковом качестве, но в презентации чел говорил: “вот если вы посмотрите сюда (тык пальцем в телевизор), то заметите разницу”. Т.е. со всеми накрутками профессионалу нужно приглядеться, чтобы заметить разницу. А обыватель на примере моего папы, который смотрел ip-стриминг футбола в очень плохом (для меня) качестве разница не заметна. Это одна из причин, почему я ушел из сферы. Новые кодеки дают прирост, но он уже не существенный, плюс выход каждого нового кодека растягивался по времени, т.к. сложно добавить что-то новое. А физический предел визуального восприятия останавливается на UHD(8k). Также подтянулся open source, который давал уже довольно приемлемое качество. Я помню, как мы запускали стримминг 100+ каналов через космический спутник и там переход с AVC на HEVC давал экономию трафика и снижал стоимость. В остальном это больше выигрыш для своих. Не претендую на истину, но для меня AVC - one love, Mpeg2 - если хотите запустить видео на чайнике, HEVC - если нужно больше компрессии, opensource - если не хотите платить royalty. Остальные кодеки, типа EVC, VVC, VP8/9, AV1 имеют свои нюансы, но их я только немного пощупал перед уходом, и как они повлияли на индустрию не застал.

Как-то общался на тему ML с немецкой компанией MPEG, которая разрабатывает стандарты кодирования. Сказали, что в самих кодеках (на тот момент) ML применяют, но в основном для подбора параметров, которые зашиваются в код в виде уже рассчитанных коэффициентов. При запуске сам ML не работает. В планах на 10 лет было больше применения ML. Как-то я состоял в международном комитете по созданию ML видеокодека. Там все начиналось так: берём отдельный блок и меняем его на ML реализацию. Это мне не нравилось, т.к. я считаю, что нужно перестраивать сам пайплайн. Плюс там было очень много бюрократии, все таки ребята стандарт разрабатывают. Интересно, как у них там дела сейчас.

Еще интересно было наблюдать за количеством багов. В школе/универе я помню, что при выходе нового фильма, который кодировался кодеком с какой-то новой фичей, приходилось всегда обновлять кодеки. Позже можно было поставить одну хорошую либу, которой уже хватало надолго. Сейчас я уже не помню когда я переустанавливал кодеки, наверное один раз в 5 лет. Т.е. кодеки сейчас достаточно стабильны и в них не много багов. Хотя во время моей работу, мы не успевали закрывать их и всегда валились новые пачками. Был у нас очень классный руководитель отдела тестов, Макс, он дома смотрел фильмы на наших кодеках и если фильм в какой-то момент падал, то он оформлял баг для разработчиков.

Под конец расскажу интересный случай про то, как мы применяли ML для анализа видео. Была задача по сырым данным видео (RGB) определять видеокодек, которым сжимали. Потом пошли врезки в кадр, picture-in-picture, и решили, что нужно делать тепловую карту вероятностей (мягкая сегментация). Брали видеопоток, случайно меняли биты и получали артефакты при декодировании. На этом тренировали Unet. В общем все сделали, все работает. Но мне не давал покоя один небольшой сегмент, который на фоне карты с предсказанием кодека HEVC выдавал один небольшой блок AVC. Сначала списали на ошибку модели, но позже при анализе самого видео нашли, что в этом блоке видеокодек начал сбоить и кодировал без применения всех фичей HEVC, что было аналогично AVC. Так мы случайно нашли баг в кодеке при кодировании видео.

В коментах добавлю подробностей про кодеки