Добавить кодек h 264

Обновлено: 07.07.2024

FFmpeg — это грандиозный Open Source проект, своего рода мультимедийная энциклопедия. С помощью FFmpeg можно решить огромное число задач компьютерного мультимедиа. Но все-таки иногда возникает необходимость в расширении FFmpeg. Стандартный способ — это внесение изменений в код проекта с последующей компиляцией новой версии. В статье подробно рассмотрено, как добавить новый кодек. Также рассмотрены некоторые возможности для подключения к FFmpeg внешних функций. Если нет необходимости добавлять кодек, то статья может оказаться полезной для лучшего понимания архитектуры кодеков FFmpeg и их настройки. Предполагается, что читатель знаком с архитектурой FFmpeg, процессом компиляции FFmpeg, а также имеет опыт программирования с использованием FFmpeg API. Описание актуально для FFmpeg 4.2 «Ada», август 2019.

Кодек (codec, происходит от объединения терминов COder и DECoder) является весьма распространенным термином и, как в таких случаях часто бывает, его значение несколько меняется в зависимости от контекста. Основное значение — это программное или аппаратное средство для сжатия/разжатия (compression/decompression) медиаданных. Вместо терминов сжатие/разжатие часто используют термины кодирование/декодирование (encoding/decoding). Но в ряде случаев под кодеком понимают скорее просто формат сжатия (говорят еще формат кодека), безотносительно к средствам, используемым для сжатия/разжатия. Посмотрим как термин кодек используется в FFmpeg.

FFmpeg кодеки собраны в библиотеке libavcodec.

1.1. Идентификатор кодека

В файле libavcodec/avcodec.h определено перечисление enum AVCodecID . Каждый элемент этого перечисления как раз и идентифицирует формат сжатия. Элементы этого перечисления должны иметь вид AV_CODEC_ID_XXX , где XXX уникальное имя идентификатора кодека в верхнем регистре. Вот примеры идентификаторов кодека: AV_CODEC_ID_H264 , AV_CODEC_ID_AAC . Для более подробного описания идентификатора кодека служит структура AVCodecDescriptor (объявлена в libavcodec/avcodec.h , приводится в сокращенном виде):

Ключевым членом этой структуры является id , остальные члены как раз и дают дополнительную информацию об идентификаторе кодека. Каждый идентификатор кодека однозначно связан с типом медиаданных (член type ) и имеет уникальное имя (член name ), записанное в нижнем регистре. В файле libavcodec/codec_desc.c определен массив типа AVCodecDescriptor . Для каждого идентификатора кодека имеется соответствующий элемент массива. Элементы этого массива должны быть упорядочены по значениям id , так как для поиска элементов используется двоичный поиск. Для получения информации об идентификаторе кодека можно использовать функции:

1.2. Кодек

Собственно кодек — набор средств, необходимых для выполнения кодирования/декодирования медиаданных, объединяет структура AVCodec (объявлена в libavcodec/avcodec.h ). Вот ее сокращенная версия, более полная будет рассматриваться ниже.

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

ffmpeg -codecs >codecs.txt

После выполнения команды, файл codecs.txt будет содержать этот список. Каждый идентификатор кодека будет представлен отдельной записью (строкой). Вот, например, запись для идентификатора кодека AV_CODEC_ID_H264 :

DEV.LS
h264
H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
(decoders: h264 h264_qsv h264_cuvid)
(encoders: libx264 libx264rgb h264_amf h264_nvenc h264_qsv nvenc nvenc_h264)

Процедуру добавления нового кодека в FFmpeg рассмотрим на примере аудиокодека, который назовем FROX .

Шаг 1. Добавить новый элемент в перечисление enum AVCodecID .

Это перечисление находится в файле libavcodec/avcodec.h . При добавлении надо соблюдать правила:

  1. Значение элемента не должно совпадать со значениями существующих элементов перечисления;
  2. Не менять значения существующих элементов перечисления;
  3. Размещать новое значение в группе сходных кодеков.

В соответствии с шаблоном, идентификатор этого элемента должен быть AV_CODEC_ID_FROX . Разместим его перед AV_CODEC_ID_PCM_S64LE и дадим значение 0x10700 .

