7.4. Odtwarzanie wideo

Napisał Ross Lippert.

Odtwarzanie wideo to całkiem nowa i gwałtownie rozwijająca się dziedzina. Bądźmy więc cierpliwi, ponieważ nie wszystko pójdzie tak gładko, jak z dźwiękiem.

Zanim zaczniemy, powinnismy znać model karty graficznej i chip, którego używa. Mimo że Xorg i XFree86 obsługują wiele kart graficznych, tylko niektóre sprawdzą się przy odtwarzaniu. Żeby uzyskać listę obsługiwanych rozszerzeń przez serwer X używający naszej karty graficznej użyjmy polecenia xdpyinfo(1), gdy X11 jest uruchomiony.

Dobrym pomysłem jest zaopatrzenie się w krótki filmik MPEG, który może być traktowany jako testowy i posłużyć do oceny różnych odtwarzaczy i opcji. Niektóre z odtwarzaczy DVD będą szukały nośnika DVD domyślnie w /dev/dvd, lub nawet będą miały tę lokalizację na stałe zapisaną. Z tego powodu może być konieczne utworzenie symbolicznego dowiązania do odpowiednich urządzeń:

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

We FreeBSD 5.X, który używa devfs(5) wygląda to trochę inaczej:

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

Pamiętajmy, że z powodu natury devfs(5), ręcznie stworzone dowiązania, takie jak te, nie pozostaną po ponownym uruchomieniu systemu. W celu stworzenia symbolicznych dowiązać, za każdym razem gdy bootujemy system, należy dodać te linie do /etc/devfs.conf:

link acd0 dvd
link acd0 rdvd

Dodatkowo przy odtwarzaniu płyt DVD wymagane są uprawnienia do zapisu do urządzenia, z powodu specjalnych działań podczas dekodowania tego formatu.

Niektóre z omówionych portów polegają na poniższych opcjach jądra, aby się poprawnie zbudować. Przed próbą budowania tych aplikacji, dodajmy te opcje do pliku konfiguracyjnego jądra, zbudujmy je na nowo i uruchommy ponownie komputer:/para>

options CPU_ENABLE_SSE


Aby polepszyć interfejs dzielonej pamięci X11, zalecane jest zwiększenie wartości niektórych zmiennych sysctl(8):

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

7.4.1. Ustalanie możliwości wideo

Jest kilka sposobów aby wyświetlać wideo w X11. Co naprawdę będzie działało jest w głównej mierze uzależnione od sprzętu. Każda opisana tu metoda będzie miała różne efekty na różnym sprzęcie. Po drugie, odtwarzanie wideo na X11 jest tematem, któremu ostatnio poświęca się dużo uwagi i z każdą wersją Xorg'a czy XFree86 mogą być wprowadzone znaczne usprawnienia w tej kwestii.

Lista powszechnych interfejsów wideo:

  1. X11: zwyczajne wyjście X11, używające współdzielonej pamięci

  2. XVideo: rozszerzenie do interfejsu X11

  3. SDL: Simple Directmedia Layer

  4. DGA: Direct Graphics Access

  5. SVGAlib: niskiego poziomu warstwa graficzna konsoli

7.4.1.1. XVideo

Xorg i XFree86 4.X posiadają rozszerzenie zwane XVideo (aka Xvideo, Xv, lub xv), które pozwala wyświetlać wideo w rysowalnych obiektach przez specjalną akcelerację. Rozszerzenie to udostępnia bardzo dobrą jakość odtwarzania nawet na słabych maszynach.

Aby sprawdzić, czy rozszerzenie działa, użyjmy xvinfo:

% xvinfo

XVideo jest wspierane przez naszą kartę, jeśli wynik wygląda jak:

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

Zwróćmy uwagę, że wypisane formaty (YUV2, YUV12, itp.) nie są obecne z każdą implementacją XVideo, a ich brak może przeszkadzać niektórym odtwarzaczom.

Jeśli wynik wygląda jak:

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

wtedy prawdopodobnie XVideo nie jest obsługiwane dla naszej karty.

Jeśli XVideo nie jest obsługiwane dla naszej karty, nie przekreśla to szans na odtwarzanie wideo. Zależnie od karty graficznej i procesora, nadal możemy odtwarzać wideo, jednak wymagania co do sprzętu rosną. W obu przypadkach powinniśmy też przeczytać o sposobach podwyższania wydajności w Sekcja 7.4.3.

7.4.1.2. Simple Directmedia Layer

