FAQ по обработке видео файлов для "чайников"

Submitted by slava on 3 November 2017

Общая информация

Устройство видеофайла

Большинство видеофайлов представляет собой контейнер (container), в который вкладывается один или несколько аудио- и/или видео- потоков (stream), закодированных тем или иным кодеком (codec). Контейнер, поток и кодек - это основные понятия, которые нужно понимать и уметь отличаться друг от друга.

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

Часто поток невозможно воспроизвести без знания дополнительной информации. Для аудиофайлов такой информацией, например, может быть частота дискретизации (44Khz или 48Khz?), или информация о том, идёт ли кодирование с постоянным битрейтом (cbr), или переменным (vbr). Для видеофайлов существует гораздо больше таких параметров: размер кадра (FullHD или 4K?), битрейт, цветовое пространство, и т.д. Если кодек не подразумевает фиксированных значений для этих параметров, то необходим какой-то способ передавать эти параметры вместе с потоками данных в виде одного файла. Контейнером как раз и называют формат хранения таких параметров вместе с одним или несколькими аудио- и/или видео-потоками.

Существуют контейнеры, которые могут хранить в себе всего один поток и только в формате одного конкретного кодека (или семейства кодеков). Например, файлы с расширением .mp3 могут содержать в себе всего один аудиопоток, и только в формате следующих кодеков: "MPEG-1 Layer 3" (основной), "MPEG-2 Layer 3" или "MPEG-2.5 Layer 3". А файлы с расширением .ac3 могут содержать в себе аудиопотоки кодеков семейства AC3. При этом если нужно перенести аудио из .mp3 файла в .ac3 файл требуется перекодирование всего потока из одного формата в другой. А вот аудиопотоки из .aac контейнера можно перенести в .m4a контейнер без перекодирования, так как .m4a - более универсален (хотя и предназначен только для аудио).

Контейнеры для видеофайлов могут в себе содержать как аудио-, так и видео- потоки, но при этом для них также существуют ограничения на поддерживаемые форматы потоков. Наиболее известными в настоящий момент являются контейнеры .mp4 и .mkv, причём .mkv является более универсальным (поддерживает большее число форматов), а .mp4 - более "стандартным" (поддерживается большим числом устройств, медиаплееров и компьютеров "из коробки", без установки дополнительного программного обеспечения).

В Wikipedia можно посмотреть список существующих контейнеров для мультимедиа файлов с указанием поддерживаемых ими кодеков (и ещё список контейнеров для аудиопотоков).

Типовые операции

Нелинейный монтаж (NLE)

Из бесплатных программ для монтажа готового фильма из отдельных кусочков стоит упомянуть Avidemux. Но есть нюансы: а) поддерживается только простые операции обрезки/склейки; b) эти простые операции иногда приводят к рассинхронизации видео и звука. В реальности пользоваться этой программой довольно неудобно, хотя мне несколько раз она помогала при перекодировании семейного архива с DVD в современный формат.

Вторая бесплатная программа - VSCD Free Video Editor. Сам ею не пользовался, но для простенького монтажа её должно хватить. Внимание: судя по отзывам в Интернет, раньше в инсталлятор вкладывали кучу рекламы, за что программа получила репутацию malware. Сейчас, насколько я понимаю, они больше так не делают, но стоит быть осторожным.

Также популярна бесплатная DaVinci Resolve, но она ужасно требовательна к ресурсам компьютера (и у меня вылетает с ошибкой).

Из платных программ одной из самых популярных является Adobe Premiere, но мне показалась более удобной и простой в использовании VEGAS Movie Studio (ранее распространялась Sony, но недавно была выкуплена фирмой Magix). Для обработки FullHD видео пользуюсь версией Movie Studio Platinum 12, и мне её (вместе с замечательным бесплатным плагином AAV ColorLab) вполне хватает для склейки, вставки простеньких титров и небольшой цветокоррекции. Много лет назад имел опыт работы с Pinnacle Studio, но рекомендовать её не могу, так как тогда она очень часто вылетала в процессе создания итогового видео (т.е. основную свою работу практически не выполняла).

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

Склейка потоков в контейнеры (muxing)

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

В обоих случаях помогут программы-muxer'ы:

  • для склейки потоков в .mkv подойдёт замечательная бесплатная программа MKVToolNix
  • для склейки в .ts и .m2ts можно использовать tsMuxer

Также можно использовать бесплатную консольную утилиту ffmpeg. Да, консоль - это прошлый век, и я долго игнорировал эту утилиту. Но теперь не понимаю, как я мог обходиться без неё раньше.

