Руководство FreeBSD
Пред. | Глава 7. Мультимедиа | След.

# 7.4. Воспроизведение видео

Предоставил Ross Lippert.

Воспроизведение видео является очень новой и быстро развивающейся областью применения. Будьте терпеливы. Не всё будет работать так беспроблемно, как это было со звуком.

Прежде, чем вы начнёте, определите модель видеокарты и чипсет, который она использует. Хотя Xorg и XFree86™ поддерживают множество различных видеокарт, только их малая часть показывает хорошую скорость воспроизведения видео. Для того, чтобы получить список расширений, поддерживаемых X-сервером, который используется вашей видеокартой, используйте команду xdpyinfo(1) во время работы X11.

Неплохо также иметь небольшой файл MPEG, который бы использовался как тестовый файл для проверки различных проигрывателей и настроек. Так как некоторые проигрыватели DVD будут искать носитель DVD как `/dev/dvd` по умолчанию или быть жёстко настроены на него, возможно будет полезно сделать символические ссылки на правильные устройства:

    # ln -sf /dev/acd0c /dev/dvd
    # ln -sf /dev/racd0c /dev/rdvd

Для FreeBSD 5.X, которая использует devfs(5) рекомендуется немного другой набор ссылок:

    # ln -sf /dev/acd0 /dev/dvd
    # ln -sf /dev/acd0 /dev/rdvd

Обратите внимание, природа devfs(5) такова, что такие созданные вручную ссылки не сохраняются при перезагрузке системы. Для автоматического создания символических ссылок при каждой загрузке системы добавьте в `/etc/devfs.conf` следующие строки:

    link acd0 dvd
    link acd0 rdvd

Кроме того, декодирование DVD требует доступа к специальным функциям DVD-ROM, поэтому должен быть доступ на запись для устройств DVD.

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

    option CPU_ENABLE_SSE
    option USER_LDT

> Замечание: option USER_LDT в FreeBSD 5.X не существует.

Для того, чтобы улучшить работу разделяемой памяти X11, рекомендуется увеличить значения некоторых переменных sysctl(8):

    kern.ipc.shmmax=67108864
    kern.ipc.shmall=32768

## 7.4.1. Определение возможностей видео

Существует несколько возможных путей отображения видео под X11. Что именно будет действительно работать, во многом зависит от аппаратного обеспечения. Каждый из описанных методов будет работать с различным качеством на разном аппаратном обеспечении. Во-вторых, воспроизведение видео в X11, это тема, которой уделяется достаточно много внимания последнее время, и с каждой новой версией Xorg или XFree86 могут наблюдаться значительные улучшения.

Список наиболее часто используемых видеоинтерфейсов:

1. X11: обычный вывод X11 с использованием разделяемой памяти.

2. XVideo: расширение интерфейса X11, которое поддерживает видео в любом объекте X11.

3. SDL: the Simple Directmedia Layer.

4. DGA: the Direct Graphics Access -- прямой доступ для графики.

5. SVGAlib: низкоуровневый доступ к графике на консоли.

### 7.4.1.1. XVideo

Xorg и XFree86 4.X включают в себя расширение, называющееся XVideo (также известное как Xvideo, Xv и xv), которое позволяет отображать видео прямо на объектах при помощи специального ускорения. Это расширение предоставляет очень хорошее качество воспроизведения даже на low-end машинах.

Для того чтобы проверить, работает ли это расширение, используйте команду `xvinfo`:

    % xvinfo