Simple Directmedia Layer, SDL, była zaplanowana jako przenośna warstwa pomiędzy Microsoft® Windows®, BeOS i UNIX®em, pozwalająca tworzyć wieloplatformowe aplikacje, efektywnie wykorzystujące głos i grafikę. SDL jest niskopoziomową warstwą abstrakcji do sprzętu, która czasem może się okazać bardziej wydajna, niż interfejs X11.

SDL można znaleźć w devel/sdl12.

7.4.1.3. Direct Graphics Access

Direct Graphics Access jest rozszerzeniem X11, które pozwala programowi pominąć serwer X i bezpośrednio modyfikować bufor graficzny. Ponieważ opiera się on na niskopoziomowym mapowaniu pamięci, aby działać, programy go używające muszą być uruchomione jako root.

Rozszerzenie DGA może być przetestowane i sprawdzone pod względem wydajności przez dga(1). Gdy dga działa, zmienia kolory wyświetlacza za każdym razem, gdy przycisk jest wciśnięty. Aby wyjść użyjmy q.

7.4.2. Porty i paczki obsługujące wideo

Sekcja ta omawia programy dostępne w Kolekcji Portów FreeBSD, które pozwalają odtwarzać wideo. Odtwarzanie wideo jest bardzo aktywnym obszarem rozwoju aplikacji, a ich możliwości mogą się różnić od tych, opisanych tutaj.

Na początek ważne jest abyśmy wiedzieli, że wiele z aplikacji wideo działających na FreeBSD było stworzonych jako Linux'owe. Wiele z nich wciąż wymaga testowania (są “beta-quality”). Niektóre z problemów, na które możemy się natknąć, używając paczek programów wideo na FreeBSD to:

  1. Program nie może odtworzyć pliku stworzonego przez inny program.

  2. Program nie może odtworzyć pliku, który sam stworzył.

  3. Ta sama aplikacja na dwóch różnych maszynach, przebudowana na każdej z nich dla niej, odtwarza ten sam plik inaczej.

  4. Pozornie prosty filtr jak przeskalowanie rozmiaru obrazka skutkuje bardzo złym produktem z wadliwej procedury przeskalowania.

  5. Program często zrzuca jądro (core dump).

  6. Dokumentacja nie jest instalowana razem z portem i można ją znaleźć na stronie, albo w katalogu work danego portu.

Wiele z tych aplikacji może prezentować “Linux-isms”. To znaczy, że mogą być pewne kwestie wynikające ze sposobu implementacji pewnych bibliotek w dystrybucjach Linux'a, albo pewne właściwości jądra Linux'a, które przyjęli autorzy programów. Te kwestie nie zawsze są zauważone i rozwiązane przez zarządców portów, co może doprowadzić do takich problemów:

  1. Użycie /proc/cpuinfo do wykrycia właściwości procesora

  2. Niepoprawne użycie wątków, które powoduje zawieszenie się programu

  3. Inne programy nie znajdujące się w Kolekcji Portów FreeBSD, które są powszechnie używane w połączeniu z aplikacją

Jak na razie, programiści tych aplikacji współpracowali z zarządcami portów, aby zminimalizować prace potrzebne do przeniesienia aplikacji.

7.4.2.1. MPlayer

MPlayer jest często i gwałtownie rozwijającym się odtwarzaczem wideo. Celem drużyny MPlayer'a jest szybkość i elastyczność na Linux'ie i innych Unix'ach. Projekt wystartował, gdy jego założyciel miał już dość słabego odtwarzania w innych programach. Niektórzy mogą twierdzić, że graficzny interfejs użytkownika został poświęcony dla strumieniowego modelu. Pomimo tego, gdy przyzwyczaisz się do opcji wiersza poleceń i kontroli za pomocą klawiszy, program działa bardzo dobrze. Zresztą, posiada on także GUI.

7.4.2.1.1. Budowanie MPlayer'a

MPlayer znajduje się w multimedia/mplayer. MPlayer przeprowadza wiele testów sprzętu w czasie budowania. Wynikają z tego dwa fakty. Pierwszy, że tak stworzony program nie będzie przenośny z jednego systemu na drugi. Drugi, że program będzie bardziej wydajny dla konkretnego sprzętu, dlatego ważne jest, aby budować program z portów i nie używać gotowych binarnych paczek. Dodatkowo w czasie budowania może być przekazanych wiele opcji opisanych w pliku Makefile i na początku budowania:

# 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