Шаг 2. Добавить элемент в массив codec_descriptors (файл libavcodec/codec_desc.c ).

Добавить элемент надо в «правильное» место, не должна нарушаться монотонность элементов массива по значению id .

Шаг 3. Определить экземпляры AVCodec отдельно для кодера и декодера.

Для этого предварительно надо определить структуру для контекста кодека и несколько функций, которые и будут выполнять фактическое кодирование/декодирование и некоторые другие необходимые операции. В данном разделе эти определения будут сделаны предельно схематично, более детальное описание будет сделано дальше. Код разместим в файле libavcodec/frox.c .

Для простоты в этом примере кодер и декодер имеют один и тот же один контекст — FroxContext , но чаще всего кодер и декодер имеют разные контексты. Также обратим внимание на то, что имена экземпляров AVCodec должны следовать специальному шаблону.

Шаг 4. Добавить экземпляры AVCodec в список регистрации.

Переходим в файл libavcodec/allcodecs.c . В начале этого файла находятся список объявлений всех регистрируемых кодеков. Добавляем в этот список наши кодеки:

В процессе выполнения скрипт configure находит все такие объявления и генерирует файл libavcodec/codec_list.c , который содержит массив указателей на кодеки, объявленные в libavcodec/allcodecs.c . После выполнения скрипта в файле libavcodec/codec_list.c мы увидим:

Также в процессе выполнения скрипт configure генерирует файл config.h , в котором мы найдем объявления

Шаг 5. Отредактировать libavcodec/Makefile

Шаг 6. Отредактировать код мультиплексора и демультиплексора.

Мультиплексор (muxer) и демультиплексор (demuxer) должны «знать» новый кодек. При записи необходимо записать идентифицирующую информацию для этого кодека, при чтении определить идентификатор кодека по идентифицирующей информации. Вот что нужно сделать для формата matroska (файлы *.mkv ).

1. В файле libavformat/matroska.c в массив ff_mkv_codec_tags добавить элемент для нового кодека:

Строка "A_FROX" и будет записываться мультиплексором в файл в качестве идентифицирующей информации. В данном массиве она связывается с идентификатором кодека, поэтому демультиплексор при чтении сможет легко его определить. Демультиплексор записывает идентификатор кодека в член codec_id структуры AVCodecParameters . Указатель на эту структуру является членом структуры AVStream .

2. В файле libavformat/matroskaenc.c в массив additional_audio_tags добавить элемент:

Итак все готово. Сначала запускаем скрипт configure . После этого надо убедится, что описанные выше изменения в файлах libavcodec/codec_list.c и config.h сделаны. После чего можно запускать компиляцию:

Если компиляция прошла без ошибок, появляется исполняемый файл ffmpeg (или ffmpeg.exe , если целевой ОС является Windows). Выполняем команду

./ffmpeg -codecs >codecs.txt

и убеждаемся, что FFmpeg «видит» наши новые кодеки, в файле codecs.txt находим запись

DEA..S frox FROX audio (decoders: frox_dec) (encoders: frox_enc)

В этом разделе более подробно опишем, как может выглядеть структура контекста кодека и необходимые функции.

3.1. Контекст кодека

Контекст кодека может поддерживать установку опций. Для кодеров эта поддержка используется достаточно часто, для декодеров реже. Структура, поддерживающая установку опций, должна в качестве первого члена иметь указатель на структуру AVClass и далее сами опции.

Далее надо определить массив типа AVOption , каждый элемент которого и описывает конкретную опцию.

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

Далее надо определить экземпляр типа AVClass .

Указатель на этот экземпляр надо использовать для инициализации соответствующего члена AVCodec .

Теперь при выполнении функции

будет создан экземпляр структуры AVCodecContext и инициализирован член codec . Далее на основе значения codec->priv_data_size будет выделена необходимая память для экземпляра FroxContext , используя значение codec->priv_class первый член этого экземпляра будет инициализирован и после этого будет вызвана функция av_opt_set_defaults() , которая установит значений по умолчанию для опций. Указатель на экземпляр FroxContext будет доступен через член priv_data структуры AVCodecContext .