Для переноса потоков из одного контейнера в другой с помощью ffmpeg её нужно запустить со следующими ключами, которые отключат перекодирование исходных видео- и аудио- потоков:

ffmpeg -i "D:\path\to\source\file.mp4" -c:a copy -c:v copy "E:\path\to\target\file.mkv"

Обрезка и склейка потоков без перекодирования

Если нужно обрезать начало или конец видео без его перекодирования, то могут помочь уже упомянутые Avidemux и ffmpeg. При этом следует учесть, что современные кодеки хранят не каждый видеокадр, а только ключевые (I-frame и B-frame), достраивая остальные на основе ключевых. В связи с этим, для того, чтобы исключить перекодирование, отрезать приходится строго по этим ключевым кадрам (а они могут находиться за пару секунд от желаемого места). Avidemux с этим справляется не всегда хорошо (замечал рассинхронизацию звука и видео), а вот с ffmpeg проблем не замечал (он сам ищет ближайший ключевой кадр и обрезает по нему).

Обрезка/склейка через ffmpeg

Ключи для обрезания видео через ffmpeg:

ffmpeg -i "D:\path\to\source\file.mp4" -c:a copy -c:v copy -ss 35 -t 7200 "E:\path\to\target\file.mkv"

Здесь ключ -ss задаёт время, с которого нужно оставлять видео, а ключ -t задаёт ограничение на длительность итогового видео. В примере в итоговый файл попадёт 7200 секунд (или меньше, если видео короче, чем 7200 секунд) начиная с 35 секунды исходного файла. Кроме количества секунд время в параметрах можно указывать и в виде чч:мм:сс - см. документацию по ключам ffmpeg.

Если нужно склеить видео из одного файла, а аудио - из другого, то это можно сделать с использованием следующих ключей:

ffmpeg -i "D:\path\to\source\video.m2ts" -i "D:\path\to\source\audio.m4a" -map 0:v -map 1:a -c:a copy -c:v copy "E:\path\to\target\file.mkv"

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

Обрезка/склейка через Avidemux

  1. Открыть первый файл и добавить к нему следующие (если есть; например, если исходное видео - образ DVD, то необходимо открыть все .vob файлы по-очереди);
  2. Перемещаясь между ключевыми кадрами через нажатие на клавиатуре стрелок вверх и вниз, найти начало и конец каждого отрезаемого участка, отметить их кнопками “[“ и “]”, после чего вырезать через через CTRL+X;
  3. В настройках выбрать “copy” в качестве кодировщика для видео и звука, а также установить выходной формат (для DVD видео - “Mpeg-PS Muxer”);
  4. Сохранить файл через “Save as”.
     

Перекодирование в другой формат потока

Существует два вида перекодирования: a) transcoding - когда сам кодек не меняется, но ухудшаются какие-то из его параметров (например, снижается битрейт); b) re-encoding - когда либо происходит смена кодека (например, перекодируется mpeg-поток из .vob контейнера с DVD диска в H264 формат в .mkv контейнер), либо меняются какие-то существенные параметры самого потока (например, видео было обрезано не по ключевому кадру, и теперь приходится сначала раскодировать все кадры, а потом закодировать их вновь, но начиная уже с другого ключевого кадра).

Transcoding быстрее, но из-за ограничений (не все программы умеют так делать, не все кодеки такое позволяют, не часто такое вообще бывает необходимо) применяется гораздо реже. Мне помогало ускорить процесс сжатия огромного количества mp3 файлов до размера CD диска за счёт снижения битрейта до 192kbps.

Нужно понимать, что и тот, и другой тип перекодирования, в-общем случае, снижают качество потока на выходе по сравнению с тем, что был на входе. Хотя бывают исключения: например, при перекодировании исходника с DVD в H264 можно получить видео, которое будет казаться лучше, так как, для увеличения степени сжатия, алгоритм H264 "усредняет" кадры, что приводит к уменьшению количества шумов. Но такой фокус не пройдёт с качественным исходным потоком - детали будут утеряны (хотя и не всегда это будет заметно на глаз).

Существует много разных программ для перекодирования, но одной из самых простых и удобных, как ни странно, для меня оказалась консольная утилита ffmpeg, которую я упоминал выше. Она "всеядная" и умеет открывать множество типов контейнеров и работать с большим количеством форматов потоков. Она умеет выводить полученный результат во все основные популярные контейнеры. Она имеет множество ключей, что позволяет не просто осуществить перекодирование, но и применить дополнительные фильтры (например, немного повысить резкость за счёт применения фильтра unsharp mask).

