Mobilne multimedia V2.0 - serwer DLNA, klient TV lub Android

multimedia dlna android linux minidlna 2013-05-06, 01:05,

Dwa i pół roku temu zamieściłem opis, jak poradzić sobie z mobilnymi multimediami w sieci lokalnej. Trochę czasu minęło, część standardów się zmieniła, niektóre rzeczy zostały w miejscu.
Na początek gorąco zachęcam do lektury poprzedniego tekstu, a przynajmniej wstępu.

Wtedy pisałem o wsparciu dla Playstation3, Nokiach E52 i N95 oraz iPadzie pierwszej generacji i iPhone w wersji 3. Od tego czasu na rynku pojawił się oraz zrobił furorę system Android. Na rynku pojawiło się także wiele urządzeń typu NAS z wbudowanym serwerem DLNA. Sam nad jednym się zastanawiam, jednak póki co bazuję jeszcze na starym, poczciwym Maku Mini G4.

Kilka miesięcy z opisywanym w poprzedniej części serwerem uShare dało mi trochę do myślenia. Przede wszystkim to, że projekt od 2007 roku nie jest rozwijany i nie mam co specjalnie liczyć na rozwiązanie trapiącego mnie problemu. Problemu, który powodował, że po kilku(nastu) dniach bez restartu usługa zaczynała obciążać procesor w 100%. Nie fajnie. Szczególnie wtedy, gdy działo się to podczas mojej nieobecności, a maszyna wyła wiatrakami na pełnych obrotach. Tymczasowym rozwiązaniem, które stosowałem było automatyczne restartowanie usługi w nocy, ale nie o to chodziło. Postanowiłem więc zmienić platformę udostępniającą DLNA i zacząłem testować MiniDLNA.

Platformy sprzętowe

Serwery:

  • Mac Mini G4, Fedora 11 PPC, jądro 2.6.30.10-105.2.23.fc11.ppc
  • Airport Extreme Gigabit
  • WD MyBook 500 GB / USB

Klienci:

  • Sony Xperia P, Android 4.0 oraz 4.1
  • Google Nexus 7, Android 4.2.2
  • Telewizor Sony Bravia z serii HX.

Tym razem z testów wyleciały urządzenia z nadgryzionym jabłkiem, a to dlatego, że po porażce z iPadem jedynką postanowiłem nie inwestować dalej w rozwiązania spod znaku Apple. I nie jest to wyraz jakiegoś focha, żalu czy niechęci do firmy. Uznaję pewne cechy i zalety tego systemu, szczególnie jego bezpieczeństwo dla mniej doświadczonych użytkowników, jednak zamknięta specyfikacja sprawia, że można natknąć się na brzydkie niespodzianki. I taką był iPad 1, który dysponując 256 MB pamięci, w moich zastosowaniach stał się bezużyteczny po upływie mniej niż roku.

Serwerownia

Podstawą każdego rozwiązania sieciowego jest dobry serwer. Bez tego daleko nie pojedziesz, więc skupiłem się najpierw nad odpowiednią (czytaj stabilną) konfiguracją. Na pierwszy ogień poszedł serwer DLNA i przestrzeń dyskowa.

Moim celem było udostępnienie filmów, muzyki oraz zdjęć do telewizora i tabletu (a przy okazji sprawne działanie na telefonie). Dysk w serwerze jest malutki, ma tylko 40 GB, więc cały ciężar udostępniania poszedł na dysk zewnętrzny. Obecnie pięćset gigabajtowy MyBook, docelowo jakaś macierz z prawdziwego zdarzenia (marzy mi się Synology DS213, ale to dosyć gruba półka cenowa). Ze względu na to, że pracuję na Maku, w mojej sieci jest jeszcze kilka dysków pełniących inne role (między innymi kopia zapasowa Time Machine) to dysk twardy podłączony jest do punktu dostępowego Airport Extreme. Ten udostępnia go w sieci lokalnej przez standardowy protokół SMB/CIFS, tak że dostęp możliwy jest do niego z Linuxa, Windowsa oraz Maka jednocześnie. Wybitnie wolny (maksymalny transfer do/z dysku w porywach do 7 MB/s, na co dzień bliżej 4 MB/s), stąd coraz (obok chęci konfiguracji w trybie RAID-1) więcej myśli o Synology lub iOmedze z prawdziwego zdarzenia.