При работе с FFmpeg API значения для опций можно установить непосредственно.

Другой способ — это использование словаря опций, который будет передаваться третьим аргументом при вызове avcodec_open2() (см. ниже).

С помощью функции

можно получить список всех опций, поддерживаемых контекстом кодека. Это бывает полезно при исследовании кодека. Но перед этим надо обязательно проверить, что codec_ctx->codec->priv_class установлен в ненулевое значение, в противном случае контекст не поддерживает опций и при любой операции с опциями произойдет аварийное завершение программы.

3.2. Функции

Рассмотрим теперь подробнее, как устроены функции, используемые при инициализации кодека и фактического кодирования/декодирования. В них обычно всегда требуется получить указатель на FroxContext .

Функции frox_decode_init() и frox_encode_init() будут вызваны при выполнении функции

В них надо выделить необходимые ресурсы для работы кодека, и при необходимости инициализировать некоторые члены структуры AVCodecContext , например frame_size для аудиокодера.

Функции frox_decode_close() и frox_encode_close() будут вызваны при выполнении

В них надо освободить выделенные ресурсы.

Рассмотрим функцию для реализации декодирования

Она должна реализовать следующие операции:

  1. Фактическое декодирование;
  2. Выделение необходимого буфера для выходного кадра;
  3. Копирование декодированных данных в буфер кадра.

Рассмотрим, как надо выделять необходимый буфер для выходного кадра. Параметр outdata на самом деле указывает на AVFrame , поэтому сначала надо выполнить преобразование типа:

Далее надо выделить буфер для хранения данных кадра. Для этого надо инициализировать члены AVFrame , определяющие размер буфера кадра. Для аудио это nb_samples , channel_layout , format (для видео width , height , format ).

После этого надо вызвать функцию

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

Функция frox_decode() должна возвращать количество байт, использованных для декодирования, из пакета, на который указывает pkt . Если формирование кадра завершено, то переменной, на которую указывает outdata_size присваивается ненулевое значение, иначе эта переменная получает значение 0 .

Рассмотрим функцию для реализации кодирования

Она должна реализовать следующие операции:

  1. Фактическое кодирование;
  2. Выделение необходимого буфера для выходного пакета;
  3. Копирование закодированных данных в буфер пакета.

Для выделения необходимого буфер используется функция

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

Если формирование пакета завершено, то переменной, на которую указывает got_pkt_ptr присваивается ненулевое значение, иначе эта переменная получает значение 0 . В случае отсутствия ошибки, функция возвращает ноль, иначе код ошибки.

При реализации кодека обычно используется логгирование (для ошибок это можно считать обязательным требованием). Вот пример:

В этом случае при выводе в лог в качестве имени контекста будет использовано имя кодека.

3.3. Метки времени

Для задания времени в FFmpeg используется единица времени (time base), задаваемая в секундах с помощью рационального числа, представляемого типом AVRational . (Аналогичный подход используется в C++11. Например 1/1000 задает миллисекунду.) Кадры и пакеты имеют метки времени (timestamps), имеющие тип int64_t , их значения содержат время в соответствующих единицах времени. Кадр, то есть структура AVFrame , имеет член pts (presentation timestamp), значение которого определяет относительное время сцены, запечатленной в кадре. Пакет, то есть структура AVPacket , имеет члены pts (presentation timestamp) и dts (decompression timestamp). Значение dts определяет относительное время передачи пакета на декодирование. Для простых кодеков оно совпадает с pts , но для сложных кодеков может отличатся (например для h264 при использовании B-frames), то есть пакеты могут декодироваться не в том порядке в котором должны использоваться кадры.

Единица времени определена для потока и кодека, структура AVStream имеет соответствующий член — time_base , такой же член имеет структура AVCodecContext .

Метки времени пакета, извлеченного из потока с помощью av_read_frame() , будут заданы в единицах времени этого потока. При декодировании единица времени кодека не используется. Для видеодекодера она обычно просто не задана, для аудиодекодера имеет стандартное значение — обратное к частоте дискретизации. Декодер должен установить метку времени для выходного кадра основываясь на метках времени пакета. FFmpeg самостоятельно определяет такую метку и записывает ее в член best_effort_timestamp структуры AVFrame . Все эти метки времени будут использовать единицу времени потока, из которого извлечен пакет.