Domyślne opcje portu powinny być wystarczające dla większości użytkowników. Jeśli jednak potrzebujesz kodeka XviD, musisz podać opcję WITH_XVID w linii poleceń. Domyślne urządzenie DVD także może być zdefiniowane za pomocą opcji WITH_DVD_DEVICE, standardowo przyjmowanym jako /dev/acd0.

Podczas pisania tego tekstu port MPlayer'a zbuduje swoją dokumentację HTML oraz dwa programy, mplayer i mencoder, który jest narzędziem do przekodowywania wideo.

Dokumentacja HTML dla MPlayer'a jest bardzo treściwa. Jeśli czytelnik znajdzie braki w informacjach o sprzęcie wideo i interfejsie w tym rozdziale, dokumentacja powinna być bardzo dobrym dodatkiem. Powinniśmy zdecydowanie poświęcić trochę czasu na jej przeczytanie, jeśli szukamy informacji o obsłudze wideo w UNIX'ie.

7.4.2.1.2. Using MPlayer

Każdy użytkownik MPlayer'a musi ustawić katalog .mplayer we własnym katalogu domowym. Żeby to zrobić, możemy użyć następujących poleceń:

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

Opcje poleceń dla mplayer'a są wypisane na stronie podręcznika (man). Dla większej liczby szczegółów, zobaczmy dokumentację HTML. W tej sekcji opiszemy tylko te najczęściej używane.

Oby odtworzyć plik, taki jak testfile.avi, poprzez jeden z interfejsów wideo użyjmy opcji -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

Warto spróbować każdej z tych opcji, jako że na ich względną szybkość wpływa wiele czynników, które są związane głównie ze sprzętem.

Aby puścić coś z DVD, zastąpmy testfile.avi na dvd://N -dvd-device DEVICE, gdzie N jest numerem fragmentu do odtworzenia, a DEVICE jest węzłem urządzenia DVD. Dla przykładu, aby puścić 3 fragment z /dev/dvd:

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

Notatka: Domyślne urządzenie DVD może być zdefiniowane podczas budowania portu MPlayer'a przez opcję WITH_DVD_DEVICE. Domyślnie urządzeniem tym jest /dev/acd0. Więcej szczegółów znajdziemy w pliku Makefile portu.

Aby zatrzymać, puścić, przewinąć itp. przeczytajmy o przypisaniach klawiszowych, które są wypisane przez uruchomienia mplayer -h, albo przeczytajmy stronę podręcznika.

Dodatkowo ważnymi opcjami są: -fs -zoom, które wyświetlają obraz na pełnym ekranie oraz -framedrop, które powoduje opuszczanie klatek, ale poprawia wydajność.

W celu zmniejszenia długości linii poleceń, użytkownik może stworzyć plik .mplayer/config i ustawić w nim domyślne opcje, np.:

vo=xv
fs=yes
zoom=yes

Ostatecznie mplayer może zostać użyty do zgrania fragmentu DVD do pliku .vob. Aby zgrać drugi fragment z DVD wpiszmy to:

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

Plik wyjściowy out.vob będzie w formacie MPEG i może być manipulowany przy pomocy innych programów opisanych w tej sekcji.

7.4.2.1.3. mencoder

Dobrym pomysłem przed użyciem mencoder'a jest zapoznanie się z jego opcjami w dokumentacji HTML. Wprawdzie istnieje strona podręcznika, ale nie jest ona zbyt użyteczna bez dokumentacji HTML. Istnieje mnóstwo sposobów na poprawienie jakości, zmniejszenie bitrate i zmianę formatów. Niektóre z tych sztuczek mogą być granicą pomiędzy dobrą i złą wydajnością. Podaje tutaj kilka przykładów aby umożliwić nam start. Najpierw prosta kopia:

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

Nieprawidłowe kombinacje opcji w linii poleceń mogą utworzyć pliki wyjściowe, które nie jest w stanie odtworzyć nawet mplayer. Dlatego, jeśli chcemy tylko zgrać do pliku, użyjmy -dumpfile w mplayer'rze.

Aby przekonwertować input.avi do kodeka MPEG4 z dźwiękiem MPEG3 (audio/lame jest wymagane):

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

Utworzony został plik, możliwy do odtworzenia w mplayer i xine.

input.avi może być zastąpione przez dvd://1 -dvd-device /dev/dvd i uruchomione jako root, aby skonwertować fragment DVD bezpośrednio. Jeśli jesteśmy zawiedzeni wynikiem pierwszej próby, zaleca się, abyśmy zgrali fragment do pliku i na nim pracowali.

7.4.2.2. xine