Serwerem multimedialnym jest wspomniany Mac Mini G4. Stara, poczciwa konfiguracja bazująca na 32-bitowym procesorze PowerPC 1.42 GHz oraz 512 MB pamięci RAM. Do tego zastosowania w sam raz. Na komputerze uruchomiony jest Linux Fedora Core w wersji 11. Jednej z ostatnich wspierających PowerPC tej generacji.

Dysk twardy mapowany jest automatycznie przy każdym starcie, dzięki odpowiedniemu wpisowi w /etc/fstab.conf

//airport/WD_TM_500GB /mnt/Dok500 cifs credentials=/sciezka_do_pliku_z_haslami,file_mode=0666,dir_mode=0777 0 0

Dzięku temu nie muszę się martwić o odpowiednie zmapowanie dysku i gdy odpowiednie serwisy się uruchamiają, to dostęp do plików jest już zapewniony.

MiniDLNA 1.0.25

Kolej na serwer multimediów. Na dysku twardym umieściłem katalogi:

/dlna/photo
/dlna/audio
/dlna/video

Serwują one odpowiednio zdjęcia, muzykę oraz filmy. Do zdjęć wrócę na końcu, muzyka to synchronizowany przez rsync folder iTunes, a wideo to po prostu pliki z filmami mp4. Tu od razu uwaga - protokół DLNA nie obsługuje napisów. Jeśli chcesz więc mieć napisy na filmie, to trzeba je od razu wkompilować (osadzić) w wideo. Na nic triki z plikami SRT, TXT i innymi formatami. Tego po prostu nie ma w specyfikacji DLNA i już. Można za to umieścić w strumieniu kilka ścieżek dźwiękowych (np. 2.0 stereo oraz AC-3).

Konfigurację zaczynamy od pobrania źródeł pakietu MiniDLNA w wersji 1.0.25. Rozpakowujemy plik gz w naszym katalogu domowym.

tar -xzvf minidlna_1.0.25_src.tar.gz

Powstanie katalog o nazwie minidlna-1.0.25. Wchodzimy do niego i kompilujemy.

cd minidlna-1.0.25
make

Po kilku minutach będziemy mieli gotowy plik minidlna, który wrzucamy do /usr/sbin i gotowe. Wystarczy teraz tylko dorzucić skrypt startowy i minidlna mamy z głowy.

W pliku /etc/minidlna.conf umieszczamy przykładową konfigurację pakietu. Wewnątrz poprawiamy ścieżki do plików z multimediami:

# port for HTTP (descriptions, SOAP, media transfer) traffic
port=8200

# set this to the directory you want scanned.
# * if have multiple directories, you can have multiple media_dir= lines
# * if you want to restrict a media_dir to a specific content type, you
#   can prepend the type, followed by a comma, to the directory:
#   + "A" for audio  (eg. media_dir=A,/home/jmaggard/Music)
#   + "V" for video  (eg. media_dir=V,/home/jmaggard/Videos)
#   + "P" for images (eg. media_dir=P,/home/jmaggard/Pictures)

media_dir=V,/mnt/Dok500/dlna/video
media_dir=A,/mnt/Dok500/dlna/audio
media_dir=P,/mnt/Dok500/dlna/photo


# set this if you want to customize the name that shows up on your clients
friendly_name=MacMini

# set this if you would like to specify the directory where you want MiniDLNA to store its database and album art cache
db_dir=/var/cache/minidlna

# this should be a list of file names to check for when searching for album art
# note: names should be delimited with a forward slash ("/")
album_art_names=cover.png/Cover.png/Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg/AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg/Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg

# set this to no to disable inotify monitoring to automatically discover new files
# note: the default is yes
inotify=yes