Для кодера необходимо задавать единицу времени. В клиентском коде, организующем декодирование, надо установить значение для члена time_base структуры AVCodecContext перед вызовом avcodec_open2() . Обычно берут единицу времени, используемую для меток времени кодируемого кадра. Если этого не сделать, то видеокодеры обычно выдают ошибку, аудиокодеры устанавливают значение по умолчанию — обратное к частоте дискретизации. Может ли кодек изменить заданную единицу времени, не вполне ясно. На всякий случай лучше всегда проверять значение time_base после вызова avcodec_open2() и, если оно изменилось, пересчитывать метки времени входных кадров на единицу времени кодека. В процессе кодирования необходимо установить pts и dts пакета. После кодирования, перед записью пакета в выходной поток необходимо пересчитать метки времени пакета с единицы времени кодека на единицу времени потока. Для этого можно воспользоваться функцией

При записи пакетов в поток необходимо гарантировать, чтобы значения dts строго возрастали, иначе мультиплексор выдаст ошибку. (Подробнее см. документацию на функцию av_interleaved_write_frame() .)

3.4. Другие функции, используемые кодеком

При инициализации экземпляра AVCodec можно зарегистрировать еще две функции. Вот соответствующие члены AVCodec :

Первая из них вызывается один раз при регистрации кодека.

Вторая сбрасывает внутреннее состояние кодека, она будет вызывается во время выполнения функции

Этот вызов необходим, например, при принудительном изменении текущей позиции проигрывания.

4.1. Подключение внешней функции

Такого решение может быть желательно по многим причинам. Вот некоторые из них:

  1. Кодек носит экспериментальный характер и часто меняется, а компиляция FFmpeg является довольно трудоемким процессом;
  2. Кодек написан не на C, а на другом языке, например на C++;
  3. Кодек использует библиотеки или framework, которые трудно интегрировать в FFmpeg.

Не смотря на закрытую, монолитную архитектуру FFmpeg такой вариант возможен и является вполне «законным», то есть для его реализации требуется только стандартный FFmpeg API. И ключом для решения этой задачи является механизм опций с помощью которого «внутрь» FFmpeg можно передать указатель на внешнюю функцию (или указатель структуру, содержащую указатели на внешние функции), которая и реализует требуемый функционал. Наиболее естественный вариант — это использование опций бинарного типа. В нашем примере для декодера можно предложить примерно следующее.

На стороне клиента FFmpeg API (в данном примере написан на C++) можно предложить примерно следующее.

4.2. Внешний декодер

Она из важных идей компьютерного мультимедиа — это отделение кодека от медиаконтейнера. В идеале медиаконтейнер любого типа может хранить медиапотоки, закодированные любым кодеком. Конечно, в реальности это не всегда выполняется. Мы видели, что для того, чтобы FFmpeg мог записать в контейнер медиапоток, мультиплексор должен «знать» кодек, так как необходимо записать идентифицирующую информацию о кодеке. А вот при чтении это уже не совсем так. Демультиплексор без проблем извлекает пакеты, закодированные неизвестным кодеком. Если клиент FFmpeg API может как-то идентифицировать этот кодек и умеет декодировать медиаданные, закодированные этим кодеком, то становится возможным воспроизведение таких медиаданных. У автора имеется подобный опыт. В свое время пришлось работать с одним видеорегистратором, который использовал аппаратное сжатие в некотором проприетарном формате. Сжатые данные переносились на PC (Windows) и затем записывались с помощью DirectShow в AVI файл. На PC имелся программный декодер для этого формата и на его основе был написан фильтр-декодер в стандарте DirectShow. Формат идентифицировался с помощью 32-битного FourCC. (Записывался в член biCompression структуры BITMAPINFOHEADER .) Таким образом, эти файлы воспроизводились на любом DirectShow проигрывателе при условии, что на PC был инсталлирован этот фильтр-декодер. При попытке воспроизвести такой файл с помощью FFmpeg проигрывателя декодер, естественно, не был найден, но член codec_tag структуры AVCodecParameters содержал вышеупомянутый FourCC, что решало проблему идентификации кодека. На основе имеющегося декодера для клиента FFmpeg API был написан дополнительный декодер, которому и передавался пакет. Таким образом проблема воспроизведения таких файлов была решена с помощью стандартной сборки FFmpeg и использования FFmpeg API.

