Как преобразовать файл .mkv в файл .mp4 без потерь?

119

Мне нужно конвертировать видеофайл из контейнера Matroska в контейнер mp4. Файл Matroska содержит одну видеодорожку h.264 и одну звуковую дорожку AC3. Это должно быть возможно сделать без потерь, но как это сделать с помощью встроенных инструментов Ubuntu?

Транскодирование не вариант.

Сеппо Эрвиаля
источник
Смотрите этот вопрос .
Binarylife
2
это особенно решение для преобразования файлов Matroska, которые не воспроизводятся на телевизоре Samsung, в файлы, совместимые с ним
knocte
На протяжении многих лет я нашел это очень полезным в качестве Chromecastподставки H.264с контейнером AACили MP3в MP4нем. Это очень легко для потоковой передачи видео с вашего компьютера, Chromecastесли у вас есть Chrome с расширением Google Cast. Просто перетащите файл MP4с правильной кодировкой потока в окно браузера и начните потоковую передачу.
Сеппо Эрвиаля

Ответы:

164

Возможно, самый простой инструмент для этого ffmpegили avconvиз libav-toolsпакета. Libav - это форк FFmpeg, на который Ubuntu перешла за несколько лет до Ubuntu 15.04. Это один из бэкэндов для многих инструментов GUI, упомянутых в других ответах.

Изменение контейнера без повторного добавления контента не может быть проще:

ffmpeg -i input.mkv -codec copy output.mp4
  • Он автоматически определяет преобразование контейнера Matroska в MP4 на основе имен файлов ввода / вывода.

  • -codec copyпотоковые копии или «повторное мультиплексирование» потоков от входа к выходу без перекодирования. Думайте об этом как о копировании и вставке.

  • По умолчанию при выборе потока выбирается только один поток на тип потока. Например, если ваш вход имеет два видеопотока и один аудиопоток, то будет выбран только видеопоток с наибольшим размером кадра. Добавить, -map 0если вы хотите выбрать все потоки из ввода.

  • Некоторые контейнеры могут не поддерживать некоторые форматы. Поэтому проверить , если ваш выбранный контейнер формата, будь то mkv, mp4или даже aviподдерживает все содержимое в ваших файлах (видео, аудио, субтитры, данные и т.д.). Например, mp4не поддерживает SubRip субтитры ( .srtфайлы).

MestreLion
источник
6
Чтобы перекодировать аудио в AAC, оставив видео в формате AVC: avconv -i input.mkv -c:v copy -c:a libfaac output.mp4(я использовал ffmpeg, я полагаю, что avconv имеет те же аргументы командной строки)
camh
@camh: То, что вы сказали, работает, но, пожалуйста, обратите внимание на 2 вещи: 1) видео останется без изменений, независимо от того, является ли он AVC или чем-то еще; 2) Он будет конвертировать не только аудио в AAC, но и формат контейнера из mkv в mp4
MestreLion
1
@AquariusPower: просто знайте, что OP не хочет переназначать потоки: он хочет преобразовать только контейнер и сохранить все потоки.
МестреЛион
2
@ AquariusPower: вы пытались просто -map 0получить оба аудиопотока? Как я сказал в ответе: «Поведение выбора потока по умолчанию состоит в том, чтобы выбирать только один поток для каждого типа потока»
MestreLion
1
Используйте -c:s mov_textопцию, если вам нужно сохранить, например. srtдорожка субтитров.
Сеппо Эрвиала
25

Получить необходимое программное обеспечение

sudo apt-get install gpac mkvtoolnix

Извлечение видео и аудио из файла Matroska

Для начала необходимо проверить, какие дорожки содержит файл matroska.

mkvmerge --identify video.mkv

File 'video.mkv': container: Matroska
Track ID 1: video (V_MPEG4/ISO/AVC)
Track ID 2: audio (A_AC3)

Затем извлеките видео и аудио в соответствии с их треками:

mkvextract tracks video.mkv 1:video.h264 2:audio.ac3

