Advanced Search
Welcome to Omgili,
Omgili (Oh My God I Love It ;) is a search engine for discussions. With Omgili you can find answers and solutions, debates, discussions, personal experiences, opinions and more... To learn more about Omgili click here.

This is a complete preview of the discussion as it was indexed by Omgili crawlers. Use this preview if the original discussion is unavailable.
Click here to view the original discussion.

Как конвертировать в avi сбойные ("неконвертируемые") mpg-файлы - CGTALK.RU – Профессионалы компьютерной графики и визуальных эффектов. Анимация и 3D графика.

А также как конвертировать в avi сбойные файлы других типов. Иногда может возникнуть такая ситуация.

Вы скачали через торрент файл с расширение .mpg (или с другим).

Казалось бы, такой mpg-файл должен вообще без проблем проходить через DGIndex и просматриваться плеерами.

Но не тут-то было.

DGIndex его сплёвывает, некоторые плееры его хоть и воспроизводят, но через пень-колоду, другие вообще не берут, конвертеры также отказываются корректно конвертировать, Virtual Dub Mod вроде бы открывает, но показывает только часть изображения.

Проблема заключается в том, что видео в таком сбойном файле может быть закодировано MPEG-1 (!!), частота кадров и разрешение в заголовке указаны некорректно, и в некоторых других причинах. Если вы в точности, не халтуря и не пытаясь что-либо упростить, выполните все приведённые ниже инструкции, то результат порадует вас своим жреческим качеством.

Поехали. Запускаем GSpot, открываем файл.

Первая причина сбоя может быть в том, что в заголовке неправильно указана частота кадров в секунду.

Смотрим в подокно "Frames/s".

Если там видим, например, 59.941 – то это явно неправильная частота.

Для определения истинной частоты кадров в секунду используем Elecard Converter Studio, или tsMuxerGUI.

Определили. Обычно это будет 23.97, 25 или 29.97 кадров/сек. Теперь смотрим в подокно "pic".

В нём указано то разрешение, с которым записано видео в файле.

Например, 704x480.

В подокне "seq ext" указано то разрешение, с которым, скажем так, якобы надо выводить картинку на экран.

Например, 1920x1080.

В этом – вторая причина сбоя.

Откройте хороший vob-файл, и вы увидите, что там окно "seq ext" либо пустое, а чуть правее в явном виде указано соотношение сторон, либо в нём стоит то же значение, что и в "pic". Действуем так.

Из значений окна "seq ext" вычисляем соотношение сторон изображения.

И это соотношение используем, чтобы вычислить разрешение конечного файла по вертикали.

В нашем примере это будет: 704*1080/1920=396.

То есть разрешение конечного avi XViD файла должно быть 704x396.

(При конвертировании не следует увеличивать до 720 разрешение по горизонтали, так как такое увеличение приведёт к ухудшению качества с одновременным увеличением объёма.

То есть если в исходном файле разрешение по горизонтали 704, то его таким и оставляем.) Запоминаем вычисленное конечное разрешение – оно нам пригодится далее. Кодеки же, которыми закодированы видео и аудио, GSpot всегда определяет верно (если GSpot не в состоянии правильно определить кодеки, то он вообще ничего в соответствующих подокнах не показывает). Идём на сайт http://www.smlabs.net/tsmuxer.html и скачиваем tsMuxer последней версии.

Запускаем его. Открываем исходный mpg-файл.

На вкладке "Split & cut" точку ставим у "No split", в подразделе "Cutting" у параметра "Enable cutting" флажка быть не должно.

Иначе получим расчленёнку.

Аналогично на вкладке "Blu-ray" точку ставим у "No chapter".

Возвращаемся на вкладку "Input".

Щёлкаем левой кнопкой мыши по видеодорожке.

После выполнения этого действия стало возможным поставить флажок у "Change fps".

Ставим туда флажок.

Выбираем частоту кадров – в нашем примере это будет 30000/1001.

(30000 разделить на 1001 примерно равно 29.97).

Больше пока ничего не меняем.

Конвертируем сбойный исходник в файл с расширением .ts.

В этом ts-файле частота кадров будет задана уже правильно.

Выходим из tsMuxer и пробуем скормить полученный ts-файл DGIndex-у.

Может получиться, и тогда всё, написанное ниже, к вам не относится.

Если же DGIndex снова сплюнет, то делаем так. Удаляем полученный ts-файл.

Запускаем tsMuxer, открываем сбойный исходник.

Настраиваем вкладки, как было описано выше.

Возвращаемся на вкладку "Input".

Щёлкаем левой кнопкой мыши по видеодорожке.

После выполнения этого действия стало возможным поставить флажок у "Change fps".

Ставим туда флажок.

Выбираем частоту кадров.

Убираем флажок у аудиодорожки.

Ставим точку у "ts muxing".

Жмём кнопку "Start muxing".

Дожидаемся конца демюксирования.

Ставим точку у "Demux".

Убираем флажок у видеодорожки и ставим флажок у аудиодорожки.

Снова жмём кнопку "Start muxing".

