§ Проигрывание 3D видео в Linux

После покупки DLP проектора с поддержкой функции 3D Ready (пожалуй самое дешевое решение среди 3D проекторов для дома) я столкнулся с такой проблемой, что в интернет есть не очень много информации относительно работы с 3D видео под Linux, и тем более на обычном оборудовании, изначально слабо расчитанном для подобного.


Я встретил огромное количество описаний как заставить работать видеокарты nVidia и ATI с функцией quadro-buffer, но если у вас обычная Intel HD2000+ то читая интернеты складывается впечатление, что максимум что вы можете - это поставить Windows, поставить Stereoscopic Player и молиться, что бы все заработало.

Однако у меня серьезная аллергия на Windows, да и разобраться с процессом было все же интересно, поэтому я решил описать здесь свою конфигурацию для просмотра 3D видео под Linux.

Начну пожалуй с того что имеется в наличии.

  1. Старенький ноутбук Dell R15 с HDMI портом. Ничего выдающегося: Core i5 2го поколения, 8Gb RAM, встроенная видеокарта Intel HD3000

  2. Проектор Acer X1340W с поддержкой 3D Ready и 3D HDMI (если честно то вторую функцию мы не будем трогать, так как мне не удалось пока с ней разобраться как следует, поэтому данная инструкция будет полезна для всех владельцев проекторов DLP 3D-Ready)

  3. Комплект затворных очков DLP-Link (я брал на ebay самые дешевые ~$11, и претензий у меня к ним нет)

  4. Xubuntu 14.04 LTS x86_64

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

Теория

Вообще технология 3D Ready подразумевает всего две вещи: первое - это способность проектора работать на частоте 120Hz, и второе - автоматичесская синхронизация очков по технологии DLP Link (очки сами синхронизируют частоту по сигналу с экрана).

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

Форматы 3D видео

Если вы неискушенный новичек в 3D - то сразу могу вас удивить: форматов 3D видеофайлов не один. Причем тот который нам нужен (он называется Frame Sequence) практически не встречается в природе, и нам его придется создавать “на ходу”. Но пока не сильно об этом беспокойтесь, дальше я покажу - это не сложный процесс.

Итак небольшой список форматов:

  1. Side-by-Side. Когда левый и правый кадр в видеопотоке находятся справа и слева. Обычно обозначается как SBS. Но существуют ещё и Half SBS или он-же HSBS формат, когда левый и правый кадр сжимаются вдвое по ширине. Зачем это сделано я расскажу чуть позже.

  2. Top-and-Bottom. Он же обозначается как HDMI 3D, BluRay 3D, TAB, OU. В этом формате видео для правого и левого кадра находятся один над другим. Так же как и с предыдущим форматом он часто встречается в формате Half-TAB, или HTAB или любое из предыдущих названий с приставкой Half или H

  3. Interlaces - это уже ближе к экзотике, когда строки правого и левого кадра чередуются через одну. В реальной жизни почти не встречается. По сути (и качеству) очень схож с Half-TAB, но отличается по реализации.

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

Ранее я обещал немного рассказать зачем сделан формат Half - и вот настало время пояснить. Проблема 3D видео в том что требуется передавать не один видеопоток а сразу два. Это не проблема когда речь идет про файл на компьютере, мы вольны делать его любого размера. 1920x2160 (HDMI 3D и BluRay 3D) или 3940x1080 (SBS), если хотим получить 3D картинку 1080p. Но такие форматы абсолютно не годятся для телевидения, где формат кадра строго оговорен и ограничен. Для этого телевизионщики придумали трюк позволяющий впихнуть два видеопотока в один стандартный 1080p поток, разделив его на два потока либо 960x1080 (HSBS) либо 1920х540 (HTAB). Interlaces как вы можете заметить идентичен HTAB по количеству хранимых строк в потоке, только хранит строки несколько иначе.

Ежу понятно что этот способ серьезно снижает качество изображения по сравнению с удвоенным потоком FullHD изоображения. Но я забегая вперед сразу вам скажу что если вы хотите гонять FullHD 3D - то вам однозначно потребуется железо помощнее и по специальнее.

Проигрыватель

Для Linux практически во всех статьях предлагается использовать плеер Bino3D, и честно говоря я пробовал его много раз, но лично на меня он не произвел хорошего впечатления. Постоянные подлагивания фона, и общая нестабильность даже на последнем релизе из GIT заставили меня искать решение получше, и оно таки было найдено. Это плеер sView от нашего с вами соотечественника. Более того, для него даже есть официальный PPA для Ubuntu и PKGBuild в AUR для Arch Linux, и SourceRPM для всего остального.

Данный плеер имеет достаточно ущербный интерфейс, но очень хорошую начинку. Он позволяет делать програмную эмуляцию Quad-buffer OpenGL, поддерживает форматы SBS, TAB, Interlaced в том числе и Half версии, и в конце концов имеет поддержку затворных очков (Shutter Glasses) и рускоязычный интерфейс для желающих читать меню на русском.

Настраиваем проигрыватель.

После запуска проигрывателя нам необходимо выбрать режим работы Shutter Glasses, включить эксперементальные функции и активизировать програмную эммуляцию Quad-buffer.

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

