Найти в Дзене
ZDG

Как не испортить JPEG и MP4 при редактировании

Оглавление

В предыдущей части разговор был о том, как работает сжатие с потерями.

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

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

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

Можно ли избежать этого?

Да, можно, и давайте посмотрим как.

1. Поворот

Ранее мы обсуждали, что информация в JPEG кодируется блоками 8*8 пикселов. Каждый такой блок независим от других. А значит, если немного заморочиться с алгоритмом поворота, картинку можно сохранить в оригинальном качестве. Для этого нужно изменить направление чтения внутри каждого блока, и переставить местами сами блоки. Мы не трогаем уже упакованную информацию, а только меняем её ориентацию.

Многие программы умеют делать поворот JPEG-изображения без потерь. Я пользуюсь программой FastStone Image Viewer – это удобный и быстрый просмотрщик картинок, который обладает также минимальными функциями редактирования.

2. Обрезка

Бывает нужно вырезать из картинки кусок и сохранить его. Что делать в этом случае?

Опять же нам поможет тот факт, что JPEG-изображение состоит из блоков 8*8, независимых друг от друга. Значит, какие-то блоки можно попросту выбросить, а информация в оставшихся никак не изменится.

В программе FastStone есть функция обрезания JPEG без потерь, но у неё есть одно натуральное ограничение. Линия разреза не может проходить внутри блока. Отрезать можно только целое количество блоков, и значит, размеры вырезаемого куска должны быть кратны 8. Впрочем, за этим не надо следить – программа сама округлит размер до ближайшего подходящего значения.

-2

Вот, пожалуй, основное, что вы можете сделать с JPEG без дальнейших потерь. Если же вам требуется сделать что-то более серьёзное, то пересохраняйте отредактированное изображение в формате без потерь (например, PNG). Это позволит избежать дальнейшего ухудшения качества.

3. Наложение музыки на видео

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

Видео- и аудиодорожки существуют отдельно друг от друга, поэтому можно заменить аудио, не трогая видео вообще.

Для этого вам понадобится программа, которая понимает, как не навредить.

Можно поискать опцию "замена звуковой дорожки" в том видеоредакторе, которым вы пользуетесь. Но на самом деле это делается гораздо проще (хотя с виду и сложнее). Нужно установить пакет ffmpeg, который очень часто идёт в комплекте с другими программами.

Соединить видео и звук можно просто через командную строку:

ffmpeg.exe -i video.mp4 -i audio.mp3 -map 0:v:0 -map 1:a:0 -codec copy output.mp4

Да, понимаю, что выглядит громоздко, но давайте разберём подробно:

Параметр -i задаёт входные файлы. В данном случае у нас их два: видеофайл video.mp4 и аудиофайл audio.mp3.

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

-map 0:v:0 – это означает, что дорожка номер 0 будет видео, и в неё нужно записать дорожку номер 0 из нашего входного видео.

-map 1:a:0 – это означает, что дорожка номер 1 будет аудио, и в неё нужно записать дорожку номер 0 из нашего входного аудио.

Наконец,

-codec copy – означает, что ничего перекодировать не надо, надо просто скопировать дорожки из входных файлов.

Последний параметр output.mp4 – это имя финального файла. И буквально за пару секунд, без всякого перекодирования, звуковая дорожка заменена.

4. Разрезание и склейка видео

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

Чтобы понять, как этого избежать, давайте рассмотрим, как устроены кадры в видео:

I-Frame

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

Вслед за I-Frame идёт несколько кадров, которые содержат не изображения, а разницу между кадрами. Они называются P-Frame и/или B-Frame.

-3

Группа кадров от I-Frame до следующего I-Frame так и называется: Group of Pictures (GOP).

Длина этой группы может быть 3, или 6, или 12 кадров и т.д.

Только I-Frame является полноценным изображением, которое можно вытащить из видео без потерь. А всё остальное – разница, которая накапливается с каждым следующим кадром, и чем дальше мы удаляемся от оригинального I-Frame, тем хуже становится качество, пока не появится очередной I-Frame, в котором информация обновляется полностью.

Это значит, что одна группа GOP является неделимым и самодостаточным элементом видео, подобным блоку в JPEG. Можно разрезать видео так, чтобы выкинуть из него группу GOP целиком, и тогда в оставшихся кусках ничего не изменится. Точно также можно и склеить видео по границе GOP.

Ограничение будет такое же, как для JPEG: нельзя разрезать видео по любому кадру, можно только по I-Frame.

В некоторых камерах есть режим съемки All-Intra. Это значит, что каждый кадр видео будет I-Frame, и значит разрезать его можно в любом месте.

Для разрезания и склеивания видео без потерь можно использовать или программу MPEG_Streamclip, или программу Avidemux. Они обе бесплатные.

Что касается остальных операций редактирования, там потерь, увы, не удастся избежать. А поэтому лучший выход – выбирать максимальное качество сразу при съёмке и отдавать приоритет тем кодекам, у которых короче GOP.