В предыдущей части разговор был о том, как работает сжатие с потерями.
Хорошо, если ваша фотокамера снимает в RAW: это формат, который сохраняет максимум данных, и с которым затем можно делать что угодно.
Но если изображение кодируется в JPEG, мы становимся заложниками этого формата: каждое новое пересохранение файла снова выбрасывает из него полезную информацию, и качество ухудшается.
Например, вы сняли фото на телефон, и затем обнаружили, что оно повёрнуто не так. В галерее телефона есть функция поворота. Хорошо, мы повернули изображение, сохранили его повторно, и... сделали хуже? Вероятно, да.
Можно ли избежать этого?
Да, можно, и давайте посмотрим как.
1. Поворот
Ранее мы обсуждали, что информация в JPEG кодируется блоками 8*8 пикселов. Каждый такой блок независим от других. А значит, если немного заморочиться с алгоритмом поворота, картинку можно сохранить в оригинальном качестве. Для этого нужно изменить направление чтения внутри каждого блока, и переставить местами сами блоки. Мы не трогаем уже упакованную информацию, а только меняем её ориентацию.
Многие программы умеют делать поворот JPEG-изображения без потерь. Я пользуюсь программой FastStone Image Viewer – это удобный и быстрый просмотрщик картинок, который обладает также минимальными функциями редактирования.
2. Обрезка
Бывает нужно вырезать из картинки кусок и сохранить его. Что делать в этом случае?
Опять же нам поможет тот факт, что JPEG-изображение состоит из блоков 8*8, независимых друг от друга. Значит, какие-то блоки можно попросту выбросить, а информация в оставшихся никак не изменится.
В программе FastStone есть функция обрезания JPEG без потерь, но у неё есть одно натуральное ограничение. Линия разреза не может проходить внутри блока. Отрезать можно только целое количество блоков, и значит, размеры вырезаемого куска должны быть кратны 8. Впрочем, за этим не надо следить – программа сама округлит размер до ближайшего подходящего значения.
Вот, пожалуй, основное, что вы можете сделать с 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.
Группа кадров от 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.