Добрый день. Помогите разобраться автоматическим с кнвертированием видео файлов из 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 файле, тем дольше его открывают все плееры. Возможно причина в том, что плеер не может нормально определить продолжительность фильма. В исходном файле длина видео и аудио дорожек одинакова. И чем больше таких дорожек, тем проблемнее открыть видео (плеер может несколько минут думать и вычислять длину фильма, при перемотке столько же).
Есть ещё проблема, что при кодировании аудио, ffmpeg имеет какой-то ограничение по битрейту. Исходный файл например с битрейтом 700кб/с, при указании этого же битрейта при кодировании аудио в ffmpeg, он становится максимум 408. И возможно именно из-за е понятного кодирования звуковыхо дорожек - становится проблемным файл. Пробовал ещё одним методом (Перекодирование в wav с помощью mplayer, а потом neroAacEnc перекодировал в aac). В таком случае конечный mp4 файл открывается быстро, прежних проблем нуту. Но появляются другие: При кодировании в wav битрейт увеличивается, и перекодировании в aac файл увеличивается в несколько раз (битрейт был 500, стал 1000). И так же при просмотре этого файла на половине плееров, при выборе другой аудиодорожки, предыдущая не отключается(начинают одновременно играть 2 дорожки).
Кто-нибудь знает рабочий способ конвертирования контейнеров из mkv/avi в mp4 с сохранением качества, дорожек, субтитров, и с конвертированием аудио в aac?
ffmpeg, mkv, mp4, video, кодирование