XVideo поддерживается вашей видеокартой, если результат выглядит приблизительно так:

    X-Video Extension version 2.2
    screen #0
      Adaptor #0: "Savage Streams Engine"
        number of ports: 1
        port base: 43
        operations supported: PutImage
        supported visuals:
          depth 16, visualID 0x22
          depth 16, visualID 0x23
        number of attributes: 5
          "XV_COLORKEY" (range 0 to 16777215)
                  client settable attribute
                  client gettable attribute (current value is 2110)
          "XV_BRIGHTNESS" (range -128 to 127)
                  client settable attribute
                  client gettable attribute (current value is 0)
          "XV_CONTRAST" (range 0 to 255)
                  client settable attribute
                  client gettable attribute (current value is 128)
          "XV_SATURATION" (range 0 to 255)
                  client settable attribute
                  client gettable attribute (current value is 128)
          "XV_HUE" (range -180 to 180)
                  client settable attribute
                  client gettable attribute (current value is 0)
        maximum XvImage size: 1024 x 1024
        Number of image formats: 7
          id: 0x32595559 (YUY2)
            guid: 59555932-0000-0010-8000-00aa00389b71
            bits per pixel: 16
            number of planes: 1
            type: YUV (packed)
          id: 0x32315659 (YV12)
            guid: 59563132-0000-0010-8000-00aa00389b71
            bits per pixel: 12
            number of planes: 3
            type: YUV (planar)
          id: 0x30323449 (I420)
            guid: 49343230-0000-0010-8000-00aa00389b71
            bits per pixel: 12
            number of planes: 3
            type: YUV (planar)
          id: 0x36315652 (RV16)
            guid: 52563135-0000-0000-0000-000000000000
            bits per pixel: 16
            number of planes: 1
            type: RGB (packed)
            depth: 0
            red, green, blue masks: 0x1f, 0x3e0, 0x7c00
          id: 0x35315652 (RV15)
            guid: 52563136-0000-0000-0000-000000000000
            bits per pixel: 16
            number of planes: 1
            type: RGB (packed)
            depth: 0
            red, green, blue masks: 0x1f, 0x7e0, 0xf800
          id: 0x31313259 (Y211)
            guid: 59323131-0000-0010-8000-00aa00389b71
            bits per pixel: 6
            number of planes: 3
            type: YUV (packed)
          id: 0x0
            guid: 00000000-0000-0000-0000-000000000000
            bits per pixel: 0
            number of planes: 0
            type: RGB (packed)
            depth: 1
            red, green, blue masks: 0x0, 0x0, 0x0

Следует заметить, что перечисленные форматы (YUV2, YUV12 и т.п.) не присутствуют в каждой реализации XVideo и их отсутствие может быть помехой для некоторых проигрывателей.

Если результат выглядит так:

    X-Video Extension version 2.2
    screen #0
    no adaptors present

то, возможно, XVideo не поддерживается для вашей видеокарты.

Если XVideo не поддерживается вашей видеокартой, то это всего лишь означает, что будет сложнее получить приемлемые для воспроизведения видео вычислительные мощности. В зависимости от вашей видеокарты и процессора, возможно, вы сможете получить удовлетворительный результат. Возможно, вы должны будете прочитать о путях улучшения производительности в Разд. 7.4.3.

### 7.4.1.2. Simple Directmedia Layer

SDL был задуман как уровень абстракции для разработки кросплатформенных приложений под Microsoft® Windows®, BeOS и UNIX®, позволяя им эффективно использовать звук и графику. SDL предоставляет низкоуровневые абстракции для аппаратного обеспечения, и может быть более эффективным чем интерфейс X11.

SDL есть в Коллекции портов FreeBSD: `devel/sdl12`.

### 7.4.1.3. Прямой доступ для графики (DGA)

DGA это расширение X11, которое позволяет программам напрямую изменять кадровый буфер (framebuffer) без участия X-сервера. Поскольку DGA основывается на низкоуровневом доступе к памяти, программы, которые используют его должны исполняться от пользователя `root`.

Расширение DGA может быть протестировано при помощи dga(1). Когда `dga` запущена, она изменяет цвета на экране при каждом нажатии клавиш. Для того, чтобы выйти из неё, используйте q.

## 7.4.2. Порты и пакеты для работы с видео

Этот раздел обсуждает программное обеспечение для работы с видео из Коллекции Портов FreeBSD. Воспроизведение видео является очень активной сферой разработок программного обеспечения и возможности различных приложений могут несколько отличаться от описанных здесь.

Во-первых, важно помнить, что многие приложения для работы с видео, которые работают на FreeBSD, были разработаны как приложения Linux. Многие из этих приложений все еще бета-качества. Вот некоторые проблемы, которые могут встретиться в работе видео пакетов на FreeBSD:

1. Приложение не может воспроизвести файл, который создало другое приложение.

2. Приложение не может воспроизвести файл, который создало само.

3. Одно и то же приложение на разных машинах, скомпилированное на каждой машине специально для неё, воспроизводит один и тот же файл различно.

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

5. Приложение часто не работает (оставляет core-файл).

6. Документация не устанавливается вместе с портом и может быть найдена лишь на сайте или в каталоге порта `work`.

Многие из этих приложений могут также проявлять ''линуксизмы''. Так, это могут быть некоторые проблемы, связанные со способом реализации некоторых стандартных библиотек в дистрибутивах Linux, или некоторыми дополнительными возможностями ядра Linux, которые авторы приложений посчитали существующими везде. Эти проблемы не всегда могут быть обнаружены людьми, поддерживающими порт (порты), вследствие чего могут возникнуть проблемы, сходные с нижеперечисленными:

1. Использование `/proc/cpuinfo` для того, чтобы определить характеристики процессора.

2. Неправильное использование нитей (threads), которое может привести к зависанию программы при завершении вместо нормального выхода.

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

Таким образом, разработчики этих приложений должны сотрудничать с людьми, поддерживающими порты, для того, чтобы минимизировать количество обходных путей, необходимых для портирования.

### 7.4.2.1. MPlayer

MPlayer это недавно разработанный и быстро развивающийся проигрыватель видео. Задачами команды разработчиков MPlayer являются скорость и гибкость при работе на Linux и других Unix-системах. Проект был начал, когда его основатель стал сыт по горло плохой производительностью и качеством проигрывателей того времени. Некоторые могут сказать, что графический интерфейс был принесён в жертву рационализированному дизайну. Однако, как только вы привыкнете к опциям командной строки MPlayer и его управлению с клавиатуры, всё будет хорошо.

#### 7.4.2.1.1. Компиляция MPlayer

MPlayer находится в `multimedia/mplayer`. MPlayer производит различные тесты аппаратного обеспечения во время процесса компиляции, в результате чего полученные исполняемые модули не могут быть перенесены с одной системы на другую. Поэтому важно собирать его из портов, а не использовать бинарный пакет. Также, при сборке вы можете указать различные установки при помощи параметров командной строки `make`, как описывается в `Makefile` в начале сборки:

    # cd /usr/ports/multimedia/mplayer
    # make
    N - O - T - E

    Take a careful look into the Makefile in order
    to learn how to tune mplayer towards you personal preferences!
    For example,
    make WITH_GTK1
    builds MPlayer with GTK1-GUI support.
    If you want to use the GUI, you can either install
    /usr/ports/multimedia/mplayer-skins
    or download official skin collections from
    http://www.mplayerhq.hu/homepage/dload.html

Параметры порта по умолчанию должны подходить большинству пользователей. Однако, если вам необходим кодек XviD, необходимо указать в командной строке параметр `WITH_XVID`. Устройство DVD по умолчанию также может быть указано в командной строке параметром `WITH_DVD_DEVICE`, по умолчанию используется `/dev/acd0`.

На время написания данного документа порт MPlayer'а собирает и устанавливает свою документацию в формате HTML и два исполняемых файла, `mplayer` и `mencoder`, который является утилитой для перекодировки видео.

Документация к MPlayer очень информативна. Если читатель найдет информацию этой главы о аппаратном обеспечении для поддержки видео и интерфейсах недостаточной, то документация MPlayer будет очень хорошим дополнением. Обязательно уделите время чтению документации MPlayer, если вам нужна информация о поддержке видео под UNIX.

#### 7.4.2.1.2. Использование MPlayer

Каждый пользователь MPlayer должен создать подкаталог `.mplayer` в своем домашнем каталоге. Для того, чтобы его создать, выполните следующие действия:

    % cd /usr/ports/multimedia/mplayer
    % make install-user

Параметры для `mplayer` перечислены в страничке руководства mplayer. За более подробной информацией вы можете обратиться к документации в формате HTML. В этом разделе мы опишем несколько самых распространённых случаев использования mplayer.

