Что вам необходимо знать о видеофайлах

Описываются основные форматы видеофайлов и их составных частей: изображения, звука и субтитров.
Это вторая часть статьи «Практическое руководство по FFmpeg».

Форматы видеофайлов

Контейнеры

Бинарная структура видеофайла описывается его медиаконтейнером. Их понимают такие приложения как, например, видеоплееры и FFmpeg, который мы обсуждаем. Разные пакеты умеют работать с разным набором контейнеров. Когда вы загружаете свое видео в Ютуб — это один набор, когда проигрываете файл с помощью Windows Media Player — другой. FFmpeg умеет работать практически с любыми.

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

Тип медиаконтейнера обычно можно определить по расширению имени видеофайла. В практике вы чаще всего будете сталкиваться с следующими:
  • .AVI — наверно самый старый контейнер, до сих пор имеющий хождение. Подавляющее большинство приложений умеет с ним работать.
  • .MP4 — возможно самый широко распространенный контейнер на настоящий момент времени. Сложно найти современное приложение, которое не умело бы с ним работать.
  • .MKV (Матроска) — самый современный формат, (иногда даже слишком) активно развивающийся и поддерживающий самые широкие возможности. Однако далеко не любое приложение умеет с ним работать или делать это правильно. Еще несколько лет назад видео в основном распространялось в форматах .AVI или .MP4, а Матроска была только для гиков. Пакет MKVToolNix специализируется на Матроске и если он не сумел с ней справиться, то скорее всего уже больше никто.
  • .WebM — формат, основанный на подмножестве Матроски. Его активно продвигает Гугл для, как вы могли понять из названия, веб приложений. Его использование для обычного видео контента (пока еще?) не имеет широкого распространения.
  • .VOB и .M2TS — контейнеры для соответственно ДВД и блю-рэй видео. Очевидно, что соответствующие аппаратные устройства умеют с ними работать. Видеоплееры и другие видео приложения обычно тоже.

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

Кодирование видео изображений

Подавляющее число современных видео файлов кодируются в одной из версий стандарта MPEG.
  • 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), каждый из которых начинается с опорного кадра. Если вам нужно вывести на экран очередной кадр, а по каким-то причинам информация о предыдущих кадрах потеряна, то на экран будет выводиться мусор вплоть до того момента, пока в потоке не появится новый опорный кадр.

В практике все это имеет значение в следующих ситуациях:
  1. Значительная часть видео приложений (включая FFplay) использует системную поддержку вывода на экран, которая часто требует, чтобы воспроизведение видео начиналось с опорного кадра. В свою очередь это определяется аппаратными средствами. Поэтому навигация по видео в таких пакетах возможна только по опорным кадрам. VLC — один из немногих пакетов, не имеющих подобного ограничения.
  2. Разрезание видео без потерь качества возможно только в том случае, если оно производится по опорным кадрам.

Потери при сжатии изображений и звука

Обратите внимание, что алгоритмы сжатия бывают с потерями и без потерь по определению. То есть прямо в описании формата указывается, сжимает ли он с потерями, или без них. Из всех уже упомянутых в статье форматов только 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 так делает всегда потому, что он перекодировать просто не умеет.

Ошибки в исходных файлах

Время от времени вы будете сталкиваться с тем, что FFmpeg (или другой пакет) не будет способен распознать исходный файл или обрабатывать его с ошибками. При этом вы можете быть уверены, что принципиальных проблем с самим файлом не существует например потому, что он без проблем проигрывается на VLC. В этом случае:
  1. Попытайтесь его конвертировать один-в-один с помощью MKVToolNix или с помощью указанной команды FFmpeg. В моей практике это иногда помогало.
    C:\Bin\ffmpeg -i "in_name.ext" -c copy "out_name.mkv"
  2. Попытайтесь перекодировать файл целиком с помощью FFmpeg. В моей практике это часто помогает. Почему пункт 1 стоит перед 2-м? а). Конверсия в пункте 1 производится без потери качества. б). Она выполняется быстрее.
    C:\Bin\ffmpeg -i "in_name.ext" -c:v libx264 -c:a aac "out_name.mkv"
  3. Были случаи, когда после долгих боданий мне удавалось это сделать с помощью совершенно левых пакетов, таких как, например, FormatFactory.
  4. Вопрос: «Почему бы сразу не воспользоваться возможностью сохранения видео в VLC?» Ответ: «VLC это делает ужасно медленно и очень криво. Но в качестве самой крайней меры сгодится и он».

Третья часть статьи находится здесь.

Marple Mashu Marces AnimationОпубликовано 10 сентября 2020 г.
Последние изменения 30 сентября 2020 г.