Сложно описать все существующие для неё ключи, поэтому я опишу несколько типовых вариантов её использования.

Например, устройства Apple довольно привередливы и "из коробки" умеют открывать ограниченное количество контейнеров. В частности, просто так посмотреть .mkv на iPad не получится - iTunes попросит совместимый формат (а именно: h264-видео и aac-аудио с определёнными параметрами в контейнере mp4).

Перекодировать видео в такой формат, который сможет открыть любое устройство Apple начиная с iPad 2 и новее, можно следующей командой:

ffmpeg -y -i "D:\path\to\source.container" -c:v libx264 -preset slower -tune film -profile:v high -level 4.1 -crf 23 -c:a aac -b:a 384k -f mp4 "E:\path\to\target.mp4"

Эту же команду можно использовать для сжатия больших видео в .mp4 файлы меньшего размера. На размер итогового файла влияют следующие ключи:

  • "-b:a 384k" - указывает битрейт результирующего аудио-потока; увеличение числа увеличит качество звука за счёт увеличения итогового файла (для стерео звука смысла ставить больше 480k нет); снижение - уменьшит размер файла за счёт снижения качества (но снижение ниже 192k будет "экономией на спичках")
  • "-crf 23" - задаёт "желаемое качество" итогового видео; на основании этого параметра кодек будет менять битрейт видео, увеличивая его для участков с большим количеством деталей, и уменьшая его для участков с меньшим количеством деталей или с большим количеством "движения" в кадре. Обычно отправной точкой рекомендуется выбирать именно число 23 (так как оно обычно даёт оптимальное соотношение качества видео к размеру файла), и дальше уже постепенно либо снижать его, если нужно улучшить качество картинки (общепринятым "разумным минимумом" считается 18 - дальше изменения становятся практически незаметны), либо увеличивать, если нужно уменьшить размер итогового файла.
  • "-preset slower" - позволяет уменьшить размер итогового видео за счёт увеличения времени кодирования; можно найти тесты, которые рекомендуют использовать в качестве отправной точки именно "slower", переходя на "slow", если скорость оказывается слишком медленной. И только в крайнем случае переходя на "standard", который используется по-умолчанию.

Аудио можно также перекодировать через ffmpeg, но удобнее может оказаться бесплатная программа Audacity, упомянутая выше.

Применение сложных фильтров с помощью AviSynth

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

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

Процесс использования AviSynth выглядит следующим образом:

  1. Пользователь устанавливает AviSynth и необходимые плагины и фильтры (в большинстве случаев их достаточно скопировать в поддиректорию plugins директории, куда был установлен AviSynth; например: C:\Program Files (x86)\AviSynth\plugins\)
  2. Пользователь в любом текстовом редакторе уровня notepad создаёт .avs файл (скрипт), где перечисляет, какие видео- и аудио- файлы нужно открыть, и какие плагины и фильтры нужно к ним применить.
  3. Пользователь открывает этот .avs файл как обычный видеофайл в программе, которая имеет поддержку AviSynth, и уже с помощью этой программы кодирует итоговые видео и аудио потоки нужными кодеками и в нужный контейнер.

В качестве программы, которая умеет открывать .avs файлы, могу порекомендовать следующие:

  • Simple x264/x265 Launcher имеет очень простой интерфейс и позволяет закодировать результат работы AviSynth кодеком H264; к недостаткам можно отнести отсутствие аудиопотока в итоговом виодефайле (т.е. необходимо выполнять всю работу со звуком в отдельной программе, после чего выводить его в отдельный файл и выполнять muxing с видео, полученным на выходе из этой программы)
  • virtualdub предоставляет больше возможностей, чем первая, но в качестве выходного контейнера поддерживает только морально устаревший .avi (есть версия с возможностью вывода в mpeg файлы - virtualdubmod, но она уже также устарела)

Также существуют плагины к некоторым программам для монтажа, позволяющие открывать .avs в них в качестве исходного видео (с последующим кодированием в нужный кодек/контейнер). К сожалению, для моей Vegas Movie Studio такого плагина я не нашёл.

Есть четыре версии AviSynth:

  • 32-битная версия без поддержки многопоточности (x86 ST)
  • 32-битная версия с поддержкой многопоточности (x86 MT)
  • 64-битная версия без поддержки многопоточности (x64 ST)
  • 64-битная версия с поддержкой многопоточности (x64 MT)

Какую версию нужно использовать зависит от того, в какой программе будут открываться .avs скрипты (в 32-битной, или в 64-битной), а также от того, какие существуют версии необходимых плагинов AviSynth.

