Маленькая зарисовка из жизни.
Есть видеофайл MPEG (изначально DVD-рип), запись сезона одного сериала. Стоит задача - нарезать его обратно на DVD так, чтобы можно было посмотреть на бытовом проигрывателе за $10, да не просто куском, а с меню, чтобы ты кнопочку - тыц и оно тебе эпизод - рраз!
Внезапно оказалось, что сие сделать совсем не так просто.
Конвертировать ничего не нужно - качество и размер уже устраивает - нужно преобразовать контейнер в тот, который скушает dvdauthor. FFmpeg это делает, но почему-то...
ffmpeg -i side_a.mpeg -codec copy -f dvd p1.mp4
было:
Stream #0:0[0x1e0]: Video: mpeg2video (Main), ...
Stream #0:1[0x80]: Audio: ac3, ...
стало:
Stream #0:0[0x1bf]: Data: dvd_nav_packet
Stream #0:1[0x80]: Audio: ac3, ...
Stream #0:2[0x1e0]: Video: mpeg2video (Main), ...
Т.е видео- и аудио- потоки поменялись местами. И вроде бы ничего страшного, любой плеер это съест и не подавится - это, в принципе, норма. Но вот dvdauthor кушать такие файлы отказывается - молвит человечьим голосом, что нет внутри контейнера видео - он рассчитывает на то, что видеопоток будет в файле первым! С другой стороны, никакими хитростями (-map и тп) не удается заставить FFmpeg поменять потоки местами обратно в рамках указанного контейнера. В avi - пожалуйста, в mpeg - тоже меняется, а вот в dvd - обломс.
В багзиллах обоих проектов (FFmpeg и dvdauthor) данный баг висит уже не первый год, но исправления нет до сих пор.
Есть еще mencoder, но с ним еще интереснее. Во-первых, в нужный формат он не конвертирует. Во-вторых, если его использовать как промежуточное звено (сначала из MPEG в что-нибудь, потом - уже при помощи FFmpeg - из чего-нибудь в нужный формат), потоки местами поменять удается, но mencoder вносит в процессе перекодирования совершенно жуткий рассинхрон между аудио и видео, который ничем не лечится.
К чему это я? Просто работать в Linux с видео и аудио невероятно удобно и эффективно :)