Własny odtwarzacz audio/wideo w kilku linijkach

Aktualnie zajmuję się coraz intensywniej przygotowywaniem się do utworzenia projektu związanego z moją pracą magisterską (czy wręcz będącym jego podstawą 😉 ). Jego kluczową częścią jest odtwarzanie multimediów dlatego dzisiaj sprawdziłem w jaki sposób najlepiej to ugryźć. Oczywiście im bardziej dostępne dla ludzi (wieloplatformowe) tym lepiej.

Na początek pomyślałem sobie, by napisać plugin do programu Totem. Jest to Linuksowy program do odtwarzania filmów i utworów. Kiedy rozpocząłem swoje poszukiwania odpowiednich tutoriali w tym temacie okazało się, jest z tym raczej krucho. Bardzo słaba dokumentacja i wsparcie od kogokolwiek skłoniła mnie jednak do poszukania czegoś innego.

Jak zwykle w takich sytuacjach pierwsze kroki kieruję w stronę Pythona. Po prostu wiem, że on potrafi zazwyczaj wszystko co potrzeba. W związku z tym, że jakiś czas temu uczyłem się PyQt4 pomyślałem, że może i to przyjdzie mi z pomocą.

Oczywiście nie zawiodłem się 🙂 Okazało się bowiem, że Qt ma przepiękne wsparcie dla odtwarzania audio/video poprzez Phonon. Po kilku minutach przypatrywania się genialnej dokumentacji Qt (ma świetne przykłady) napisałem kilka linijek w interaktywnej konsoli Pythona i moim oczom ukazało się okienko z odtwarzaniem filmu! Linijki te wyglądały tak:

>>> import sys
>>> from PyQt4.QtGui import QApplication
>>> from PyQt4.phonon import Phonon
>>> app = QApplication(sys.argv)
>>> player = Phonon.VideoPlayer(Phonon.VideoCategory)
>>> source = Phonon.MediaSource(„/sciezka/do/pliku”)
>>> player.setVisible(True)
>>> player.play(source)

W ten sposób na ekranie pojawiło się proste okienko z odtwarzaniem filmu. Przy pomocy tego narzędzia można napisać prosty program, który uruchomiony z linii poleceń rozpocznie odtwarzanie filmu:

import sys
from PyQt4.QtGui import QApplication
from PyQt4.phonon import Phonon

if __name__ == '__main__':    
    app = QApplication(sys.argv)
    app.setApplicationName("Simple Video Player")
    player = Phonon.VideoPlayer(Phonon.VideoCategory)
    
    source = Phonon.MediaSource(sys.argv[1])
    player.play(source)
    player.setVisible(True)
    
    app.exec_()

W taki sposób możemy stworzyć prosty odtwarzacz. To jednak nie wszystko! W pakiecie dostajemy zupełnie za darmo odtwarzanie strumieni sieciowych. Jeśli do MediaSource podamy URL to player po prostu rozpocznie strumieniowanie i odtwarzanie filmu czy pliku dźwiękowego. Oczywiście podając URL statycznego pliku graficznego również ujrzymy go na ekranie. Problem pojawia się jedynie z przezroczystością w plikach PNG, ale do moich zastosowań zupełnie wystarczy mi to co działa dobrze.

Coraz bardziej się przekonuję o tym, że Python+Qt4 to duet nie do zastąpienia. Wszystko o czym pomyślę można osiągnąć pisząc w zasadzie bardzo niewiele linijek i na dodatek wszystko da się uruchomić na różnych systemach operacyjnych. Pięknie! 🙂

Klawisze Multimedialne Acer Aspire 5610 i Ubuntu

Dzisiaj postanowiłem uruchomić wreszcie klawisze multimedialne będące częścią mojego laptopa. W internecie szukałem tego już kilka razy, ale zawsze kończyło się niepowodzeniem.Zawsze poradniki dotyczyły raczej ustawienia działających już klawiszy tak aby kontrolowały one odtwarzacze muzyki czy cokolwiek innego.

U mnie jednak problem był inny – system w ogóle nie rozpoznawał tych klawiszy. Nawet polecenie xev nie reagowało. Dzisiaj podszedłem do sprawy nieco inaczej. Zdałem sobię sprawę, że do obsługi dodatkowych klawiszy potrzebuję dodatkowego sterownika. Okazało się, że to był dobry trop. Potrzebowałem sterownika acerhk. Dla mojego laptopa wystarczy skompilować ściągnięte źródła i zainstalować je poleceniami:

make
sudo make install

U mnie początkowo kompilacja nie chciała przejść i make wywalał jakiś błąd z modyfikacją CFLAGS. W internecie znalazłem złotą poradę jak to ominąć… Wystarczyło zakomentować liniję (chyba 18.) w której ustawiane były flagi (CFLAGS+=…). I to pomogło 🙂

Następną częścią było załadowanie sterownika acerhk do modprobe‚a. Aby to zrobić wystarczy wydać polecenie:

modprobe acerhk force_series=2020 poll=0

Po tej operacji xev rejestruje już klawisze specjalne i nie ma problemów z ustawieniem skrótów klawiszowych za pomocą programu gnome-keybinding-properties.

Na tym można byłoby zakończyć, ale przecież klawiatury mają więcej przycisków niż tylko multimedialne, a nie wszystko da się ustawić za pomocą wyżej wspomnianego programu. Przykładowo jeśli chcielibyśmy uruchomić jakiś dowolny program. Z takimi ustawieniami niestety nie da się tego zrobić. Pokombinowałem więc trochę więcej 🙂

Jak za każdym razem postanowiłem zasięgnąć wiedzy za pomocą Google. Okazało się, że można uruchamiać dowolne programy, ale najpierw trzeba dodać odpowiednie klawisze do konfiguracji programu xmodmap. U mnie niestety nie było pliku xmodmap.config nigdzie w katalogu /etc ale za to doczytałem się gdzieś, że wystarczy stworzyć w katalogu użytkownika plik .Xmodmap i tam zapisać konfigurację dodatkowych klawiszy.

Najpierw za pomocą polecenia:

xmodmap -pke > .Xmodmap

wygenerowałem sobie plik ze wszystkimi kodami klawiszy. Teraz wystarczyło już tylko zajrzeć do pliku /usr/share/X11/XKeysymDB w celu obejrzenia jakie symbole klawiszy mamy do dyspozycji. Przy definiowaniu klawiszy specjalnych warto zwrócić uwagę na symbole postaci XF86*. Ja potrzebowałem tylko symboli: XF86Mail, XF86Launch0, XF86WWW. Przy czym XF86Launch0 użyłem do klawisza specjalnego na którym jest literka P i nie mam zielonego pojęcia co ma przedstawiać 🙂

Teraz pozostało już tylko wpisać to co trzeba do .Xmodmap wygenerowanego wcześniej. Aby uzyskać kody klawiszy, o które chodzi wystarczy uruchomić program xev w terminalu i powciskać te klawisze. Wtedy w terminalu pokażą się informacje dotyczące wciśniętego klawisza. Mnie interesował keycode. Przykładowe wciśnięcie klawisza ‚a’ wygeneruje takie coś:

KeyPress event, serial 32, synthetic NO, window 0x1a00001,
    root 0x1a6, subw 0x0, time 9636362, (542,315), root:(550,364),
    state 0x0, keycode 38 (keysym 0x61, a), same_screen YES,
    XLookupString gives 1 bytes: (61) "a"
    XmbLookupString gives 1 bytes: (61) "a"
    XFilterEvent returns: False

Kiedy już znałem kody klawiszy wystarczyło odnaleźć odpowiadające im linijki w .Xmodmap i dopisać do nich odpowiednie symbole. W moim przypadku były to linijki:

keycode 130 = XF86WWW
[...]
keycode 151 = XF86Launch0
[...]
keycode 236 = XF86Mail

Aby uwzględnić te zmiany wystarczy wydać polecenie:

xmodmap .Xmodmap

Po kolejnym uruchomieniu komputera załadują się one automatycznie.

Teraz wystarczyło już tylko ustawić skróty wystarczy uruchomić program gconf-editor i odnaleźć w nim klucz: apps/metacity/keybinding_commands/command_1 i wprowadzić tam komendę jaką chcemy uruchomić za pomocą klawisza. Potem w kluczu apps/metacity/global_keybindings/run_command_1 ustawić odpowiednie symbole klawiszy. Ja chciałem aby odpowiedni przycisk uruchamiał mi firefoxa na stronie gmail.com dlatego w run_command_1 wpisałem XF86Mail. W ten sposób przypisałem klawisz o kodzie 236 (XF86Mail) do komendy 1.

Na koniec zostało jeszcze tylko ładowanie sterownika acerhk podczas startu systemu. Niestety dodanie go w opcjach sessji GNOME niewiele daje ponieważ musi on być uruchomiony z prawami root’a. Dopisanie go do /etc/rc.local też mi niewiele dało dlatego stworzyłem sobie własny skrypt startowy:

sudo touch /etc/init.d/myinit
sudo chmod 755 /etc/init.d/myinit

Teraz trzeba wyedytować plik za pomocą jakiegoś edytora tekstu i dodać tam dwie linijki:

#! /bin/sh
modprobe acerhk force_series=2020 poll=0

Ostatnia rzeczą jaką trzeba zrobić jest poinformowanie demona init o tym, że powinien załadować ten skrypt przy starcie. Robi się to następującym poleceniem:

sudo update-rc.d /etc/init.d/myinit defaults

System cośtam pomieli, powyświetla i po wszystkim skrypt myinit będzie uruchamiany przez demona init.d a co za tym idzie załadowane zostaną sterowniki do klawiatury acera.

Tyle chyba wystarczy na jednego posta 🙂