Общей рекомендацией является использование x86 ST версии (на момент написания статьи такой версией была "v.2.6.0 ST, 32-bit"), так как для неё существует наибольшее количество плагинов, а по скорости во многих случаях отставание от MT будет несущественным.

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

Качественный deinterlace DVD/HDV видео через AviSynth

У меня есть много старых семейных видео, снятых HDV камерой. Монтаж исходных файлов был осуществлён без перекодирования (для сохранения качества), но размер файлов получился довольно значительный. Современные кодеки (H264 и H265) позволяют сжать такие видео без заметной потери качества, но есть проблема: HDV - это MPEG-кодек, кадр 1440x1080 и 50 кадров в секунду с чрезстрочной развёрткой (interlaced - "50i"), которая подразумевает, что у чётных кадров хранятся только чётные линии, а у нечётных - нечётный (или наоборот, в зависимости от камеры). Современные процессоры умеют качественно достраивать отсутствующие линии (это называется deinterlace) в файлах с MPEG-кодеком на лету так, что отсутствие этой информации не заметно для глаза. Но, видимо, данная функция не включается при воспроизведении interlaced файлов закодированных через H264, и при просмотре таких видео появляется "расчёска" на границах движущихся объектов.

Та же проблема присуща и архивным DVD-видео, большинство из которых также были записаны в формате 50 кадров в секунду с чрезстрочной развёрткой.

Чтобы эту проблему решить необходимо выполнить процесс deinterlace видео программно перед кодированием в H264. К сожалению, существующие быстрые deinterlace фильтры приводят либо к заметному ухудшению качества картинки, либо к недостаточному удалению "расчёски", либо к падению количества кадров в секунду с 50 до 25 (с 60 до 30).

На помощь приходит AviSynth, для которого существует пусть не быстрый, но очень качественный deinterlace-фильтр QTGMC.

Пример .avs файла для запуска этого фильтра:

# Load plugins
LoadPlugin("C:\Program Files (x86)\AviSynth\plugins\mvtools2.dll")
LoadPlugin("C:\Program Files (x86)\AviSynth\plugins\masktools2.dll")
LoadPlugin("C:\Program Files (x86)\AviSynth\plugins\nnedi3.dll")
LoadPlugin("C:\Program Files (x86)\AviSynth\plugins\RemoveGrainSSE2.dll")
LoadPlugin("C:\Program Files (x86)\AviSynth\plugins\RepairSSE2.dll")
import("C:\Program Files (x86)\AviSynth\plugins\QTGMC-3.33.avsi")

# Load audio stream
LoadPlugin("C:\Program Files (x86)\AviSynth\plugins\LSMASHSource.dll")
global OPT_AllowFloatAudio=True
LWLibavAudioSource("e:\path\to\audio.m4a")

# Load video stream
LoadPlugin("C:\Program Files (x86)\AviSynth\plugins\DGDecode.dll")
mpeg2source("e:\tmp\2009-08 - 3 years.d2v")

# Resize
Spline36Resize(1920,1080)

# Deinterlace
QTGMC(Preset="Slow")

На выходе вы получите FullHD кадр (1920x1080) с 50 кадрами в секунду и прогрессивной разверткой (сохраняются все 1080 линий у каждого кадра).

Открытие разных форматов исходных файлов

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

В моём случае исходные файлы с HDV камеры лежали в .mts файлах. Для их открытия необходимо использовать DGMPGDec - пакет, включающий в себя утилиту создания .d2v файлов и AviSynth плагин для открытия таких файлов в качестве источника видео.

В примере выше используется плагин LSmashSource для загрузки звуковой дорожки из контейнера m4a.

Если необходимо открыть .ac3 файл, то это можно сделать следующим образом:

# Открытие видео источника
LoadPlugin("C:\Program Files (x86)\AviSynth\plugins\DGDecode.dll")
v = mpeg2source("E:\source.d2v")

# Открытие источника звука
LoadPlugin("C:\Program Files (x86)\AviSynth\plugins\NicAudio.dll")
a = NicAC3Source("E:\source T80 2_0ch 256Kbps DELAY 16ms.ac3")

# Синхронизация звука и видео
AudioDub(v, a)

Превращение 25fps DVD в плавное видео с 50fps

Несколько .vob файлов с DVD диска можно склеить без перекодирования в один .mpg контейнер, после чего открыть его следующим образом:

# Здесь остальные команды с загрузкой требуемых плагинов
# ...