В ряде случаев неизвестный кодек можно идентифицировать по метаданным потока, например в *.mkv файлах FFmpeg записывает туда имя кодека (свойство ENCODER ).

В данной статье рассматривались только изменения в коде, не рассмотрены изменения, которые необходимо внести в другие части FFmpeg: документации, changelog, систему контроля версий и т.д. Но если вы планируете «домашнюю» сборку FFmpeg, предназначенную только для конкретного проекта, то этого можно не делать.

Общие вопросы архитектуры FFmpeg

[5] FFmpeg Compilation Guide
[6] Compilation of FFmpeg 4.0 in Windows 10

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

Если же на компьютере или мобильном телефоне не открываются видео, загруженные с видеорегистратора или снятые отдельной камерой, в таком случае потребуется устанавливать дополнительное ПО.

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

Рассмотрим наиболее популярные проигрыватели для Windows, которые работают с кодеками h264 и h265:

VLC Media Player – продвинутый проигрыватель видео и аудио, основанный исключительно на свободном программном обеспечении. Плеер отличается малым потреблением ресурсов и высокой скоростью работы.


KMPlayer – один из наиболее популярных проигрывателей, поддерживающий огромное количество форматов видео, добавление сторонних эффектов во время воспроизведения, а также обладающий множество других функций. Недостаток у KMPlayer один — огромные требования к ресурсам компьютера, из-за чего он плохо работает на слабых ПК.


ALLPlayer – относительно молодой плеер, отличительной особенностью которого является проигрывание архивированных файлов без необходимости в их предварительной распаковки.


Для ПК существуют и другие проигрыватели, которые открывают файлы h264 и h265. Выбор программы зависит исключительно от предпочтений пользователя.

Также можно установить во встроенный в ПК Media Player какой-либо из современных пакетов с кодеками, которые в себя h264 и h265. К сожалению качественных пакетов кодеков существует не так уж и много. К ним можно причислить:

  1. K-Lite Codec Pack – один из наиболее распространённых и старых пакетов кодеков. Растространяется в нескольких редакторах, для воспроизведения видео с камер рекомендуется использовать редакцию Full или Mega, в остальных версиях могут отсутствовать необходимые компоненты. Также данный пакет позволяет установить на компьютер Media Player Classic.
  2. ADVANCED Codecs – более молодой, но при этом не менее продвинутый пакет кодеков. Помимо стандартных возможностей позволяет программно улучшать качество воспроизводимого видео, хотя делает он это весьма посредственно.
  3. Media Player Codec Pack – пакет медиакодеков, разработанный для встраивания исключительно в стандартный Windows Media Player. При его установке пользователю не будет предложено поставить альтернативный проигрыватель, в остальном он практически ничем не отличается от аналогов.
  4. XviD Codec – пакет кодеков, разработанный преимущественно для конвертации видео, нежели для его воспроизведения. Он отлично подойдёт в тех случаях, когда необходимо снимок с камеры перевести в понятный для большинства устройств формат. Для обычного воспроизведения хватит и предыдущих кодеков.
Также часто встречается неприятность, когда некоторые видеорегистраторы и ip-камеры делают снимки в необработанном формате (RAW), используя при этом кодек h264 или h265. В результате чего видео не открываются на других устройствах без предварительной переконвертации в более распространённые и понятные форматы. В основном с данной проблемой сталкиваются владельцы профессиональных камер, но и в системах видеонаблюдения она также изредка встречается.