Дожидаемся конца демюксирования.

В итоге мы получили один беззвучный видео файл с расширением .ts, один аудио файл и один мета-файл.

Открываем при помощи блокнота мета-файл.

Ищем в нём значение timeshift.

Этот параметр представляет собой смещение аудио дорожки с обратным знаком.

Например, если мы имеем timeshift=315ms, то это значит, что когда мы будем присоединять аудио дорожку при помощи Virtual Dub, то нужно будет ввести смещение -315 миллисекунд.

(Информацию о размере смещения аудио нельзя считать абсолютно достоверной для всех случаев, хотя у меня пока всегда проходило.

Сбойный файл – он на то и сбойный, что всякое в нём может быть.

Возможно, что в некоторых случаях вам придётся подбирать величину смещения вручную.) Читаем мои статьи "В чём разница между DRC из ffdshow и DRC из нового кодека AC3?" и "Точная подгонка громкости звука при его декодировании из AC3".

При помощи самого прекрасного аудио эдитора GoldWave конвертируем демюксированный аудио файл в .wav. Входим в настройки видео декодера ffdshow.

Выполняем пять действий. 1.

Входим на вкладку "Кодеки".

Независимо от того, каким кодеком закодирован исходник, в строках "MPEG 1" и "MPEG 2" задаём "libmpeg2" (а не "libavcodec", и не что-то другое).

Также задаём, если это возможно, "libmpeg2" для того кодека, которым закодирован исходный файл. Пояснения.

Декодер libmpeg2 более устойчив к различным сбойным ситуациям и лучше выруливает из всяких проблем, чем libavcodec.

Декодер libavcodec вроде бы, чуть-чуть, ну совсем чуть-чуть выдаёт более высокое качество, чем libmpeg2.

Поэтому для хороших исходников задаём libavcodec, для сбойных и глючных – libmpeg2. 2.

Ставим флажок у вкладки "Размеры".

Входим на эту вкладку.

Ставим флажок у "Обработка полного".

Ставим точку у "Specify horizontal and vertical size".

В подокнах "Новый" вводим вычисленные разрешения по горизонтали для конечного файла.

В нашем примере это будет 704 и 396.

Ставим точку у "Нет изменения соотношения".

(Этим действием мы заставим декодер работать конкретно с теми разрешениями по горизонтали и вертикали, которые мы задали, невзирая на то соотношение сторон, записанное в заголовке сбойного файла.) Ставим точку у "Изменять размер всегда".

Ставим флажок у "Process pixel aspect ratio internally". Идём на вкладку "Установки" – она через одну ниже.

Отжимаем кнопку "Блок".

Значения "Метод" и "Для цветности" выставляем "Бикубический".

Оба ползунка "Parameter" выставляем в -0.60.

Ставим флажок у "Точное округление", убираем флажок у "Смешивание". 3.

Общеизвестно, что деинтерлейсинг должен производиться до изменения размеров.

Поскольку мы задали изменение размеров в ffdshow (а по-другому с таким сбойным файлом было нельзя), то вводить деинтерлейсный плагин в скрипт мы уже НЕ можем – иначе будет брак.

Поэтому, если исходник гребёнчатый, то нужно задействовать деинтерлейсинг из самого ffdshow.

Ставим флажок у вкладки "Деинтерлейс".

На этой вкладке выбираем метод деинтерлейсинга.

Самый лучший алгоритм – ядерный деинтерлейс.

Ставим флажок у "Обработка полного", ползунок "Ограничение" выставляем на 5, ставим флажок у "Резкое", остальные опции не меняем.

Алгоритм ffmpeg, в общем, тоже сойдёт, но он уже не столь хорош, как ядерщик.

Все остальные алгоритмы дают гораздо худший результат. Внимание, ОЧЕНЬ важно!!!

Декодер libmpeg2 при включённой вкладке "Размеры" в некоторых случаях (не всегда) может сам включить деинтерлейсинг по порочному алгоритму Bob.

Похоже, здесь включается аппаратный Bob-деинтерлейсинг.

Какой-либо опции для управления этим включением нет.

В чём порочность Боба, вы все знаете?

В том, что Боб – это не деинтерлейсинг, а псевдо деинтерлейсинг методом размазывания движущихся гребёнчатых деталей.

Из-за описанного выше спонтанного включения Bob-деинтерлейсинга вам может показаться, что исходник не интерлейсный, и включать вкладку "Деинтерлейс" не нужно.

Поэтому вам вначале нужно очень конкретно выяснить, является ли исходник гребёнчатым или нет.

Это можно сделать, загрузив исходник в Elecard и подвигав ползунок.

Также можно отключить вкладку "Размеры" и загрузить исходник в Virtual Dub.

Вы увидите только часть кадра, но гребёнчатость, если она есть, будет отчётливо видна.

Или можно попробовать загрузить исходник в Virtual Dub Mod.

Если вы обнаружили гребёнчатость таким методом, то включайте "ядерный деинтерлейс", и благородный ядерщик, а не порочный Боб, будет качественно деинтерлейсить ваше египетское видео. 4.