DirectShowSource("O:\source.mpg", fps=25, audio=true, convertfps=true)

# Если неверно определяется, в каких кадрах лежат чётные/нечётные строки,
# то можно принудительно указать это одной из следующих команд
# AssumeTFF()
# AssumeBFF()

# Конвертируем видео в цветовое пространство, поддерживаемое QTGMC
ConvertToYV12()

# Deinterlace
QTGMC(Preset="Slow")

# Так как исходное видео было 25 кадров в секунду, просим достроить недостающие кадры
AssumeFPS("pal_double",sync_audio=true)

В этом примере, кроме открытия mpg источника, показана ещё одна возможность AviSynth - превращение видео с 25 кадрами в секунду в "полноценные" 50 кадров в секунду.

Да, это будут "ненастоящие" 50 кадров в секунду, так как половина из них была "придумана" и "догадана" фильтрами и плагинами AviSynth. Но, тем не менее, это позволяет увеличить "плавность" воспроизведения такого видео по сравнению с воспроизведением исходного видео с 25 кадрами в секунду.

Upscale кадра и/или изменение aspect ratio через AviSynth

Иногда требуется увеличить размер кадра. Например, есть исходных широкоформатный DVD клип, который, согласно спецификации на DVD, хранится в видеопотоке с разрешением 720x576 (соотношение сторон исходного потока, т.е. SAR - source aspect ratio, равно 5:4), но при этом отображается в области с соотношением ширины к высоте равным 16:9 (DAR, display aspect ratio). А нам нужно использовать этот клип при монтаже итогового видео с разрешением 1280x720 (в котором пикселы квадратные, а DAR = SAR = 16:9).

Контейнер для DVD файлов содержит в себе информация о том, что SAR отличается от DAR, и плееры корректно масштабируют изображение. Но, во-первых, не все контейнеры умеют хранить в себе такую информацию (некоторые вообще не отличают DAR от SAR, храня единственный aspect ratio и считая точки квадратными), а, во-вторых, не все программы для монтажа корректно импортируют такие видео в проект, а если импортируют, то не всегда хорошо выполняют само масштабирование.

Таким образом, нам нужно взять исходное видео и увеличить размер кадра, "вписав" его в желаемое разрешение (и сделав тем самым пикселы квадратными). Можно это сделать простым масштабированием кадра, например, через вызов встроенного в AviSynth фильтра Spline36Resize, но для получения лучшего качества можно использовать следующий фильтр:

nnedi3_rpow2(rfactor=2, cshift="Spline36Resize", fwidth=1280, fheight=720)

Этот фильтр сначала увеличивает исходный кадр в 2 раза (rfactor) до 1480x1152, "достраивая" недостающие точки, после чего уменьшает и "втискивает" картинку в размер 1280x720 (fwidth и fheight).

Для ускорения работы фильтра можно попробовать использовать LanczosResize вместо Spline36Resize.

Другая ситуация: есть неширокоформатный DVD, и нам нужно использовать его при монтаже видео с разрешением 1280x720. Исходный кадр с DVD по прежнему хранится с соотношением сторон 5:4 (SAR), но теперь он отображается уже с соотношением сторон 4:3 (DAR). Кроме этого, на границах кадра есть "мусор", оставленный здесь VHS камерой. Итого, нам нужно сделать следующее:

  • отрезать "DVD-мусор" с краёв кадра, сохранив при этом aspect ratio самого кадра (4/3); в моём случае мне нужно было отрезать 26 линий внизу и 4 линии вверху, в сумме это даёт 30 линий, поэтому для сохранения соотношения сторон кадра нужно также ещё отрезать 30/3*4 = 40 столбцов; слева в кадре также было немного мусора, поэтому остановился на таких значениях: отрезать 24 пиксела слева, 4 - сверху, 16 - справа, и 26 - снизу.
  • увеличить получившийся кадр до 720 точек в высоту, изменив при этом pixel aspect ratio и сделав точки квадратными (т.е. ширина кадра должна быть равна 720/3*4 = 960);
  • добить кадр слева и справа чёрными рамками, чтобы вписать 4/3 кадр в широкоформатный 16/9; ширина каждой такой рамки = (1280-960)/2 = 160.

Всё это можно сделать одной строкой в AviSynth:

Spline36Resize(960,720,24,4,-16,-26).AddBorders(160,0,160,0)

 

 

Tags

Add new comment

Plain text

  • No HTML tags allowed.
  • Lines and paragraphs break automatically.
  • Web page addresses and email addresses turn into links automatically.
By submitting this form, you accept the Mollom privacy policy.