Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Видео и аудио: обработка и кодирование (http://forum.oszone.net/forumdisplay.php?f=45)
-   -   Изменение контейнера из mkv/avi в mp4 + кодирование видео и аудио. (http://forum.oszone.net/showthread.php?t=235751)

Pasha_49 01-06-2012 14:33 1926075

Изменение контейнера из mkv/avi в mp4 + кодирование видео и аудио.
 
Доброго времени суток! Пытаюсь настроить автоматическое "кодирование" фильмов из mkv/avi в mp4. Нужно сделать это автоматизированно и максимально быстро.
Цель: просто поменять контейнер, без перекодирования и потери качества, с сохранением всех звуковых дорожек, субтитров, и т.д. Нужно чтоб эти фильмы можно было проигрывать в flash плеере, и на компьютере через обыкновенные плееры.

Для mkv: Поскольку нужно всё автоматизировать и сделать максимально быстро, то придётся извращаться. MP4 контейнер требует звук в aac. Видео в контейнере mkv уже ужато всяческими x264. Поэтому видео кодировать не нужно, достаточно извлекать видео дорожку. Аудиодорожки тоже надо извлекать. Те, что в aac мы только извлекаем. А те, что в ac3, dts, придётся перекодировать в aac.
К сожалению не нашёл метода кодирования сразу всего файла. Для автоматизации всё будет кодироваться на линуксе, и нужны только консольные программы. ffmpeg не умеет адекватно кодировать фильмы из mkv в mp4 с сохранением качества, и всех дорожек. Он по умолчанию берет только первую дорожку, вырезая остальные. Параметры -map 0:1 и т.д. в 50% работают некорректно(т.к. видео файлы бывают разными, и даже при правильном указании количества дорожек ffmpeg часто ругается).
Пришлось с помощью mediainfo, или mkvmerge, или ffprobe пропарсить всю информацию о видео файле. С помощью mkvextract tracks извлечь все дорожки, сабы. С помощью ffmpeg перекодировать ac3, dts аудиодорожки в aac. А потом MP4Box'ом упаковать в mp4 контейнер с перемещением метаданных в начало. Всё работает отлично, видео можно смотреть на любом плеере с выбором аудиодорожек. Смотреть во flash и html5 плеере с перемоткой на любой момент(псевдостриминг).
Но сталкнулся с проблемой. Например для кодирования видео рамером около 10-30 GB. Если в видеофайле много звуковых дорожек, то чем больше дорожек в получаемом MP4 файле, тем дольше его открывают все плееры. Возможно причина в том, что плеер не может нормально определить продолжительность фильма. В исходном файле длина виде и аудио дорожек одинакова. Но в mp4 некоторые аудиодорожки могут отличаться по длине от видео. И чем больше таких дорожек, тем проблемнее открыть видео(плеер может минуту думать и вычислять длину фильма).

Почему при извлечении дорожек и упаковке их в mp4 меняется продолжительность? Как можно "исправить" mp4 файл, чтоб он нормально открывался при большом количестве аудиодорожек? Или может кто знает другой способ кодирования mkv в mp4 без потери качества и дорожек?

DJ Mogarych 03-06-2012 10:31 1927127

Был бы Виндоуз, может быть, подошли бы Xvid4PSP или Freemake Video Converter, с линуксом помочь, к сожалению, не могу.

vadblm 03-06-2012 17:18 1927300

Можете попробовать avidemux-cli
Код:

$ avidemux2_cli \
> --nogui \
> --video-codec COPY \ #( или X264, если в исходнике не H.264)
> --audio-codec AAC \ #(или COPY, если в исходнике уже AAC)
> --output-format MP4
> --load input.mkv \
> --save output.mp4

У меня минутный семпл 720p в вышеприведённом примере перепаковало за 6 секунд, одной командой.

По поводу нескольких дорожек ничего не могу сказать, документация к CLI-версии avidemux скудновата, с разбегу не нашёл, как выбирать. Субтитры отвалились (а разве MP4 умеет их держать в себе?) В общем, пробуйте, может у вас лучше получится. :)

Pasha_49 04-06-2012 11:16 1927676

Спасибо за совет, попробую. mp4 - это контейнер как и mkv, в него можно всё запихнуть. Чувствую что скорость кодирования уже не так важна(хотя кодироваться будут терабайты). Главное, чтоб работало)


Время: 08:00.

Время: 08:00.
© OSzone.net 2001-