Для того, чтобы воспроизвести файл, например `testfile.avi` через один из многих видеоинтерфейсов, используйте параметр -vo:

    % mplayer -vo xv testfile.avi

    % mplayer -vo sdl testfile.avi

    % mplayer -vo x11 testfile.avi

    # mplayer -vo dga testfile.avi

    # mplayer -vo 'sdl:dga' testfile.avi

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

Для того, чтобы воспроизвести DVD, замените `testfile.avi` на dvd://N -dvd-device DEVICE, где N является номером дорожки, с которой следует начать воспроизведение и `DEVICE` файл устройства привода DVD. Например, для того, чтобы воспроизвести дорожку 3 с `/dev/dvd`:

    # mplayer -vo xv dvd://3 -dvd-device /dev/dvd

> Замечание: Устройство DVD по умолчанию может быть определено во время сборки порта MPlayer параметром `WITH_DVD_DEVICE`. По умолчанию, это устройство `/dev/acd0`. Дополнительную информацию можно найти в `Makefile` порта.

Для того, чтобы остановить, приостановить или продолжить воспроизведение, воспользуйтесь привязкой клавиш, информация о которой может быть получена посредством запуска `mplayer -h`, либо на страничке документации.

Дополнительные, достаточно важные параметры воспроизведения: -fs -zoom, которые включают полноэкранный режим и -framedrop, который улучшает производительность на медленных системах.

Для того, чтобы командная строка запуска mplayer не становилась слишком большой, пользователь может создать файл `.mplayer/config` и установить параметры по умолчанию там:

    vo=xv
    fs=yes
    zoom=yes

Также `mplayer` может быть использован для копирования дорожек DVD в `.vob` файлы. Для того, чтобы скопировать вторую дорожку DVD необходимо выполнить следующую команду:

    # mplayer -dumpstream -dumpfile out.vob dvd://2 -dvd-device /dev/dvd

Полученный файл, `out.vob`, будет представлять собой MPEG, с которым можно производить различные действия при помощи программ, которые будут описаны далее в этом разделе.

#### 7.4.2.1.3. mencoder

Перед использованием `mencoder`, было бы неплохо ближе ознакомится с его параметрами, используя документацию в формате HTML. Также существует страничка справочника mplayer, но она не очень полезна без HTML документации. Существует бесчисленное множество способов улучшения качества, снижения битрейта и изменения формата; и некоторые из этих приёмов могут влиять на производительность. Ниже приведено несколько примеров использования `mencoder`. Во-первых, простое копирование:

    % mencoder input.avi -oac copy -ovc copy -o output.avi

Неправильная комбинация параметров командной строки может привести к появлению файлов, которые невозможно будет воспроизвести даже `mplayer`. Поэтому, если вы хотите скопировать изображение в файл, лучше использовать только параметр `mplayer` -dumpfile.

Для того, чтобы преобразовать `input.avi` в MPEG4 со звуком в формате MPEG Audio Layer 3 (MP3) (требуется `audio/lame`):

    % mencoder input.avi -oac mp3lame -lameopts br=192 \
         -ovc lavc -lavcopts vcodec=mpeg4:vhq -o output.avi

Эта команда создаст файл, воспроизводимый `mplayer` и `xine`.

`input.avi` может быть заменён на dvd://1 -dvd-device /dev/dvd и `mplayer`, запущенный от пользователя `root`, будет преобразовывать дорожку DVD напрямую. Так как первый раз, скорее всего, вы будете недовольны полученными результатами, всё же рекомендуется копировать дорожку в файл и работать затем с файлом.

### 7.4.2.2. Проигрыватель хine

xine - это большой проект, в задачи которого входит не только создание решения для видео все-в-одном, но и создание базовой библиотеки с возможностью расширения путем использования плагинов. Поставляется он как в виде порта, так и в виде пакета, `multimedia/xine`.

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

На время написания этого документа в поставке xine не существовало модуля ввода, который бы мог воспроизводить DVD, закодированные по алгоритму CSS. Существуют сборки, в которых есть такой модуль, но ни одна из них не входит в Коллекцию Портов FreeBSD.