# set this to yes to enable support for streaming .jpg and .mp3 files to a TiVo supporting HMO
enable_tivo=no

# set this to strictly adhere to DLNA standards.
# * This will allow server-side downscaling of very large JPEG images,
#   which may hurt JPEG serving performance on (at least) Sony DLNA products.
strict_dlna=no

# default presentation url is http address on port 80 #presentation_url=http://www.mylan/index.php

# notify interval in seconds. default is 895 seconds.
notify_interval=900

# serial and model number the daemon will report to clients
# in its XML description
serial=12345678
model_number=1

Jeśli w sieci miałoby pracować kilka serwerów MiniDLNA to zmieniamy pole serial, żeby było unikalne w sieci.
Testowo uruchamiamy usługę, żeby zobaczyć czy działa.

minidlna -d -R

Parametr -d powoduje uruchomienie w trybie konsoli (tj. wszystkie komunikaty diagnostyczne lecą na ekran, proces przerywamy standardowo CTRL+C). Parametr -R powoduje przeładowanie bazy plików (sprawdza m.in. czy w zdefiniowanych katalogach pojawiło się coś interesującego).

Jeśli wszystko działa jak należy to wywołujemy jeszcze polecenie

chkconfig --add minildna

i gotowe. Możemy ustawić usługę minidlna, by uruchamiała się przy każdym starcie systemu.

chkconfig on minidlna

Jeśli chodzi o konwersję wideo to zachęcam lekturę drugiej połowy oryginalnego artykułu o multimediach w sieci. Są tam podane przykłady wykorzystania programów Handbrake i ffmpeg. Są one prawdziwe do dziś. I mimo wielu zwolenników otwartych formatów, takich jak Ogg Vorbis i Theora to h.264, mp3, AC3 i LC-AAC rządzą w świecie mobilnym, czy nam się to podoba czy nie. Jeśli więc chcesz mieć spokój to po prostu dostarcz urządzeniom DLNA materiały w takim formacie, jaki one tolerują.

Urządzenia klienckie

Zakładając, że wszystko poszło jak należy, na urządzeniach klienckich pojawi się dostęp do naszego serwera.

W przypadku telewizora wchodzimy w Media / Muzyka, Zdjęcia lub Wideo. Na liście pojawi się serwer pod podaną przez nas wcześniej nazwą.

Dla Nexusa i innych urządzeń z systemem Android, które nie mają natywnego klienta DLNA (lub jeśli nie chcemy z niego korzystać) pobieramy jedną z aplikacji klienckich. Może to być Skifta albo MediaHouse. W Play Markecie jest ich kilka, więc każdy znajdzie coś dla siebie.

W przypadku Xperii P możemy skorzystać z wbudowanego oprogramowania. Pomijam telefony z Androidem 2.3.7, zakładam, że wszyscy zainstalowali już przynajmniej system w wersji 4.0.4, który dostępny jest oficjalną aktualizacją już od kilku miesięcy.

Zależnie od posiadanej wersji, dla systemu 4.0.4 pośród aplikacji jest pozycja „Podłączone urządzenia”. Jej uruchomienie spowoduje wyświetlenie dostępnych serwerów DLNA. A tam można wybrać, czy chce się przeglądać zdjęcia, filmy czy muzykę.

W najnowszej, jeszcze ciepłej, bo dostępnej zaledwie od pięciu dni aktualizacji do 4.1.2 Jelly Bean wspomniana aplikacja znika. Zastąpiła ją nowa, zmieniona funkcjonalność aplikacji Album, Walkman oraz Filmy. Teraz, żeby odtworzyć dany rodzaj materiału z serwera DLNA wystarczy wejść do jednej z tych aplikacji i wybrać serwer z listy. Na zdjęciu poniżej przykład z funkcją Zdjęcia.

Aplikacje zatem są, wszystko teraz zależy od nas, jak chcemy to skonsumować. Na Androidzie najlepiej spisuje się systemowa przeglądarka zdjęć. Do odtwarzania muzyki w systemie Sony dobrze radzi sobie wbudowany odtwarzacz. Na gołym Androidzie nieźle radzi sobie Skifta.

