Форум: ТЕХНИЧЕСКАЯ ЧАСТЬ
Тема: Многопроходное кодирование
автор: Esc

сообщение оставил Esc , 20 августа 2007, 21:24
Дошли до меня сведения о путанице с многопроходным кодированием кодеком x264. Поэтому мы тут запишем правильный сценарий с кратким объяснением основ многопроходного кодирования.

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

Почему однопроходном кодировании ничего хорошего не получается? Потому что у кодека нет информации о том, что его ждёт в будущем. Он видит только крайне небольшое количество кадров вокруг текущего. И поэтому у него есть только 2 варианта:
1) Либо работать на заданный объем, и тогда битрейт будет практически постоянный с небольшими вариациями.
2) Либо придерживаться постоянного качества изображения, и тогда конечный объем файла непредсказуем.
Эти две опции реализованы, например, в DivX под названиями 1-pass и 1-pass quality based.

Многопроходное кодирование даёт возможность разделить этапы сбора статистики и генерации закодированного изображения.

1-й проход - это всегда чистый сбор статистики. И о чём не все задумываются, пишется эта статистика конечно не в ваш avi, а в отдельный файл статистики. DivX 5 позволял управлять этим файлом. В 6-й версии оставили лишь настройку директории для него, да и ту засунули так глубоко, что не всякий дотянется. В VP6 и VP7 есть отдельная установка для First Pass File на последней закладке. В командной строке x264 данный файл задаётся параметром --stats.

Что такое вообще есть сбор статистики? Доходили до меня слухи, что в пятом DivX-к это было ни что иное, как имитация кодирования с постоянным квантайзером (=2). Поэтому в нём спокойно можно было заменить первый проход на quality based 1-pass with q=2, что некоторые гуру даже советовали делать. После чего кодеку остаётся лишь присвоить каждому кадру индекс сложности в соответствии с полученным при постоянном квантайзере теоретическим объёмом и выделить битрейт пропорционально этому индексу.

Поскольку всем понятно, что при многопроходном кодировании нет никакого смысла останавливаться после первого прохода, в сам файл ави не пишется ничего. Что до смерти пугает некоторых нубов, обнаруживающих в своём файле после первого прохода лишь чёрный экран. Если там после первого прохода чёрный экран, думают они, что же будет после второго? Им настолько страшно узнать ответ, что они иногда даже бросают саму идею многопроходного кодирования и уходят в леса жить с волками и питаться мухоморами.

При простом сценарии, которого твёрдо придерживаются кодеки семейства VP, за первым следует второй проход, который собственно и раздаёт битрейт в соответствии с полученной раскладкой. Конец кодирования и все счастливы. Но этот подход совершенно не устраивает перфекционистов, которым подавай исключительно самое лучшее, даже если это займёт в несколько раз больше времени. Их аргументация такова, что при реальном кодировании с индивидуальными параметрами квантайзеров на каждом кадре сложность кадров замеряется уже более точно. Что позволяет при следующем проходе ещё точнее и правильнее распределить битрейт между сценами.

DivX давно и плотно придерживается технологии многопроходного кодирования. Поэтому у него есть 1st pass и Nth pass. Разница в том, что при первом проходе пишется только файл статистики, а при энном - и изображение пишется и файл статистики новыми значениями обновляется. Теоретически, при последнем проходе файл статистики уже не нужен. Поэтому раньше его можно было отключить. Но потом программеры осознали, что собственно по сравнению с кодированием запись файла статистики отнимает так ничтожно мало времени и занимает так мало места на диске, что выигрыш от его включения-выключения просто не стоит той путаницы, которую можно получить, забыв включить его обратно.

Другие кодеки, такие как XviD и x264, пытались подобно VPx топырить пальцы и заявлять, что уж у них-то первый проход настолько хорош и продвинут, что больше 2 проходов никогда не понадобится. Но у них не хватило духу гнуть эту линию до победного конца. Недовольные перфекционисты побеждали, и вводилась возможность кодирования в более чем 2 прохода.

В частности, в случае x264 это вылилось в довольно неприятную путаницу. Опция --pass 2 подразумевает второй и последний проход, при котором файл статистики не обновляется. Позднее была добавлена опция --pass 3, которая во всём аналогична --pass 2, за тем исключением, что она таки обновляет файл статистики. Поэтому если ты собираешься всегда использовать только 2 прохода, можно их вызывать так:
1) --pass 1
2) --pass 2
Но если планируется больше двух проходов, рекомендуется забыть нафиг про pass 2 и вызывать кодек так:
1) --pass 1
2) --pass 3
....
N) --pass 3.
Теоретически, последний проход может быть pass 2. Но практически, как я уже говорил, выигрыш минимальный, а шансы запутаться существеннно возрастают.