На вкладке "Разное" убираем флажок у "Пропуск кадров при задержке:" 5.

Идём на вкладку "Вывод".

Ставим флажки у YV12, YUY2, RGB24, RGB32, Высококачественная конверсия YV12 в RGB.

В этом случае на выход изображение будет подаваться в том цветовом формате, в котором оно сидит в исходнике.

Практически всегда это будет YV12, но изредка возможно что-то другое, поэтому мы отметили все встречающиеся форматы. Важно!

Все остальные флажки, в том числе серые, на этой вкладке нужно убрать! Идём на вкладку "RGB conversion".

Ставим точку у "ITU-R BT.709".

Ставим флажок у "High quality YV12 to RGB conversion".

"Method" задаём "Force progressive", так как на выходе из ffdshow видео в данном случае всегда будет уже не интерлейсным.

В подразделе "Contrast" точку ставим у "Standard". OK. Устанавливаем последние версии Haali Media Splitter и Avisynth.

Перезагружаем компьютер. Пишем вот такой скрипт для загрузки полученного ts-файла: LoadPlugin("VagueDenoiser.dll") DirectShowSource("Radiohead.ts", fps=30000./1001.) AssumeFPS(30000,1001) VagueDenoiser(nsteps=200, chromaT=0, percent=100) ConvertToRGB24(matrix="rec709", interlaced=false) Пояснения.

Параметр fps в DirectShowSource здесь строго обязателен.

Чтобы значение fps не было округлено до целого числа, в числителе и знаменателе дроби ставится точка (вспоминаем Фортран).

Параметр fps внутри DirectShowSource округляет значение fps до нескольких значащих цифр после запятой.

Разница в тысячные доли между дробью и округлённым значением на качество никак не влияет.

Но нам, жрецам, нужно, чтобы полученный avi-файл имел ещё и стандартный заголовок – хотя бы для того, чтобы такой авишник можно было соединять с другими стандартными авишниками с такой же частотой кадров.

Поэтому после DirectShowSource следует AssumeFPS.

Эта функция как раз и передаст, уже безо всяких округлений, стандартное значение fps.

Если частота кадров равна 23.976 кадров в секунду, то дробь должна быть 24000/1001.

Если частота кадров равна 25, то никакой дроби не нужно – так и пишем fps=25, а строка AssumeFPS в этом случае будет не нужна. Читаем мою статью "Как полностью сохранить оригинальную цветовую гамму при кодировании кодеком XViD".

Загружаем скрипт в Virtual Dub.

Никаких изменений размера в Virtual Dub здесь делать уже не нужно!

Присоединяем звуковую дорожку.

Не забываем ввести смещение!

Кодируем в avi XViD и наслаждаемся древнеегипетским зрелищем. Важное замечание.

Я рекомендую все файлы, которые можно загрузить в tsMuxer, (а не только сбойные), вначале демуксировать в беззвучный видео файл и аудиодорожку.

Далее аудиодорожку конвертируем в несжатый звук с расширением .wav программой GoldWave.

При помощи DirectShowSource загружаем в Virtual Dub конкретно полученный демюксированный ts-файл.

Звук присоединяем на стадии кодирования Виртуал Дабом.

Разница между работой с хорошими и сбойными файлами в том, что при конвертировании хороших файлов не требуется задействовать вкладку "Размеры" в ffdshow, используется декодер libavcodec, а не libmpeg2, и деинтерлейсинг при работе с хорошими файлами можно и нужно прописывать в скрипте. И напоследок.

Когда вы закончите конвертировать сбойный файл, не забудьте в ffdshow убрать флажки у "Размеры" и "Деинтерлейс", а все декодеры переключить на libavcodec. Если захотите выйти со мной на связь напрямую – то: nefezida53@mail.ru Все мои статьи по различным аспектам работы с мультимедиа лежат здесь: http://www.cgtalk.ru/forum/forumdisplay.php?f=77

Спасибо.

Цитата: Сообщение от Жреца В итоге мы получили один беззвучный видео файл с расширением .ts, один аудио файл и один мета-файл.

Открываем при помощи блокнота мета-файл.

Небольшое уточнение в результате таких махинаций мы никогда не получим этот мета-файл , он получается в результате нажатия на кнопку " Save meta file ", где потом указываем папку для сохранения , мелочь, но приятна!, да и сохранять в нем нет никакой необходимости, т.к.

В окошке Meta file виден сам текст, который в последствии будет сохранен в этом файле, если мы захотим, а сам timeshift может быть, а может и не быть , тоже все под вопросом и гарантий нет, что он покажет это смещение аудио Если timeshift прописался, тогда запоминаем или сохраняем этот meta file

Цитата: Сообщение от Жреца То есть разрешение конечного avi XViD файла должно быть 704x396 Никаких изменений размера в Virtual Dub здесь делать уже не нужно!

Разве не надо применять требования кратности разрешения 32 по X и 16 по Y и таким образом в Виртуале или ffdshow ресайз окончательно выставляем 704 х 400 или пишем скрипт? Что-то не понятно