Два действия, которые часто путают
Задача «сделать из MKV файл MP4» может означать разное. В одном случае нужна новая оболочка вокруг тех же данных, в другом — новая запись самих данных с другим кодеком. Различие определяет и время работы, и результат, поэтому начинать стоит с выбора действия.
| Параметр | Перепаковка (копирование потоков) | Перекодирование |
|---|---|---|
| Что делает | Переносит готовые дорожки в другой контейнер | Распаковывает и сжимает дорожки заново |
| Время | Обычно минуты, ограничено скоростью диска | Заметно дольше, зависит от процессора |
| Качество | Не меняется, данные те же | Немного снижается при каждом цикле сжатия |
| Размер файла | Почти тот же | Может отличаться в любую сторону |
| Ограничения | Кодеки должны подходить для MP4 | Любые, можно выбрать удобные |
Для домашнего архива разумный порядок такой: сначала пробовать перепаковку, а к перекодированию переходить, только если устройству не подходят сами кодеки. Так оригинальное качество сохраняется, а на диске не появляется лишних сжатых поколений.
Перепаковка командой ffmpeg по шагам
ffmpeg — программа командной строки с открытым кодом, которую устанавливают из официальных источников проекта или из репозитория системы. Она умеет читать очень многие мультимедийные файлы и переносить дорожки между контейнерами. Работа выглядит так.
- Положите файл в простую папку и откройте в ней терминал или командную строку.
- Выполните команду: ffmpeg -i film.mkv -c copy film.mp4. Параметр -i задаёт исходный файл, а -c copy означает копирование без перекодирования.
- Дождитесь завершения. Программа выведет итоговую строку с размером и длительностью.
- Откройте результат на нужном устройстве и проверьте звук, субтитры и перемотку.
Без дополнительных указаний ffmpeg выбирает по одной дорожке каждого типа (видео, звук, субтитры), и если в MKV есть субтитры, не подходящие для MP4, команда может завершиться ошибкой: в таком случае добавьте параметр -sn, чтобы не переносить субтитры. Если в MKV несколько озвучек, добавьте параметр -map 0, и программа попытается перенести все потоки. Для MP4 это может закончиться ошибкой, если какой-то поток не допускается в этом контейнере, и тогда придётся перечислять нужные дорожки вручную, например -map 0:v -map 0:a:0.
Имена файлов с пробелами берите в кавычки. Исходный файл команда не изменяет, она создаёт новый, поэтому даже неудачная попытка оригинал не затрагивает.
Когда копирование не получится
Сообщение об ошибке при -c copy обычно означает, что одна из дорожек не может находиться в MP4. Чаще всего проблемы создают три вещи.
- Звук. Некоторые многоканальные и «студийные» форматы звука допустимы в MKV, но не в MP4. Звук можно перекодировать отдельно, оставив видео копированием: -c:v copy -c:a aac.
- Графические субтитры. Субтитры, хранящиеся как картинки, в MP4, как правило, напрямую перенести нельзя. Текстовые субтитры можно преобразовать параметром -c:s mov_text, который задаёт формат текстовых субтитров для MP4.
- Кодек видео. Если видео записано кодеком, который контейнер MP4 не принимает, копирование невозможно, и нужен полный цикл перекодирования.
Отдельный случай — главы и вложенные файлы, например шрифты для оформленных субтитров. MP4 поддерживает главы, но способ их хранения отличается, и при перепаковке часть служебных данных может не перейти. Если без них не справиться, лучше оставить архивную копию в MKV и сделать MP4 только для просмотра.
Прежде чем что-то менять, посмотрите состав файла программой ffprobe, как описано на странице о контейнерах и кодеках. Со списком потоков перед глазами проще решить, что копировать, а что преобразовывать.
Перекодирование, если оно нужно
Когда устройство не открывает кодек видео, приходится кодировать его заново. Типичный вариант — получить универсальное сочетание H.264 и AAC: ffmpeg -i film.mkv -c:v libx264 -crf 20 -c:a aac film.mp4. Параметр -crf задаёт качество кодека x264: шкала идёт от 0 до 51, меньшее число означает более высокое качество и больший файл, значение по умолчанию равно 23. Для домашнего просмотра выбирают значение около двух десятков, а точное число подбирают пробой на коротком фрагменте.
Параметр -preset (медленнее — меньше размер при том же качестве) позволяет обменять время на объём. Если нужен фрагмент для проверки, добавьте -t 60: программа обработает только первую минуту, и результат можно посмотреть на устройстве до запуска полной работы.
Важный практический момент: каждое перекодирование слегка ухудшает изображение, потому что сжатие с потерями применяется к уже сжатому материалу. Поэтому разумно кодировать один раз из оригинала, а не делать копию с копии. И не удаляйте исходник, пока готовый файл не проверен на целевом устройстве полностью, включая перемотку и конец записи.
Проверка результата и порядок хранения
Готовый файл стоит проверить до того, как оригинал уйдёт с диска. Достаточно нескольких минут: так вы заметите проблемы, которые иначе всплывут через год, когда исходника уже не будет.
- Сравните длительность исходного и нового файла: они должны практически совпадать.
- Проверьте число дорожек звука и субтитров в ffprobe или в проигрывателе.
- Промотайте файл в начало, середину и конец. Рассинхронизация звука иногда проявляется только после перемотки.
- Откройте файл на устройстве, ради которого шла работа, например на телевизоре.
Храните результат рядом с оригиналом, в папке с понятным именем. Правила для имён файлов и папок описаны на отдельной странице, а о том, как не потерять архив при поломке диска, рассказывает правило резервного копирования 3-2-1. Если фильм записан вами или получен законным путём, имеет смысл хранить оригинальный MKV как исходный материал, а MP4 считать рабочей копией для просмотра. Тогда при смене устройств или при появлении более подходящего формата вы сможете повторить преобразование из исходных данных, а не из уже пережатой копии.