MPEG4 и Linux на "древней" машине.

В статье подробно рассказывается о том, как превратить старый Pentium в некое подобие цифрового видеоплеера.

[Антон Горбачев (justoff@hotmail.ru)]

Давно хотелось посмотреть видеоролик в формате MPEG4 на Linux-машине, но как-то все времени не хватало. А тут еще в журнале прочел (в Xakep'е кажется, но не уверен), что "под Линухами на 486-ой машине DVD на ура идет". По собственному опыту знал, что для проигрывания MPEG4-ролика под Windows нужен процессор не менее PII-350.

Строго говоря, "процессороемкость" (этот термин означает количество процессоров, которое ролик может съесть за 1 минуту) у всех роликов разная и зависит от параметров как кодирования - разрешения, уровня детализации и некоторых других, так и декодирования - уровня дополнительной постфильтрации кадра, количества декодируемых звуковых каналов, и др. Так что, если постараться, можно найти фильмы, с легкостью "притормаживающие" на довольно серьезных машинах при совпадении этих факторов в худших сочетаниях. Как раз подвернулся клиент, который очень хотел смотреть видео на своем компьютере. А вот компьютер не хотел:

P54C-133MHz / 2xSIMM-8Mb+DIMM-16Mb
S3 86C325 4Mb PCI / Aztech SoundGalaxy ISA

В данной конфигурации Win98SE показывала 1 (один) кадр видео примерно раз в 10-15 секунд. Звук воспроизводился нормально.

Тут я засомневался - была надежда, что Linux будет "порезвее", но чтобы в 250 раз (для достижения 25 FPS)! Эксперимент тем не менее был начат.

Поискал в Интернете проигрыватель под Linux. Почитал обзор Андрея Гвоздева на linuxoid.ru и, попробовав несколько вариантов, остановил свой выбор на MPlayer-0.90-pre5.

Итак, поехали. После нескольких попыток запуска скрипта ./configure и доустановок всего, что он требовал (дополнительные трудности возникали из-за малого объема Linux'ового раздела - всего 350 Mb) наконец-то прошла компиляция. Здесь нужно заметить, что по умолчанию проигрыватель компилируется без графического интерфейса. Меня и клиента это вполне устраивало - всякие там рюшечки и т.п. в данном случае нас не интересовали. Как включить этот самый интерфейс, рассказывается в вышеупомянутом обзоре Андрея Гвоздева. Когда компиляция закончилась (это заняло около 15 мин) настал решающий момент - запуск фильма.

Еще одно отступление. Драйверы звуковой карты еще не были установлены - не терпелось посмотреть картинку. Хорошо, что я не пытался установить их сразу - впоследствии эта процедура заняла около 3-х дней. Набрал в консольном сеансе XWindow 'mplayer --help' и, ознакомившись с текстом справки, составил следующую строчку для первого запуска фильма:

mplayer -vo x11 -nosound -dropframe /mnt/cdrom/movie.avi
-nosound - без звука (можно было не указывать - он все равно отключается, не обнаружив устройства для воспроизведения);
-vo x11 - включаем видеовывод через подсистему X11 безо всякой акселерации - все равно видеокарта ничего не поддерживает;
-dropframe - разрешаем проигрывателю пропускать кадры если не успевает декодировать. Как выяснилось в дальнейшем, опция предназначена для синхронизации звука и изображения, стало быть тоже была лишней;
/mnt/cdrom/movie.avi - ну а это собственно файл фильма, который нужно воспроизвести (в данном случае на CD-ROM'е, смонтированном в /mnt/cdrom).

И кино пошло, но как! Действие на экране разворачивалось плавно и красиво со скоростью около 5-7 кадров в секунду. Это, конечно, было гораздо быстрей, чем в Win98, но просматривать фильм таким образом можно только в очень специфичных целях, например - учиться танцевать, повторяя движения по фазам. Да к тому же не стоит забывать, что включение звукового воспроизведения также заберет свою долю процессорного времени.

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

Что есть формат видеопотока DVD? MPEG2, который, в свою очередь, есть MPEG1 (более известный под именем VideoCD) плюс бОльшая пропускная способность. MPEG4 обладает гораздо более сложными алгоритмами сжатия, и поддерживает работу с объектами, что, конечно, порождает дополнительные накладные расходы, не заметные на быстрых системах. Итак, я понял, что ничего у нас не получиться. Во всяком случае с этим процессором. Оставалась надежда только на Intel'овскую технологию MMX, которая якобы и создавалась для потоковой обработки данных вообще и видеоинформации в частности. Для проверки в тестовую машину был установлен P55C-166, в котором эта технология, по заверению производителя, присутствовала. Установка нового процессора потребовала перекомпиляции проигрывателя, а заодно и ядра. После необходимых манипуляций я воочию убедился в существовании технологии MMX и ее действенности - скорость проигрывания фильма увеличилась более чем в 2 раза, достигнув 18-20 FPS, что, как мне кажется, нельзя объяснить разницей в тактовой частоте процессоров в 33 Mhz.

Используемый для эксперимента проигрыватель выдает во время воспроизведения фильма некоторое количество интересной информации, которая включает и индекс загрузки процессора для декодирования видеопотока. С первым процессором он держался на уровне 300-320%, со вторым - понизился до 120-140%.

"Как это загрузка процессора может быть выше 100%",-спросите вы? А очень просто - индекс говорит нам, что для достижения воспроизведения с номинальным значением FPS нужно загрузить текущий процессор на 140%. А в данный момент фильм воспроизводиться со скоростью в 1.4 раза меньше номинальной без пропуска кадров, или с нормальной скоростью и пропуском 29% кадров. Но этого тоже было недостаточно. Я решил идти до конца, и на следующий день был куплен буквально за копейки другой процессор - AMD-K6-233 (без 3DNow!). Это был максимум, который поддерживала материнская плата.

После установки процессора, очередной перекомпиляции ядра и проигрывателя все встало на свои места: индекс загрузки упал до 60-70% для декодирования, 10-20% для вывода на экран, 10-15% для звука. Общая загрузка процессора составила, таким образом -- 80-105%, чего было достаточно для просмотра большей части фильмов с малым количеством пропущенных кадров. После этого решил еще раз загрузить Windows - да, сюда бы еще мегагерц 200, и все будет нормально...

Свою борьбу со звуковой картой подробно описывать не буду. Победа пришла через метод научного тыка - карта начинала работать после повторной инициализации модуля. Вот строчка из /etc/rc.d/rc.modules:

# loading module for Aztech Sound Galaxy
/sbin/modprobe sgalaxy # первая инициализация - ошибка
/sbin/rmmod sgalaxy # удаляем модуль
/sbin/modprobe sgalaxy # повторная инициализация - все OK
Во время первой инициализации модуль выводил сообщение об ошибке:

(IRQ test failed!)

а после второй -- начинал работать. Может быть профессионалы прокомментируют этот момент?

Выводы

  1. Старая машина, по современным мерка ни на что не годная, была перепрофилирована на просмотр видеофильмов в формате MPEG4. Потребовалась замена только процессора - с Intel-P54C-133 на AMD-K6-233.
  2. По отзывам в Интренете под Linux'ом видео воспроизводится с худшим качеством. После того, как я посмотрел на это своими глазами, могу сказать, что это не так - даже на экспериментальной машине, без дополнительной обработки кадра, качество было идентичным MPlayer'у из Windows. Попробовал установить максимальный уровень обработки на своей рабочей машине (P3-933/512Mb/GF2MX400), и был полностью удовлетворен качеством. А вот что меня поразило, так это скорость перемотки фильма -- при воспроизведении со старого привода Samsung 24x переходы на 10 мин в любую сторону занимали доли секунды. Под Windows проходит 2-5 сек., прежде чем проигрыватель приходит в себя после перемотки.
  3. Используемый в экспериментах MPlayer-0.9 мне очень понравился - включает в себя большое количество кодеков, очень удобное управление с клавиатуры (до сих пор не могу простить Microsoft перенос функции "Пауза" с пробела на Ctrl+P в WMPlayer'е), широкие возможности по настройке воспроизведения. Ничего не говорю здесь про внешний вид, т.к. не пользуюсь GUI-интерфейсом проигрывателя.
Дополнения
  1. Где-то в середине эксперимента была попытка замены видеокарты S3 86C325 на ATI 3D Rage II, тоже PCI. Изменения производительности замечено не было. Правда, было замечено, что и видеокарта ATI позволила проигрывателю корректно работать с опицей '-vo vesa', то есть без запуска XWindow.
  2. Эксперименты проводились в следующей среде:
    • Slakware 8.0;
    • kernel 2.4.5;
    • XFree86 4.0.1;
    • KDE 2
  3. Вызвал проблемы старенький CD-ROM Samsung -- по умолчанию, при загрузке системы для него включался режим DMA и передача данных происходила с ошибками. После принудительного отключения DMA все встало на свои места.
  4. Изменение режима воспроизведения с оконного на полноэкранный не вызывало снижения производительности. Переключение на полноэкранный режим производилось двумя способами -- подгонкой видеорежима под разрешение фильма (-fullscreen -vm) и 1:1 с реальным разрешением фильма при текущем видеорежиме (-fullscreen).
  5. При воспроизведении со звуком обязательно нужно было включать синхронизацию изображения '-dropframe', иначе со временем видеоряд отставал от звука.
  6. Синхронизация Audio-Video была хуже при направлении звукового потока через звуковой сервер KDE -- Arts ('-ao arts'). Поэтому был выбран вариант с выводом звука через подсистему OSS ('-ao oss'). При этом Arts нужно было отключать.
Ни в коей мере не претендуя на исчерпывающее знание предмета буду ждать ваших откликов / предложений / исправлений.

[ опубликовано 25/04/2003 ]

Антон Горбачев (justoff@hotmail.ru) - MPEG4 и Linux на "древней" машине.   Версия для печати