Odtwarzacz wideo xine to projekt o szerokim zakresie dążący nie tylko do bycia rozwiązaniem wideo “wszystko w jednym”, ale także tworzącym podstawowe biblioteki, możliwe do ponownego użycia i modułowych plików wykonywalnych, które mogą zostać rozszerzone za pomocą wtyczek. xine jest dostępny jako paczka, oraz port multimedia/xine.

Odtwarzacz xine jest wciąż dość surowy, ale jest wystarczająco prosty na początek. W rzeczywistości xine wymaga szybkiego CPU i szybkiej karty graficznej, lub obsługi XVideo. GUI jest użytkowalne, ale nieco szorstkie.

Podczas pisania tego tekstu xine nie posiada swojego modułu, który pozwala na odtwarzanie zakodowanych płyt DVD CSS. Istnieją za to moduły od osób trzecich, które na to pozwalają, jednak żaden z nich nie znajduje się w Kolekcji Portów FreeBSD.

W porównaniu do MPlayer'a, xine robi więcej dla użytkownika, ale w tym samym czasie odbiera mu możliwość większej kontroli co do jakości. xine najlepiej sprawuje się na interfejsie XVideo.

Domyślnie xine uruchomi się z graficznym interfejsem użytkownika. Menu może być wtedy użyte do otworzenia danego pliku:

% xine

Alternatywą może być wywołanie do bezpośredniego odtworzenia pliku, bez GUI:

% xine -g -p mymovie.avi

7.4.2.3. Narzędzia transcode

Program transcode nie jest odtwarzaczem, ale zbiorem narzędzi do przekodowywania plików audio i wideo. transcode pozwala nam łączyć pliki wideo, naprawiać uszkodzone pliki używając narzędzi linii poleceń z interfejsami strumieniowymi stdin/stdout.

Duża liczba opcji może być podana podczas budowania portu multimedia/transcode. Budując transcode zalecamy użycie make z parametrami jak poniżej:

# make WITH_OPTIMIZED_CFLAGS=yes WITH_LIBA52=yes WITH_LAME=yes WITH_OGG=yes \
WITH_MJPEG=yes -DWITH_XVID=yes

Zaproponowane ustawienia powinny być wystarczające dla większości użytkowników.

Aby zilustrować zdolności transcode, przykład jak skonwertować plik DivX do pliku PAL MPEG-1 (PAL VCD):

% transcode -i input.avi -V --export_prof vcd-pal -o output_vcd
% mplex -f 1 -o output_vcd.mpg output_vcd.m1v output_vcd.mpa

Wynikowy plik MPEG, output_vcd.mpg, jest gotowy do odtwarzania MPlayer'em. Moglibyśmy nawet wypalić go na płytę CD-R aby utworzyć Video CD. W tym przypadku potrzebowalibyśmy dodatkowych narzędzi, multimedia/vcdimager oraz sysutils/cdrdao.

Istnieje strona podręcznika dla transcode, ale powinniśmy zajrzeć na wiki transcode po więcej informacji.

7.4.3. Dodatkowe informacje

Różne paczki programów wideo dla FreeBSD są rozwijane gwałtownie. Jest całkiem prawdopodobnym, że w bliskiej przyszłości wiele z omawianych tutaj problemów zostanie rozwiązanych. Tymczasem Ci, którzy chcą dostać jak najwięcej z możliwości audio/wideo na FreeBSD będą musieli użyć wiedzy połączonej z przeczytania kilku FAQ i tutoriali, oraz użyć kilku różnych aplikacji. Sekcja ta istnieje, aby dać tym czytelnikom odnośniki do tych dodatkowych informacji.

Dokumentacja MPlayer'a jest bardzo bogata w informacje techniczne. Dokumenty te powinny być przeczytane przez każdego, kto chce uzyskać doświadczenie w obszarze wideo w UNIX'ie. Lista dyskusyjna MPlayer'a jest nieprzyjazna wobec każdego, kto nie fatygował się z przeczytaniem dokumentacji. Jeśli więc planujemy tworzyć raporty błędów dla nich, RTFM.

xine HOWTO zawiera rozdział nt. usprawnień wydajności, który jest przydatny dla wszystkich odtwarzaczy.

Ostatecznie, są inne obiecujące programy, które czytelnik może spróbować:

Ten i inne dokumenty można pobrać z ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

W przypadku pytań o FreeBSD prosimy przeczytać dostępną dokumentację przed kontaktem z <questions@FreeBSD.org>.
W sprawie zapytań o tę dokumentację prosimy o kontakt z <doc@FreeBSD.org>.