Jeśli chcesz zachować kompatybilność także z telewizorem (a te potrafią być wybredne), to warto pliki dostosować do jednego wspólnego formatu, np. mp4 (nie każdy TV radzi sobie z MKV oraz AVI).

Najprościej powinno być ze zdjęciami. I faktycznie jest, tylko niektóre telewizory np. wspomniana Bravia wymaga specjalnych zabiegów, by odtworzyć pliki poddane edycji np. w Photoshopie. Napisałem osobny artykuł, jak poradzić sobie, gdy telewizor wyświetla komunikat odtwarzanie niemożliwe. Polecam lekturę, jeśli masz do czynienia z takim trudnym przypadkiem.

Dla zaawansowanych. MiniDLNA i problem z sendfile z udziałów CIFS

Opisana przeze mnie metodologia działa świetnie, pod jednym warunkiem. Pliki udostępniane są z dysku lokalnego. W moim przypadku to nie wchodzi w grę (za mała powierzchnia), więc wszystko wylądowało na udziale CIFS.

Przekłada się to na dwa problemy. Pierwszy - brak obsługi Inotify, informującego o tym, że pojawiły się nowe pliki w katalogach. Musimy zatem ręcznie zrestartować usługę, żeby zorientowała się, że coś się pojawiło.

Drugi - nie wszyscy klienci DLNA zachowują się prawidłowo w takiej konfiguracji. Pewna sekwencja zdarzeń (np. wywoływana przez bardzo dobry odtwarzacz MX Player) kończyła się zawsze wysypaniem serwera.

Bliższa analiza problemu rozjaśniła nieco sytuację. Problem dotyczył odczytywania plików i wysyłania ich przez HTTP do klienta. Widok logu:

[2013/05/05 17:22:34] minidlna.c:1015: debug: HTTP connection from 10.0.1.101:50381
[2013/05/05 17:22:34] upnphttp.c:118: debug: Client found in cache. [type 100/entry 1]
[2013/05/05 17:22:34] upnphttp.c:728: debug: HTTP REQUEST: GET /MediaItems/17.mp4 HTTP/1.1
Host: 10.0.1.200:8200
Connection: Keep-Alive
User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)


Segmentation fault
[2013/05/05 17:22:34] upnphttp.c:1100: debug: sendfile error :: error no. 75 [Value too large for defined data type]

Trochę mi to zajęło, ale doszukałem się w sieci pojedynczej podpowiedzi, która sugeruje, że systemowa funkcja sendfile na udziałach typu CIFS i bibliotece HTTP nie działa prawidłowo. Dobrałem się do pliku upnphttp.c z pakietu MiniDLNA. Od linii 1309 zaczyna się funkcja send_file. Zmieniłem w niej zmienną try_sendfile na 0, by nie podejmowała próby używania tej biblioteki, przekompilowałem pakiet i uruchomiłem ponownie. Od tego momentu znikły wszystkie problemy z odtwarzaniem plików.

void
send_file(struct upnphttp * h, int sendfd, off_t offset, off_t end_offset)
{
	off_t send_size;
	off_t ret;
	char *buf = NULL;
	int try_sendfile = 0; // 2013.05.05 - sendfile causes problem on Fedora 11 via CIFS kernel. Trying regular I/O instead.

	while( offset < end_offset )
	{
		if( try_sendfile )
		{

Po tej zmianie wszystkie transfery wideo odbywają się prawidłowo i mogę swobodnie korzystać z mojego ulubionego MX Playera. Mimo wąskiego pasma do dysku, zostawiłem na kilka godzin jednoczesne odtwarzanie różnych fragmentów plików na TV, dwóch telefonach i tablecie. Na żadnym się nie zawiesiło, a leciwy komputer obciążony był w 10%. Jedynie pasmo do rutera stanowiło barierę, by dorzucić większą liczbę transferów (lub materiały jakości HD).

Komentarze