сообщение оставил Endymion , 20 августа 2007, 21:38
Esc
Вот-вот. Среднестатистический человек, кодит себе 1, 2, 3 проход в x264 и не подозревает, что кодит на самом деле в 2 прохода. (Хотя потеря, за исключением потраченного времени не смертельна) Я тоже привык, что у Дивикса по-порядку все и даже не задумывался о возможности таких выбрыков x264-го энкодера. Хорошо что разобрались перед тем, как нубам проги для кодинга в АВЦ делать  :tongue:

сообщение оставил Esc , 20 августа 2007, 21:53
Кстати, Nero AVC тоже не балует многопроходностью. Это только с фанскими кодеками семейста Х возможна демократия.
сообщение оставил Aggressor , 21 августа 2007, 02:10
Цитата (Esc @ 20 августа 2007, 20:24)
И о чём не все задумываются, пишется эта статистика конечно не в ваш avi, а в отдельный файл статистики

Не совсем правильно. Справедливо только для режима "турбо", иначе же создается полноценный файл avi.
Цитата (Esc @ 20 августа 2007, 20:24)
Теоретически, последний проход может быть pass 2. Но практически, как я уже говорил, выигрыш минимальный, а шансы запутаться существеннно возрастают.

А я вот на глаз сверял цветопередачу, и видел разницу. Не такой уж минимальный выигрыш, будем реалистами. При битрейте "впритык" выигрыш заметен на глаз, не надо даже присматриваться. А время... что клипмейкеру каких-то лишних 45 минут, если речь идет о качестве?

сообщение оставил Endymion , 21 августа 2007, 02:24
Цитата (Aggressor @ 21 августа 2007, 01:10)
При битрейте "впритык" выигрыш заметен на глаз, не надо даже присматриваться. А время... что клипмейкеру каких-то лишних 45 минут, если речь идет о качестве?


А мне кажется Эск не про уместность 3го прохода говорил, а про то, что третим по счету лучше использовать --pass3 вместо --pass2

сообщение оставил Aggressor , 21 августа 2007, 09:51
Цитата (Endymion @ 21 августа 2007, 01:24)
А мне кажется Эск не про уместность 3го прохода говорил, а про то, что третим по счету лучше использовать --pass3 вместо --pass2

Цитата (Esc @ 20 августа 2007, 20:24)
Но если планируется больше двух проходов, рекомендуется забыть нафиг про pass 2 и вызывать кодек так:
1) --pass 1
2) --pass 3
....
N) --pass 3.

Я бы сказал, что Эск рекомендует использовать --pass 3 не только третьим по счету, но и вторым. Что есть странно, поскольку в MeGUI при использовании пресета трехпроходного кодирования второй проход идет как раз как --pass 2, а третий уже как --pass 3.

сообщение оставил Endymion , 21 августа 2007, 10:50
Aggressor
Да мы вчера разобрались. Все правильно. Чтобы кодить в 3 прохода, надо писать или --pass 1, 3, 3 или -pass 1, 3, 2



сообщение оставил Esc , 21 августа 2007, 16:15
Aggressor
Проверил трёхпроходное кодирование в MeGUI 0.2.5.1007. Делает проходы 1, 3, 3. Так что либо ты не туда смотришь, либо у тебя древняя версия с ошибкой.

сообщение оставил zzerg , 21 августа 2007, 16:46
Цитата (Aggressor @ 21 августа 2007, 07:51)
[quote=Endymion,21 августа 2007, 01:24]Я бы сказал, что Эск рекомендует использовать --pass 3 не только третьим по счету, но и вторым. Что есть странно, поскольку в MeGUI при использовании пресета трехпроходного кодирования второй проход идет как раз как --pass 2, а третий уже как --pass 3.

Это как раз критически важно -- НЕ использовать "-pass 2" для любых "непоследних" проходов. И даже для последнего можно использовать "-pass 3".

Походу, если MeGUI делает так, то он неправ, и это баг. Кстати, этот баг вроде бы был и в других гуях (например, в StarRix, или как там его). О, Эск говорит, что всё ок с Мегуй :)

Это ещё раз подтвержает мысль, что GUI пока ещё не дописаны и не отлажены до совершенства :(

сообщение оставил Aggressor , 21 августа 2007, 18:03
Esc, скорее, древняя версия.
Спасибо за инфу! Вечером перекомпилю свою ГУИ. Правда, последний (третий) проход намереваюсь обозначить "2", чтобы не делать лишних движений по поводу лишней записи в файл статистики.

Powered by Ikonboard 3.1.2a
Ikonboard © 2001 Jarvis Entertainment Group, Inc.