Конвертировать видео из необработанного формата можно с помощью видеоредактора. Есть платные редакторы видео:

  1. Sony Vegas Pro – отличный видеоредактор от компании Sony, позволяющий не только конвертировать видео из одного формата в другой, но и выполнить множество других действий. В основном данное приложение используют для работы с камерами фирмы Sony, но и другие камеры/видеорегистраторы вполне поддерживаются.
  2. Adobe Premiere – видеоредактор от компании Adobe. Данное приложение придётся по вкусу пользователям другой продукции от компании, например Photoshop, поскольку все программы от Adobe имеют синхронизацию между собой.

Есть и бесплатные аналоги:

  1. OpenShot – бесплатный видеоредактор, основанный исключительно на свободном программном обеспечении. Отличительной особенностью программы является максимально простой и интуитивно понятный интерфейс.
  2. ShortCut – ещё один свободный редактор видео, отличающийся от предыдущего преимущественно интерфейсам.
Надеемся эта статья помогла Вам открыть сжатые видеокодеками h264 или h265 файлы.

Ну а мы напоминаем, что наша компания «Запишем всё» с 2010 года занимается проектированием, монтажом, обслуживанием и ремонтом систем видеонаблюдения и видеодомофонов в Москве и Подмосковье.

Мы работаем быстро, качественно и по доступным ценам. Перечень услуг и цены на их вы можете посмотреть здесь.

Как воспроизводить файлы H.264 и H.265 на плеере VLC и конвертировать в MP4?

Видеокодеки H.264 и H.265 сегодня являются наиболее распространенным для сжатия видео в системах видеонаблюдения. Но как воспроизводить сжатые этими кодеками файлы на компьютере под управлением Windows или Mac OS?

Проще и лучше всего для этого использовать видео проигрыватель VLC. Для этого нужно выполнить несколько действий:

Шаг 1. Загрузите последнюю версию VLC здесь и установите ее на свой компьютер.

Шаг 2. Запустите медиаплеер VLC. Перейдите в Инструменты, а затем нажмите Настройки.




Шаг 4. Выберите «H264 video demuxer» или HEVC/H.265 video demuxerв модуле Demux. Затем нажмите Сохранить.


После этого сжатое одним из этих кодеков видео можно просматривать на ПК или ноутбуке пол любой операционной системой в медиаплеере VLC.

Кому проще увидеть один раз, чем 10 раз прочесть, предлагаем посмотреть видеоролик.

Если у вас возникают проблемы и вы не можете воспроизводить видео H.264 или H.265 на проигрывателе VLC, попробуйте следующие советы по устранению неполадок, которые могут помочь решить проблемы:

Как конвертировать файлы H.264 в MP4

Другой способ воспроизвести видео H.264 на VLC заключается в том, чтобы сначала преобразовать файлы H.264 или H.265 в формат MP4, а затем воспроизвести видео на медиаплеере VLC. Однако в настоящее время большинство производителей видеонаблюдения предоставляют встроенные конвертеры, поэтому при экспорте видео они уже находятся в формате MP4.

Для преобразования файлов H.264 / H.265 в MP4 нужно:

Шаг 1. Используйте бесплатный видео конвертер, такой как VSDC Free Video Converter или Subler . Загрузите его и установите на свой компьютер.

Шаг 2. Нажмите « Добавить файлы » и добавьте файлы H.264 или H.265 , которые необходимо преобразовать.

Шаг 3. Выберите « MP4 » в качестве формата видео, в который вы хотите преобразовать.

Шаг 4. Нажмите « Преобразовать» , дождитесь завершения и нажмите « Сохранить» .

После того, как вы закончите преобразование файлов H.264 в формат MP4, вы сможете воспроизводить и просматривать видео в проигрывателе VLC.

Ну а мы напоминаем, что наша компания «Запишем всё» с 2010 года занимается монтажом, модернизацией и обслуживанием любых систем видеонаблюдения, а также видеодомофонов в Москве и Подмосковье.

Мы работаем быстро, качественно и по доступным ценам. Перечень услуг и цены на их вы можете посмотреть здесь.

Первые версии кодеков видеосжатия H.264 появились еще в 2013 году. Сегодня формат Н.265 уверенно вошел на рынок видеонаблюдения и диктует свои условия. Многие производители выпускают оборудование с поддержкой видеосжатия данного формата.