Настраиваем проектор

По умолчанию проектор работает на частоте 60Hz, учитывая что мы будем использовать затворные очки - это крайне мало, так как на каждый глаз получается всего по 30Гц. Нам необходимо переключить проектор в режим 120Hz. Мой Acer поддерживает разрешение 1280x720 при частоте 120Hz, именно этот режим я и буду использовать. Для этого открываю консоль и пишу

xrandr --output HDMI --mode 1280x720 --rate 120 --pos 1920x0

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

Настраиваем X-сервер

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

  1. Отключить “TearFree” режим работы видеокарты. По умолчанию в драйверах intel этот параметр уже отключен, однако если вы включали его - то стоит выключить, иначе вы получите фактичесскую частоту обновления на проекторе такую же как на основном дисплее. Все равно не лишним будет проверить файлы в /usr/share/X11/xorg.conf.d/ и xorg.conf на наличие этой опции

  2. Отключить композитный менеджер. Так как я использую Xubuntu - то в моем случае все происходит просто - я открываю Windows Manager Tweaks, выбираю вкладку Composition и убираю галку с Composition Enabled. Если вы используете другой композитный менеджер типа Compton - то выключаете его соответственно. Если же у вас Unity, то скорее всего вам придется отключить композитное расширение в X-сервере. Для этого достаточно просто создать файл /usr/share/X11/xorg.conf.d/60-extensions.conf следующего содержания

Section "Extensions"
   Option "Composite" "Disable"
EndSection

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

После того как все вышеуказанное проделано можно запускать sView и попробовать вывести картинку на экран проектора, а сам проектор переключить в режим 3D. Все должно заработать, а вы увидеть 3D изоображение в очках (если не забыли их включить)

Возможные проблемы.

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

Вторая проблема заключается в том, что при просмотре видео иногда меняется местами изоображение для левого и правого глаза. Ощущается это как будто задний фон полез вперед. В sView есть кнопка для смены правого и левого кадра “на ходу”, но иногда это происходит слишком часто, и начинает надоедать. По моим наблюдениям такое поведение проявляется когда видеопоток превосходит значение 10Mb/s. Это легко отличить по объему фильма. Если фильм полтора часа весит больше 10Gb - перескоки будут очень частыми, при потоке 3Mb/s (2-3 Gb на фильм) перескоков не происходит совсем.

Бороться с этой проблемой можно достаточно просто. Обычно 3D фильмы доступные в интернет имеют видеопоток от 3 до 15Mb/s и при этом размер кадра 1080p. Для моего проектора вывод изоображения в 1080p не имеет никакого значения, так как физически проектор все равно отображает только 720p, поэтому перекодировка фильма при помощи ffmpeg с битрейтом 3.3Mb/s и уменьшением изоображения до 1280x720 дает фильм весом примерно 2-3Gb, с хорошим качеством, и без данной проблемы. Вот команда которой я обычно перекодирую Half-TAB файлы

ffmpeg -i “Video.htab.1080p.mkv” -cfr 21 -c:v libx264 -vf scale=1280x720 -preset faster -c:a copy “Video.720p.mp4”

 

На перекодирование примерно уходит столько же времени сколько длиться сам фильм, звуковую дорожку я не перекодирую, так как сжатие уже сжатого звука обычно приводит к проблемам. В результате я получаю фильм который весит меньше оригинала в 3-5 раз, проигрывается без перескакивания кадров, и при этом обеспечивает отличное качество картинки с потоком ~3Mbps

Так же на сайте sView сказано что различные фоновые процессы активно задействующие дисковую подсистему могут приводить к подобным проблемам. Поэтому перед просмотром 3D я рекомендую все же чистить фоновые процессы. Ну и пожалуй быстрая дисковая подсистема тоже поможет улучшить общую стабильность показа 3D.

Прочие наблюдения

Надо сказать что sView очень толковый плеер, с очень богатым функционалом. Перекодирование видео в реальном виде из TAB в FS отъедает не более 5% процессорного времени, а проблем с пляшущим фоном (как в bino3d) вообще нет.

К сожалению нужно признать что железо хотя и позволяет просматривать 3D изоображение все же вносит свои ограничения, и с ними необходимо считаться. С другой стороны то что просмотр 3D работает даже на открытых драйверах встроенной видеокарты Intel HD3000 является неплохим доказательством того что эта видеокарта способна на многое, а потенциал Linux как платформы для проигрывания 3D несомненно есть.

В bino3d тем не менее есть механизм работы с DLP проекторами, хотя в моем случае он не привел к успеху. Проектор понимает что ему отдают 3D изоображение - но начинает гудеть, а картинка вместо 3D превращается в ЧБ. Видимо этот функционал ещё не до конца реализован и оттестирован. Странность так же заключается в том, что для автоопределения 3D контента через Bino необходимо выключить режим 3D на проекторе.

В некоторых источниках я также встречал указание на то, что если проектору добавить ещё один режим работы 1920х2160 24fps (основной режим работы BluRay 3D) то проектор якобы сам должен переключиться в 3D режим (HDMI 3D) - однако мне подобрать соответствующий режим не удалось. Если удалось вам - пишите в коментарии, и я добавлю этот режим в статью.


comments powered by Disqus