Форматы видеофайлов
Контейнеры
Бинарная структура видеофайла описывается его медиаконтейнером. Их понимают такие приложения как, например, видеоплееры и FFmpeg, который мы обсуждаем. Разные пакеты умеют работать с разным набором контейнеров. Когда вы загружаете свое видео в Ютуб — это один набор, когда проигрываете файл с помощью Windows Media Player — другой. FFmpeg умеет работать практически с любыми.
Сразу стоит отметить, что если ваше приложение или устройство «умеет» работать с определенным контейнером, то это ни в коей мере не гарантирует, что оно сумеет разобраться с любым файлом в этом формате. Стандарты развивались в течении долгого периода времени, да и приложения имеют склонность поддерживать их ограниченное подмножество возможностей.
- .AVI — наверно самый старый контейнер, до сих пор имеющий хождение. Подавляющее большинство приложений умеет с ним работать.
- .MP4 — возможно самый широко распространенный контейнер на настоящий момент времени. Сложно найти современное приложение, которое не умело бы с ним работать.
- .MKV (Матроска) — самый современный формат, (иногда даже слишком) активно развивающийся и поддерживающий самые широкие возможности. Однако далеко не любое приложение умеет с ним работать или делать это правильно. Еще несколько лет назад видео в основном распространялось в форматах .AVI или .MP4, а Матроска была только для гиков. Пакет MKVToolNix специализируется на Матроске и если он не сумел с ней справиться, то скорее всего уже больше никто.
- .WebM — формат, основанный на подмножестве Матроски. Его активно продвигает Гугл для, как вы могли понять из названия, веб приложений. Его использование для обычного видео контента (пока еще?) не имеет широкого распространения.
- .VOB и .M2TS — контейнеры для соответственно ДВД и блю-рэй видео. Очевидно, что соответствующие аппаратные устройства умеют с ними работать. Видеоплееры и другие видео приложения обычно тоже.
Видеоконтейнер включает в себя набор потоков, таких как видео (изображение), аудио, субтитры и разного типа вспомогательный материал. Каждый из потоков представлен в определенном бинарном формате.
Кодирование видео изображений
- MPEG-2 — сейчас в основном используется для кодирования ДВД, блю-рэй и в цифровом телевидении. Он отличается невысокой степенью сжатия и, как следствие, файлами большого размера (по сравнению с другими современными форматами).
- MPEG-4 Part 2 — в настоящее время вы скорее всего с ним столкнетесь в версии кодировщиков DivX или Xvid. Для нового видео его лучше не использовать, стандарт стремительно устаревает.
- MPEG-4 Part 10, который также известен под названиями AVC, H.264 и (по имени кодировщика) x264, — самый популярный современный формат. Никаких принципиальных причин сейчас им не пользоваться не существует, если, конечно, вы не собираетесь проигрывать ваше видео каким-то экзотическим приложением.
- MPEG-H Part 2 или HEVC, H.265 или x265 — новый стандарт, продвигаемый в качестве замены H.264. По утверждениям разработчиков, он обеспечивает то же самое качество видео, что и H.264, при от полутора до 2-х раз меньшем размере файла. Почему я все же не рекомендую им пользоваться?
- В моей практике при установке одинакового целевого уровня качества размер файла формата H.265 мог оказаться как меньше, так и больше H.264 случайным образом.
- Кодирование в формате H.265 занимает больше времени.
- Хотя стандарт H.265 неплохо поддержан современными приложениями, но все же не всегда.
- В видео сообществе существует настоящая аллергия на H.265. Я неоднократно встречал утверждения, что при одинаковом размере файла качество видео в формате H.265 всегда хуже, чем H.264.
- Никаких других преимуществ, кроме сомнительного уменьшения размера, стандарт H.265 не предоставляет.
Кодирование звука
- FLAC — формат со сжатием без потерь.
- MP3 — один из самых старых и широко поддержанных форматов. Однако он проигрывает по многим параметрам более современным и его роль сходит на нет.
- AC-3 или Dolby Digital — столь же старый формат, как и MP3, но упорно не желающий сдавать свои позиции. Из Dolby Digital пришли такие перки, как 5.1, 7.1 и TrueHD.
- DTS — конкурент Dolby Digital со степенью похожести вплоть до неотличимости. По таинственной причине разнообразный софт (включая FFmpeg) имеет склонность в самый неожиданный момент ловить глюки при работе с DTS. В этом случае перекодируйте целую звуковую дорожку в AAC и случится щастье.
- AAC — современный формат группы MPEG, специально созданный для замены MP3. Я рекомендую его использовать во всех случаях, когда у вас нет необходимости в чем-то по-настоящему экстраординарном.
Кодирование субтитров
- SRT — субтитры являются обычным текстом с информацией о времени начала и окончания каждого фрагмента.
- ASS/SSA — в дополнение к информации SRT в них присутствует множество атрибутов форматирования текста: его положение на экране, шрифт, цвет и многое другое. Современные приложения не делают различий между субтитрами ASS и SSA.
- Существует еще множество различных текстовых форматов субтитров с возможностями, близкими SRT/ASS. Однако в настоящий момент ни один из них даже близко не приближается по популярности и поддержке к упомянутым.
- VobSub/PGS/DVB subtitles — субтитры в виде комбинации временных меток и графических образов, которые накладываются на видео с помощью программ или аппаратуры. Форматы используются в соответственно ДВД, блю-рэй и цифровом телевидении и поддержаны некоторыми программными пакетами и плеерами.
- Субтитры, которые интегрированы в видео и являются его неотъемлемой частью. Такой тип субтитров называют хардсаб (hardsub[bed]). FFmpeg и HandBrake умеют конвертировать ASS в графические образы и интегрировать их в выходной видео поток.
Как узнать формат медиафайла и его элементов?
С помощью пакета FFmpeg. В подразделе «Интеграция FFmpeg в Far Manager» 1-й части статьи приведены примеры результатов работы утилиты FFprobe по нажатию кнопки Alt-F3.
Input #0, matroska,webm, from 'Sakuga Affection - Invitation-v3.mkv': Metadata: ENCODER : Lavf58.29.100 Duration: 00:00:35.01, start: 0.000000, bitrate: 15455 kb/s Stream #0:0: Video: h264 (High), yuv420p(progressive), 3840x2160, 25 fps, 25 tbr, 1k tbn, 50 tbc (default) Metadata: ENCODER : Lavc58.54.100 libx264 DURATION : 00:00:35.011000000 Stream #0:1: Audio: aac (LC), 96000 Hz, stereo, fltp (default) Metadata: ENCODER : Lavc58.54.100 aac DURATION : 00:00:34.982000000
- Контейнер — matroska или webm.
- Поток #0 — видео h264.
- Поток #1 — аудио aac.
Input #0, flac, from '01 - Lum no Love Song.flac': Metadata: ALBUM : Urusei Yatsura Complete Music Box CD 1 [KTCR-9018] ARTIST : Yuuko Matsutani DATE : 1994 GENRE : Anime TITLE : Lum no Love Song track : 01 TOTALDISCS : 15 Duration: 00:02:42.00, start: 0.000000, bitrate: 919 kb/s Stream #0:0: Audio: flac, 44100 Hz, stereo, s16
- Формат — «flac».
Опорные кадры видео изображений
Почти все современные форматы бинарного представления видео изображений основаны на следующей идее. В видео потоке выделяются отдельные кадры, следующие через некоторые (нефиксированные) промежутки времени (обычно от доли секунды до нескольких десятков секунд), которые называются ключевыми, опорными или I-кадрами (I-frame).
Опорные кадры отличаются от остальных в следующем. Не-опорные кадры невозможно вывести на экран без информации от других кадров. Опорный можно вывести сам по себе. В результате видео поток разбивается на временные отрезки (group of pictures, GOP), каждый из которых начинается с опорного кадра. Если вам нужно вывести на экран очередной кадр, а по каким-то причинам информация о предыдущих кадрах потеряна, то на экран будет выводиться мусор вплоть до того момента, пока в потоке не появится новый опорный кадр.
- Значительная часть видео приложений (включая FFplay) использует системную поддержку вывода на экран, которая часто требует, чтобы воспроизведение видео начиналось с опорного кадра. В свою очередь это определяется аппаратными средствами. Поэтому навигация по видео в таких пакетах возможна только по опорным кадрам. VLC — один из немногих пакетов, не имеющих подобного ограничения.
- Разрезание видео без потерь качества возможно только в том случае, если оно производится по опорным кадрам.
Потери при сжатии изображений и звука
Обратите внимание, что алгоритмы сжатия бывают с потерями и без потерь по определению. То есть прямо в описании формата указывается, сжимает ли он с потерями, или без них. Из всех уже упомянутых в статье форматов только H.264 с специальной опцией «-crf 0» и FLAC сжимают без потерь. Для графических файлов таковым является PNG.
Примеры преобразований без потерь: (MPEG-2 ⭢ H.264 crf 0), (H.264 ⭢ H.264 crf 0), (H.264 crf 0 ⭢ H.264 crf 0), (H.265 ⭢ H.264 crf 0), (MP3 ⭢ FLAC), (AC-3 ⭢ FLAC), (DTS ⭢ FLAC), (FLAC ⭢ FLAC), (JPG ⭢ PNG), (PNG ⭢ PNG).
Примеры с потерями. (DTS ⭢ MP3) — очевидно. (MP3 ⭢ DTS) — тоже с потерями. То есть исходный MP3 файл обеспечит лучшее качество аудио, чем супер накрученный DTS после самого лучшего преобразования. Еще один не очевидный случай: (H.264 ⭢ H.264) с абсолютно теми же самыми атрибутами, что и исходный, будет преобразован с потерями. Хуже того, многократно перекодируя одно и то же видео (H.264 ⭢ H.264), вы будете терять качество на каждой перекодировке.
Как минимизировать потери? Перекодировки (H.264 ⭢ H.264), (H.264 ⭢ H.264 crf 0 ⭢ H.264) и (H.264 ⭢ H.264 crf 0 ⭢ H.264 crf 0 ⭢ H.264) приведут к одной и той же потере качества.
Имеются ли исключения? Все они описываются одним правилом: потерь не будет в том случае, если перекодировка в реальности не будет произведена. В FFmpeg для этого недостаточно указать параметры выходного видео/аудио такими же, как и исходного. Для этого необходимо явно указать кодек «-c copy». MKVToolNix так делает всегда потому, что он перекодировать просто не умеет.
Ошибки в исходных файлах
- Попытайтесь его конвертировать один-в-один с помощью MKVToolNix или с помощью указанной команды FFmpeg. В моей практике это иногда помогало.
C:\Bin\ffmpeg -i "in_name.ext" -c copy "out_name.mkv"
- Попытайтесь перекодировать файл целиком с помощью FFmpeg. В моей практике это часто помогает. Почему пункт 1 стоит перед 2-м? а). Конверсия в пункте 1 производится без потери качества. б). Она выполняется быстрее.
C:\Bin\ffmpeg -i "in_name.ext" -c:v libx264 -c:a aac "out_name.mkv"
- Были случаи, когда после долгих боданий мне удавалось это сделать с помощью совершенно левых пакетов, таких как, например, FormatFactory.
- Вопрос: «Почему бы сразу не воспользоваться возможностью сохранения видео в VLC?» Ответ: «VLC это делает ужасно медленно и очень криво. Но в качестве самой крайней меры сгодится и он».
Третья часть статьи находится здесь.
