16.4 Воспроизведение видео во FreeBSD


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

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

Прежде, чем Вы начнёте, вы должны знать модель Вашей видеокарты и чипсет, который она использует. Хотя 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/acd0c /dev/dvd
# ln -sf /dev/acd0c /dev/rdvd

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

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

Для того, чтобы улучшить работу разделяемой памяти X11, рекомендуется увеличить значения некоторых переменных sysctl(8):
kern.ipc.shmmax=67108864
kern.ipc.shmall=32768
16.4.1 Определение возможностей видео

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

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

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

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

SDL: the Simple Directmedia Layer.

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

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

XFree86 4.X включает в себя расширение, называющееся XVideo (также известное как Xvideo, Xv и xv), которое позволяет отображать видео прямо на объектах при помощи специального ускорения. Это расширение предоставляет очень хорошее качество воспроизведения даже на low-end машинах (например на моём ноутбуке с процессором PIII 400МГц). К сожалению, список видеокарт, которые поддерживают эту возможность ``прямо из коробки'' на данный момент включает в себя только:

3DFX Voodoo 3

Intel i810 и i815

некоторые видеокарты на чипсете S3 (такие как Savage/IX и Savage/MX)

Если Вашей видеокарты нет в этом списке, ещё не следует расстраиваться. В XFree86 4.X появляются всё новые и новые возможности xv с каждой новой версией [1] Для того< чтобы проверить, работает ли это расширение, используйте команду 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 не поддерживается Вашей видеокартой, то это всего лишь означает, что будет сложнее получить приемлемые для воспроизведения видео вычислительные мощности. В зависимости от Вашей видеокарты и процессора, возможно, вы сможете получить удовлетворительный результат. Возможно, Вы должны будете прочитать о путях улучшения производительности здесь: Section 16.4.3.
16.4.1.2 Simple Directmedia Layer

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

SDL есть в Коллекции портов FreeBSD: devel/sdl12
16.4.1.3 Прямой Доступ для Графики (DGA)

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

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

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

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

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


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

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

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

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

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

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

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


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

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

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

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

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

MPlayer находится в multimedia/mplayer. MPlayer производит различные тесты аппаратного обеспечения во время процесса компиляции, в результате чего полученные исполняемые модули не могут быть перенесены с одной системы на другую. Поэтому важно собирать его из портов, а не использовать бинарный пакет. Также, при сборке Вы можете указать различные установки при помощи параметров команды make.
# cd /usr/ports/multimedia/mplayer
# make
You can enable additional compilation optimizations
by defining WITH_OPTIMIZED_CFLAGS
You can enable GTK GUI by defining WITH_GUI.
You can enable DVD support by defining WITH_DVD.
You can enable SVGALIB support by defining WITH_SVGALIB.
You can enable VORBIS sound support by defining WITH_VORBIS.
You can enable XAnim DLL support by defining WITH_XANIM.

Если в Вашей системе установлен x11-toolkits/gtk12, Вы также можете включить поддержку GUI (графического интерфейса пользователя). В противном же случае оно того стоить не будет. Если вы собираетесь воспроизводить (возможно закодированные CSS) DVD при помощи MPlayer, Вам будет необходимо будет включить поддержку DVD [2]:
# make WITH_DVD=yes WITH_SVGALIB=yes

На время написания данного документа порт MPlayer'а собирает и устанавливает свою документацию в формате HTML и один исполняемый файл, mplayer. Также его можно заставить собрать кодировщик, mencoder, который является инструментом для перекодировки и конвертирования видео. Это можно сделать при помощи модификации Makefile. Также это, возможно, будет включено по умолчанию в последующих версиях порта.

Документация к MPlayer очень информативна. Если читатель найдет информацию о аппаратном обеспечении для поддержки видео и интерфейсам недостаточной, то документация MPlayer будет очень исчерпывающей альтернативой. Вам обязательно нужно уделить время прочтению документации MPlayer, если Вам нужна информация о поддержке видео под Unix.
16.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> DEVICE, где <N> является номером дорожки, с которой следует начать воспроизведение и DEVICE файл устройства привода DVD. Например, для того, чтобы воспроизвести дорожку 3 с /dev/dvd:
# mplayer -vo dga -dvd 2 /dev/dvd

Для того, чтобы остановить, приостановить или продолжить воспроизведение, обратитесь к привязке клавиш, информация о которой выводится посредством запуска 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 /dev/dvd

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

Если Вы установили mencoder, имейте в виду, что он всё ещё достаточно экспериментален.

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

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

Для того, чтобы преобразовать 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 /dev/dvd и mplayer, запущенный от пользователя root, будет преобразовывать дорожку DVD напрямую. Так как первый раз, скорее всего, Вы будете недовольны полученными результатами, Всё же рекомендуется, чтобы Вы копировали дорожку в файл и работали потом с файлом.
16.4.2.2 Проигрыватель хine

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

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

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

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

xine можно запустить при помощи следующей команды:
% xine

Для того, чтобы открыть файл, можно воспользоваться меню, либо указать имя файла в командной строке без запуска графического интерфейса:
% xine -g -p mymovie.avi
16.4.2.3 Утилиты transcode

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

Так же, как и MPlayer, transcode является очень экспериментальным программным продуктом, который необходимо собирать из порта graphics/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), которые тоже устанавливаются в систему вместе с transcode, есть только короткий вывод параметра -h.

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

Я не сомневаюсь, что в течение года многое из того, что описано в этом разделе устареет. Воспроизведение видео станет менее проблематичным и будет существовать порт в Коллекции Портов FreeBSD, который превратит FreeBSD в мультимедиа центр, воспроизводящий DVD, PVR и виртуальную аудио/видео студию. Но, до тех пор пока этот день настанет, те, кто желает получить максимум от аудио/видео возможностей FreeBSD, должны будут собирать необходимые знания из нескольких списков часто задаваемых вопросов и обучающих статей, а также использовать различные приложения.

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

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

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

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

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

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

Xtheater
Notes[1]
nVidia всё ещё не предоставила спецификации поддержки XVideo в их популярных видеокартах команде XFree86. Обычно эти видеокарты показывают хорошую производительность при работе с XFree86. Пройдет ещё некоторое время, пока XFree86 будет полностью поддерживать XVideo на этих картах.
[2]
Нелегальное воспроизведение DVD является серьёзным преступлением в некоторых странах. Проверьте местные законы перед тем как включать данную установку

Обновлено: 12.03.2015