Extracting track 1 with the CodecID 'V_MPEG4/ISO/AVC' to the file 'video.h264'. Container format: AVC/h.264 elementary stream
Extracting track 2 with the CodecID 'A_AC3' to the file 'audio.ac3'. Container format: Dolby Digital (AC3)
Progress: 100%

Mux аудио и видео в MP4 контейнер

MP4Box -fps 24 -add video.h264 -add audio.ac3 video.mp4

AVC-H264 import - frame size 1280 x 720 at 24.000 FPS
Import results: 31671 samples - Slices: 5672 I 125048 P 122648 B - 32288 SEI - 4936 IDR
AC3 import - sample rate 48000 - 6 channels
Saving to video.mp4: 0.500 secs Interleaving

Мне пришлось добавить -fps 24опцию, потому MP4Boxчто не правильно определяет видео fps. В зависимости от использования AC3звуковая дорожка должна быть перекодирована во что-то другое перед муксингом.

Теперь вы перепутали потоки из контейнера matroska в контейнер mp4 без потери качества.

РЕДАКТИРОВАТЬ: MP4 официально не поддерживает аудио AC3, поэтому аудиодорожка должна быть преобразована в поддерживаемый формат (например, AAC, MP3), если вы хотите, чтобы файл мог воспроизводиться с чем-то еще, кроме VLC.

Сеппо Эрвиаля
источник
1
Будет ли это работать с субтитрами?
CyberSkull
11

Вы можете использовать Avidemux

Имеет хороший графический интерфейс.

При преобразовании из mkv в mp4 он не перекодируется.

Преобразование выполняется в течение минуты (для 60-минутного видео).

  1. sudo apt-get install avidemux

  2. Откройте файл mkv в avidemux.

  3. Выберите безопасный режим, если будет предложено.

  4. Оставьте видео как копию.

  5. Выберите Файл-> Свойства. Проверьте, есть ли аудиокодек aac.

    1. Если аудиокодек НЕ aac, выберите aac(faac).
    2. В противном случае оставьте это как copy. (Иногда при использовании этой опции звук может быть не синхронизирован или искажен, в этом случае выберите aac(faac)вместо этого.)
  6. Выберите mp4для формата.

  7. Выберите сохранить, выберите местоположение и введите имя файла с .mp4расширением.

Примечание: иногда (вероятность ~ 10%) может произойти сбой. Тогда используйте handbrake(re-encode).

Примечание 2: есть две ссылки, которые помогут вам:

http://www.ubuntugeek.com/avidemux-free-video-editor-designed-for-simple-cutting-filtering-and-encoding-tasks.html

http://www.ubuntugeek.com/how-to-convert-mkv-file-into-mp4-file-using-avidemux.html

loksena
источник
Работал как шарм. У меня были проблемы с синхронизацией после принятого ответа, но не с этим.
Мораес
работает очень хорошо
psychok7
-2

Поскольку MPEG Part 14 изначально поддерживает h.264 и AC3 без транскодирования, вы можете просто переименовать файл, чтобы он имел .mp4расширение вместо .mkvрасширения.

Ричард
источник
3
Он может поддерживать кодеки внутри, но это не значит, что он будет работать в приложении, которое не понимает Matroska. Это будет работать, только если приложение поддерживает Matroska и смотрит на магическое число вместо расширения.
Арда Си
Переименование файла не преобразует формат контейнера, и это может запутать приложение (и пользователей). Как сказал @ArdaXi, приложение все равно должно поддерживать Matroska для его воспроизведения.
MestreLion
-2

Вы можете попробовать HANDBRAKE , добавив его PPA, введя этот код в терминал:

sudo add-apt-repository ppa:stebbins/handbrake-releases
13east
источник
Это похоже на видео транскодер. Я не хочу снова сжимать видео дорожку, так как она уже в формате h.264.
Сеппо Эрвиаля
1
Handbrake - отличный транскодер, но я бы никогда не использовал его для преобразования форматов файлов.
CyberSkull
1
Я очень люблю Handbreak, но, к сожалению, он работает без потерь только для аудио (и субтитров). Я не мог найти способ скопировать видео без перекодирования, и ОП специально запросил преобразование формата без потерь.
МестреЛион