V0lt
Platinum Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Теория. Вот типичное распределение кадров в потоке Каждый кадр стоит на своем месте. Вроде все нормально. Но давайте вспомним, чем отличаются типы кадров. I - самодостаточный кадр, в нем храниться вся картинка целиком. Любое видео должно начинаться с I-кадра P - кадр, в котором хранятся различия в сравнении с предыдущим I- или P-кадром. Чтобы получить картинку из такого кадра нужно знать предыдущий I- или P-кадр. B - кадр, который ссылается на предыдущий и последующий I- или P-кадры. На B-кадрах остановимся по-подробнее. Чтобы получить картинку из В-кадра 1 нужно с начала декодировать кадры 0 и 3. Загвоздка здесь в том, что при последовательной обработке кадров мы не сможем сразу декодировать В-кадр 1, т.к. мы еще не получили P-кадр 3. Эта проблема решается через запросы от декодера (где-то вычитал). Но VirtualDub использует старый VFW-интерфейс, где декодер молчун, что имеет, то и пытается показать. Т.е. если мы перейдем на произвольный B-кадр, то мы увидим не его, а предыдущий I- или P-кадр. Хотя надо отметить, что если просто перекодировать видео, то проблем не наблюдается. Возможно это из-за того, что в кодек режиме энкодера может придерживать кадры в буфере. Что делать? Все просто Нужно, чтобы P-кадр 3 шел раньше В-кадров 1 и 2. А чтобы не запутаться упакуем кадры 3 и 1 вместе, а на место кадра 3 ставим пустышку. Это и называется Packed Bitstream. Принцип работы декодера: 0) декодируем кадр 0 и отображаем его; 1) видим, что в кадр 1 упакованы два кадра: P и B. Декодируем P-кадр и запоминаем его. Декодируем B-кадр и отображаем его; 2) декодируем кадр 2 и отображаем его; 3) видим пустышку - отображаем запомненный ранее P-кадр. Практика Для начала хотелось бы заметить, что при кодировании DivX-ом со стандартным профилем Home Theater, получается поток с одним последовательным B-кадром и используется Packed Bitstream. Я не помню были ли в DivX 4.0 профили изначально, но кодеры прочухали, что если использовать два последовательных B-кадра, то при сравнимом качестве можно было получить меньший размер потока. И когда появились профили (в DivX 5 они уже точно были), то многие их просто отключали и настраивали энкодер как душе угодно. В Xvid-е, кстати, по умолчанию стояло 2 B-кадра. Потом появились DVD-плееры с поддержкой DivX. На тот момент было еще полно контента, закодированного хакерским DivX 3.11, с ним проблем не было. Но вот с Xvid картинка на телевизоре почему-то дергалась, с DivX 5 тоже бывало дергалась, но не так часто. Методом перебора настроек выяснилось, что причина в опции Packed Bitstream. Замечу, что проблема возникает, если Packed Bitstream включен и количество последовательных B-кадров равно 2 или более. Что делать? Не перекодировать же все скачанные фильмы, ведь можно наверное как-нибудь "исправить" файл. Такое стало возможным благодаря Mpeg4Modifer. И что интересно в умах закрепилось: Packed Bitstream - всегда зло. Хотя это не совсем так. Вкратце ситуация такая: Кол-во посл. B-кадров | Packed Bitstream | VirtualDub | DVD-плееры | 1 | + | хорошо | хорошо (профиль Home Theater) | 1 | - | проблема с отображением текущего кадра | хорошо | 2 и более | + | хорошо | проблема с вопроизведением | 2 и более | - | проблема с отображением текущего кадра | хорошо | Проверено на DVD-плеерах с MTK-чипами (одни из самых распространенных) | Всего записей: 10787 | Зарегистр. 05-02-2003 | Отправлено: 21:34 02-12-2011 | Исправлено: V0lt, 21:57 02-12-2011 |
|