По сравнению с MPlayer, xine является более дружелюбным к пользователю, но, в то же время, скрывает более тонкие настройки и управление от пользователя. Также xine лучше работает на XVideo интерфейсах.

По умолчанию, xine запускается с графическим интерфейсом. Для открытия файлов используются меню.

    % xine

В качестве альтернативы можно использовать его для запуска файла непосредственно, без GUI, следующей командой:

    % xine -g -p mymovie.avi

### 7.4.2.3. Утилиты transcode

Приложение transcode не является проигрывателем. Это набор инструментов для преобразования `.avi` и `.mpg` файлов. При помощи transcode можно объединять видеофайлы, исправлять поврежденные файлы, использовать инструменты командной строки для работы с потоками ввода/вывода `stdin/stdout`.

Так же, как и MPlayer, transcode является очень экспериментальным программным продуктом, который необходимо собирать из порта `multimedia/transcode`. Этот порт имеет огромное количество параметров для команды `make` при сборке. Рекомендуется:

    # make WITH_LIBMPEG2=yes

Если вы планируете установить `multimedia/avifile`, то добавьте параметр WITH_AVIFILE в строку запуска `make` как показано ниже:

    # make WITH_AVIFILE=yes WITH_LIBMPEG2=yes

Ниже приводятся два примера использования `transcode` для преобразования видео, в результате которого изменяется размер изображения. Первый пример преобразовывает данные в openDIVX AVI файл, в то время как второй использует более переносимый формат MPEG.

    % transcode -i input.vob -x vob -V -Z 320x240 \
    -y opendivx -N 0x55 -o output.avi

    % transcode -i input.vob -x vob -V -Z 320x240 \
    -y mpeg -N 0x55 -o output.tmp
    % tcmplex -o output.mpg -i output.tmp.m1v -p output.tmp.mpa -m 1

Существует страничка справочника для `transcode`, но для различных утилит `tc*` (таких как `tcmplex`), которые тоже устанавливаются в систему, документации очень немного. Тем не менее, для получения краткой справки по использованию команд, может быть задан параметр -h.

По сравнению с `mencoder`, `transcode` работает заметно медленнее, но имеет больше шансов создать более переносимый файл, который можно будет воспроизвести на большем количестве систем. Например MPEG, созданные при помощи `transcode`, воспроизводятся в Windows Media® Player и Apple Quicktime®.

## 7.4.3. Дальнейшее чтение

Различные пакеты видео программ для FreeBSD интенсивно разрабатываются. Очень возможно, что в ближайшем будущем многие обсуждаемые здесь проблемы разрешатся. Это займет время, и те, кто желает получить максимум от аудио/видео возможностей FreeBSD, должны будут собирать необходимые знания из нескольких списков часто задаваемых вопросов и обучающих статей, а также использовать различные приложения. Этот раздел существует для того, чтобы читатель мог получить указания на несколько источников дополнительной информации.

Документация MPlayer очень содержательна в техническом плане. Возможно, эти документы должны использоваться любым человеком, желающим получить высокий уровень знаний о видео на UNIX системах. Список рассылки MPlayer враждебен для любого, кто не потрудился прочитать документацию, так что, если у вас есть желание сообщать о найденных ошибках, прочитайте вначале документацию.

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

Наконец, существует несколько многообещающих приложений, которые читатель может испробовать:

- Avifile, для которого также существует порт `multimedia/avifile`.

- Ogle, для которого также существует порт `multimedia/ogle`.

- Xtheater

- `multimedia/dvdauthor`, пакет с открытыми текстами для распространения DVD контента.

Пред. | Начало | След.
Звук MP3 | Уровень выше | Настройка ТВ тюнеров

Этот, и другие документы, могут быть скачаны с ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам связанными с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам связанным с этой документацией, пишите <doc@FreeBSD.org>.
По вопросам связанным с русским переводом документации, пишите в рассылку <frdp@FreeBSD.org.ua>.
Информация по подписке на эту рассылку находится на сайте проекта перевода.