Формат сжатия H.264, в отличие от предыдущих кодеков MJPEG и MPEG-4 позволяет с высокой эффективностью решить задачу передачи большого количества видеопотоков высокого разрешения.

Использование в системах IP-видеонаблюдения формата H.264 обеспечивает высокое качество изображения при меньшем объеме данных, требует меньшую пропускную способность сети и меньший объем жестких дисков для хранения видеоархива. Однако есть и жирный минус. Использование Н.264 приводит к высоким нагрузкам на вычислительное оборудование.

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

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

Для снижения нагрузки на вычислительное оборудование также применяется технология видеоанализа сжатых видеопотоков от IP-камер без их полного декодирования. Применение этой технологии приводит к увеличению скорости обработки данных, за счет чего загрузка на центральный процессор снижается. Причем снижение может достигать в среднем в 4 раза.

Еще один минус кодека H.264 заключается в том, что большинство мобильных и web-клиентов для систем видеонаблюдения не поддерживают данный формат, и для того, чтобы получить видеоизображение, требуется процедура перекодирования видеопотока в MJPEG. Такая операция очень ресурсоемка и приводит к дополнительным нагрузкам на вычислительные ресурсы.

Обработка формата H.264 возможна при достаточно мощных вычислительных ресурсах мобильного устройства. Если ресурсов не хватает, видеопоток автоматически переключается в формат MJPEG. Да и сам пользователь может самостоятельно выбирать формат видеопотока.

Как видим плюсов и минусов у кодека H.264, применяемого для видеонаблюдения, достаточно много. Однако большая нагрузка на вычислительные ресурсы зачастую сводит все плюсы на нет.

Еще большую нагрузку несет новый формат Н.265. Он использует в своей работе более сильные и совершенные алгоритмы сжатия видео. При одинаковом визуальном качестве новый кодек Н.265 предполагает примерно двукратное уменьшение размера файла по сравнению с его предшественником Н.264. Это серьезно экономит место на дисковом пространстве регистраторов и видеосерверов. А вдвое меньший битрейт уменьшает трафик в сетях передачи видеоданных.

Благодаря более мощным механизмам компрессии, кодек Н.265 отлично справляется с кодированием видео высокого и высочайшего разрешения более 8K UHD (8192×4320). Причем для качественного воспроизведения видеоинформации разрешением 4К кодека необходим поток со скоростью всего 50 МВ/с.

Что немаловажно, Н.265 сжимает видео практически без потерь, качество сжатого видео остается на высоком уровне. Специальные алгоритмы компрессии устраняют присущие Н.264 артефакты, такие как зернистость или размытые края движущихся объектов.

Но самое главное преимущество кодека Н.265 заключается в том, что объем видео, обработанного по новому стандарту, оказался почти на 85% меньше, чем при использовании Н.264. Однако кодеку Н.265 требуется более мощные по производительности элементы и процессоры в оборудовании.

Двигаясь в направлении увеличесния сжатия видеоданных на рынке не так давно появился кодек H.265 + Он позволяет уменьшить битрейт с видеокамер, что в свою очередь снижает стоимость внедрения и использовать меньше дисковых массивов для хранения видеоархива.

H.265+ улучшает степень сжатия за счет трех ключевых технологий: технологии кодирования с предсказанием, технологии подавления фонового шума и технологии долгосрочного управления видеопотоком.

Как известно, камеры видеонаблюдения умеют различать моменты, когда на выделенном участке наблюдения ничего не происходит и в это время снижают качество, чтобы уменьшить нагрузку на сеть и место на жестком диске. Это может делать кодек Н.265, значения при этом все равно держатся около установленного максимума, в то время как Н.265+ может снизить его вдвое. Такая функция называется управление длительным битрейтом.

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

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


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

Сразу оговорюсь, что изначально статья не моя. Я наткнулся на неё, лет пять назад, когда встала задача что-то делать с записанными моментами из тогда любимой многими игры Battlefield 2, на популярном отечественном ресурсе мувимейкеров. Постепенно статья допиливалась и публиковалась, то там, то там. Не исключаю, что первоначально статья пришла из-за «бугра» и всего на всего была переведена на наш могучий язык.

Итак, кодек х264 пришел на смену таким монстрам своего времени как DivX и XviD и удачно положил обоих на лопатки. Для того, что бы добиться действительно впечатляющего результата, нам понадобится следующие вещи:
1. MeGUI — этим мы сжимаем само видео. Вернее, сжимает сам кодек, а это только GUI объединивший в себе десятки разных специализированных утилит.
2. Avisynth — фреймсервер. Если вдруг кто не знает, что это такое, то он является посредником между нашим не сжатым видео и кодеком.
3. VLC media player — Тут совсем все просто. Всеядный плеер, умеющий работать с потоковым видео. Достаточно популярный.
4. K-Lite Codec Pack — пакет все возможных кодеков, на все случаи жизни. Нам нужна сборка Mega.

Настоятельно рекомендую обновлять K-Lite Codec Pack, как минимум всегда перед сжатием видео. Это конечно не обязательно, но опыт подсказывает, что если вы столкнетесь с непонятными ошибками/косяками/глюками/etc то в 50%, а то и больше, обновление кодеков избавит вас от лишнего геморроя.
Кстати, MeGUI достаточно быстро и часто обновляется и дополняется. Скриншоты приведенные ниже, могут уже не соответствовать текущей версии, но это не страшно. Как правило, меняется расположение элементов, что то пододвинули вправо, что-то перенесли в другую закладку. Пропажа находится очень быстро, поэтому не пугайтесь.

Поехали. Устанавливаем Avisynth, а затем MeGUI. После того, как MeGUI обновится, идем в папку, где лежит наш опытный образец, и для удобства создаем там файл с расширением *.avs. Открываем блокнотом и пишем заветные строки:

Первая строка, подскажет MeGUI с каким файлом требуется работать. Вторая строка, указывает на используемую систему цветов.

Существует несколько различных способов представление цвета. Например: цветовое пространство YUV и RGB. В YUV цветовом пространстве есть один компонент, который представляет яркость (сигнал яркости) и два других компонента, которые представляют цвет (сигнал цветности). В то время как яркость передается со всеми деталями, некоторые детали в компонентах сигнала цветности могут быть удалены путем понижения разрешения отсчетов (фильтрация или усреднение), что может быть сделано несколькими способами (т.е. есть много форматов для сохранения изображения в цветовом пространстве YUV). YV12 — один из таких форматов (тут сигнал цветности общий для каждого блока пиксел 2x2), который поддерживается AviSynth.

У нас получился скрипт. Идем дальше. Открываем MeGUI и указываем месторасположение скрипта. Если скрипт AviSynth находится в той же папке где и ваше видео, то вторая строка заполнится автоматически.


Открываем настройки кодека, нажатием на кнопку Config, справа от Encoder settings. Ставим галочку, подтверждая, что нам действительно нужны расширенные настройки. Дальше нам остается поставить галочки в соответствии со скриншотами.










Нажимаем на кнопку queue и идем спать, пить кофе и т.д. в зависимости от предпочтений и мощностей ПК.

Хочу оговориться, что данный конфиг подходит для исходного видео 720p. Для 1080p нужно немного под редактировать конфиг:

Вкладка Frame-Type -> Меняем значение Number of Reference Frames с 9 на 4.

Так же можно указать, сколько кодеру можно использовать ядер:

Вкладка Misc -> раздел Other -> Threads и указываем, в сколько потоков сжимать видео. 1 поток на 1 виртуальное или физическое ядро.

Что мы получаем в итоге. Я имел в наличии следующий видео-ролик:

Format: RGB
Codec ID: 0x00000000
Codec ID/Info: Basic Windows bitmap format. 1, 4 and 8 bpp versions are palettised. 16, 24 and 32bpp contain raw RGB samples
Duration: 3mn 42s
Bit rate: 663 Mbps
Width: 1 280 pixels
Height: 720 pixels
Display aspect ratio: 16:9
Frame rate: 29.970 fps
Bit depth: 8 bits
Bits/(Pixel*Frame): 24.000
Stream size: 17.2 GiB (100%)

После ожидания около 15-16 минут, я получил на выходе 184 Мб.

Читайте также: