Skocz do zawartości
l0co

Weeb.tv przez DLNA [linux, rtmpdump, mediatomb]

Rekomendowane odpowiedzi

W niniejszym poście chciałbym pokazać w jaki sposób udało mi się uzyskać obraz video pobierany z weeb.tv na konsoli PS3 oraz telewizore samsunga poprzez DLNA. Jest to rozwinięcie wątku KSV, który spatchował rtmpdump-a do pobierania live streamu z weeb.tv oraz Pleskena który dostarczyl patch pod linuxa i w ogóle zainteresował mnie tematem ;)

Co jest potrzebne

  1. spatchowany i poprawnie zainstalowany w systemie rtmpdump (patrz wątki z linkami powyżej)
  2. mencoder (z paczek repozytorium)
  3. mediatomb (z paczek repozytorium)
  4. moje skrypty i config (do pobrania stąd)

Jak to działa

Tutaj parę słów o tym jak to działa do późniejszej samodzielnej walki z różnymi problemami.

Mediatomb to serwer DLNA który udostępnia zasoby multimedialne z lokalnego dysku do klientów DLNA i obsługuje dowolne polecenie transkodujące, które musi tylko pisać strumień do stworzonego przez mediatomba FIFO. Z drugiej strony KSV udostępnił w swoim wątku swój skrypt PHP, który ciągnął dowolny strumień weeb.tv i streamował go VLC. Wydawałoby się więc nic prostszego, niż podać skrypt KSV jako skrypt transkodujący mediatomba, z tym, żeby streamował do FIFO mediatomba, zamiast do VLC i voila. Jednakże oczywiście rzeczywistość okazała się nieco bardziej skomplikowana.

Po pierwsze skrypt PHP od KSV jest w PHP. Okazało się niezbyt dobrym pomysłem odpalanie PHP z mediatomba bezpośrednio, i uzyskałem w ten sposób wielokrotnie Segmentation Fault. Zamiast tego zatem przerobiłem delikatnie skrypt, aby tylko zwracał polecenie transkodujące, natomiast to zwykły bashowy skrypt wykonuje później to polecenie, i wtedy wszystko działa OK.

Drugi problem to killowanie procesu transkodingu przez mediatomba. Ponieważ czysty strumień FLV nie nadaje się dla DLNA do wymienionych urządzeń, trzeba to transkodować do formatu rozpoznawalnego - tutaj wspólny mianownik dla PS3 i Samsunga to MPEG2. Zatem rtmpdump kieruje swój stream do mencodera, który dopiero później kieruje już strumień MPEG2 do FIFO mediatomba. Jak widać chodzi tutaj kilka procesów: sam skrypt bashowy, rtmpdump i mencoder (nie wiem czemu, ale zakłada on 2 procesy do tego). Niestety okazało się że po zakończeniu oglądania/przełączeniu kanału mediatomb killuje tylko sam główny bashowy skrypt, a rtmpdumpy i mencodery hulają sobie dalej. Co może okazać się dosć nieprzyjemne :)

Dlatego samo rozwiązanie jest trochę bardziej zagmatwane. Pierwszy skrypt basha (mediatomb-start) odpala tylko w tle drugi, zajmujacy się wszystkim (mediatomb-dumplive), przekazuje mu jego PID, a następnie wisi w pętli. Ten drugi odpala wszystkie procesy które są potrzebne do streamowania a następnie również wisi w pętli, sprawdzając czy pierwszy ciągle chodzi. Kiedy mediatomb następnie uwala pierwszy skrypt po zakończeniu oglądania, drugi to wykrywa, i killuje wszystkie wątki potomne a następnie sam kończy pracę. W ten sposób mamy odpowiednią czystkę w procesach przy switchowaniu pomiędzy kanałami.

Ostatni skrypt - 'weebtv' - to php-owy skrypt KSV z delikatną przeróbką: zamiast odpalać enkodowanie, wyświetla tylko odpowiednie polecenie na konsoli, do wykorzystania przez skrypt wywołujący.

Instalka

UWAGA 1: ścieżki wszystkie ścieżki muszą być takie, jak podałem (ustawione sa absolutnie w skryptach).

UWAGA 2: żeby uniknąć problemów z prawami pisania, robię wszystko na roocie, więc pierwszy config róbcie na roocie, a najwyżej później kombinujcie z userem (ja w ogóle odpalam to później jako usługę na roocie w rc.d, więc u mnie nie ma problemu z prawami). Przede wszystkim muszą być prawa pisania do /opt/weebtv.

UWAGA 3: wszystkie polecenia które tutaj wykonuję, wykonuję będąc w /opt/weebtv

Najpierw skrypty rozpakowujemy do katalogu /opt tak, aby powstał /opt/weebtv. Skrypt 'weebtv' to wymieniony wyżej skrypt PHP KSV z modyfikacją. W linii 190-191 ustawiamy sobie hasło i usera premium. Teraz możemy sobie zapuścić test:

sudo ./test animalplanet animalplanet.mpg

To powinno nam wyświetlić polecenie (rtmpdump | mencoder) które dumpuje kanał 'animalplanet' do pliku 'animalplanet.mpg' w MPEG2. Szybkie skopiowanie tego (póki nie wygaśnie ticket) i wklejenie w konsolę, powinno uruchomić wyżej wymieniony proces. Po chwili działania można go przerwać (Ctrl+C) i zobaczyć czy mamy kawałek poprawnego MPEG-a w pliku animalplanet.mpg. Jeśli coś nie działa na tym etapie to trzeba zacząć kombinować - może to oznaczać problemy z rtmpdump-em (patrz: wątki KSV oraz Pleskena).

Jak to już działa to możemy pracować dalej. Polecenie:

sudo ./weebtv

Powinna pobrać listę kanałów z weeb.tv i utworzyc dla każdego kanału plik KANAL.mpg w katalogu /tmp/weebtv (pliki są puste). Jeśli ustawiamy później autostart serwera DLNA, to to polecenie trzeba wykonać po każdym odpaleniu kompa (np. w rc.local).

Dalej odpalamy już tylko mediatomba z konfigiem znajdującym się w /opt/weebtv/mtcfg/config.xml:

sudo mediatomb -m /opt/weebtv -f mtcfg

Po odpaleniu powinien napisać, że zassał config z wyżej wymienionego pliku. Znajduje się tam przede wszystkim polecenie przekierowania transkodowania plików mpg, do skryptów weeb.tv. W katalogu tym znajduje się także baza mediatomba (pliki nie-xml), jeśli u kogoś nie działa, to najlepiej ją usunąć i mediatomb założy ją od nowa.

Mediatomb po odpaleniu pokazuje swój adres konfiguracji, u mnie jest to:

2011-12-24 11:16:59    INFO: http://10.0.0.14:49152/

wchodzimy na ten adres i konfigurujemy sobie /tmp/weebtv jako katalog z zasobami (na zakładce Filesystem) - po wejściu w katalog klikam na PLUS w kółeczku po prawej u góry i wybieram metodę synchronizacji 'timed'. Po tej operacji pojawiają się nasze zasoby video w zakładce Database.

A następnie ... cieszymy się weeb.tv w naszym kliencie DLNA :) Do testowania i rozwiązywania lokalnym problemów polecam totem + wtyczka Coherence DLNA/UPnP client, żeby nie latać bez sensu po pokojach, i obserwujemy lokalne logi mediatomba.

Uwagi końcowe

Sposób odpalania w tle i killowania poszczególnym procesów przez moje skrypty wydaje mi się być dość skomplikowany, jakby się znalazł jakiś spec od linuxa mógłby looknąć czy nie da się tego uprościć.

Druga sprawa to parametr "-aspect 16:9 -vf scale=1280:720" w mencoderze w skrypcie 'mediatomb-dumplive' (zresztą możecie sprawdzić jest tam więcej wykomentowanych sposobów transkodingu - można się pobawić). Nad tym parametrem spędziłem najwięcej czasu, otóż na początku (bez tego) wszystko ładnie działało, ale tylko dla telewizji HD. Dla LD (np. tvn24) nie mogłem złapać streama na TV, a nawet czasem kończyło się to twardym crashem TV (wyłączeniem całkowitym). Długo nad tym kombinowałem i wreszcie pomogło przeskalowanie do tego aspectu i tej rozdzielczości każdego video - teraz działa również LD. Jak ktoś będzie miał czas to może z tym pokombinować.

Ostatnia rzecz to jakość video z mencodera - jest bardzo przyzwoita, chociaż oryginalny strumień x264 moim zdaniem nieco lepszy. Ktoś wie czy da się coś jeszcze dopisać do parametrów mencodera żeby to poprawić? Albo inaczej - może ktoś skonstruuje polecenie które nie transkoduje, tylko muxuje ten FLV do formatu rozpoznawanego przez PS3/TV z zachowaniem oryginalnego kodeka? Mnie to się na razie nie udało.

Edytowane przez l0co

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dzięki za opis :). Gwiazdka, czy też Mikołaj coś w tym roku jest bardzo łaskawy hie hie.

Świetna robota!

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Drugi problem to killowanie procesu transkodingu przez mediatomba. Ponieważ czysty strumień FLV nie nadaje się dla DLNA do wymienionych urządzeń, trzeba to transkodować do formatu rozpoznawalnego - tutaj wspólny mianownik dla PS3 i Samsunga to MPEG2. Zatem rtmpdump kieruje swój stream do mencodera, który dopiero później kieruje już strumień MPEG2 do FIFO mediatomba. Jak widać chodzi tutaj kilka procesów: sam skrypt bashowy, rtmpdump i mencoder (nie wiem czemu, ale zakłada on 2 procesy do tego). Niestety okazało się że po zakończeniu oglądania/przełączeniu kanału mediatomb killuje tylko sam główny bashowy skrypt, a rtmpdumpy i mencodery hulają sobie dalej. Co może okazać się dosć nieprzyjemne :)

...nie wystarczylo poprzedzic komendy exec-iem?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dzięki za opis :). Gwiazdka, czy też Mikołaj coś w tym roku jest bardzo łaskawy hie hie.

Świetna robota!

Znaczy się, działa? ;)

...nie wystarczylo poprzedzic komendy exec-iem?

No, nie wiem dokładnie o co chodzi, w każdym razie odpalenie czystego skryptu enkodującego kończy się ubiciem przez mediatomb tylko tego skryptu, a nie procesów rtmpdumpa i mencodera. Ale pewnie można to jakoś przerobić z tym że aż tak bardzo to się nie znam

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No, nie wiem dokładnie o co chodzi, w każdym razie odpalenie czystego skryptu enkodującego kończy się ubiciem przez mediatomb tylko tego skryptu, a nie procesów rtmpdumpa i mencodera. Ale pewnie można to jakoś przerobić z tym że aż tak bardzo to się nie znam

Nie wczytywalem sie w Twoj skrypt, ale rozumiem ze masz gdzies tam linijke uruchamiajaca rtmpdump ... | mencoder ...

Napisz przed tym exec, czyli:

exec rtmpdump ... | mencoder ....

i zobacz czy w takim przypadku ubicie skryptu ubija rtmpdump i mencodera.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie wczytywalem sie w Twoj skrypt, ale rozumiem ze masz gdzies tam linijke uruchamiajaca rtmpdump ... | mencoder ...

Napisz przed tym exec, czyli:

exec rtmpdump ... | mencoder ....

i zobacz czy w takim przypadku ubicie skryptu ubija rtmpdump i mencodera.

Niestety u mnie nie działa. Mam całą komendę w $CMD i:

exec $CMD

nie chce się odpalić, bo

RTMPDump v2.4
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
WARNING: Unknown protocol!

a

exec "$CMD"

też nie, bo

No such file or directory

Samo $CMD wygląda przykładowo tak:

/usr/local/bin/rtmpdump -r "rtmp://r1.getstream.tv/live/101/liveHI" -W "http://weeb.tv/static/player.swf" --weeb "142402a3405610ecd676" --live | mencoder -of mpeg -mpegopts format=mpeg2:muxrate=500000:vbuf_size=1194:abuf_size=64 -srate 48000 -ofps 30000/1001 -ovc lavc -oac lavc -lavcopts autoaspect=1:vcodec=mpeg2video:acodec=ac3:abitrate=640:threads=4:keyint=5:vqscale=1:vqmin=2:vrc_maxrate=60000:vrc_buf_size=7000 -cache 8920 -quiet -aspect 16:9 -vf scale=1280:720 -o kuchnia.mpg -

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Niestety u mnie nie działa. Mam całą komendę w $CMD i:

exec $CMD

nie chce się odpalić, bo

RTMPDump v2.4
(c) 2010 Andrej Stepanchuk, Howard Chu, The Flvstreamer Team; license: GPL
WARNING: Unknown protocol!

a

exec "$CMD"

też nie, bo

No such file or directory

Samo $CMD wygląda przykładowo tak:

/usr/local/bin/rtmpdump -r "rtmp://r1.getstream.tv/live/101/liveHI" -W "http://weeb.tv/static/player.swf" --weeb "142402a3405610ecd676" --live | mencoder -of mpeg -mpegopts format=mpeg2:muxrate=500000:vbuf_size=1194:abuf_size=64 -srate 48000 -ofps 30000/1001 -ovc lavc -oac lavc -lavcopts autoaspect=1:vcodec=mpeg2video:acodec=ac3:abitrate=640:threads=4:keyint=5:vqscale=1:vqmin=2:vrc_maxrate=60000:vrc_buf_size=7000 -cache 8920 -quiet -aspect 16:9 -vf scale=1280:720 -o kuchnia.mpg -

Nie mozesz tak pipe ze zmiennej wykonywac...

Trzeba by to rozbic z:

CMD="rtmpdump ... | mencoder ..."
$CMD

na:

RTMPDUMP_CMD="rtmpdump ..."
MENCODER_CMD="mencoder ..."
$RTMPDUMP_CMD | $MENCODER_CMD

ale exec w takim przypadku sie nie sprawdzi. Mozesz jeszcze sprobowac kombinacji trap/bg/wait. Cos w stylu:

#!/bin/bash
cleanup(){
       echo "Zabijam bg $!"
       kill $! &> /dev/null
}
trap cleanup 0 1 2 3 9 13 15

RTMPDUMP_CMD="ls"
MENCODER_CMD="sleep 10"

$RTMPDUMP_CMD | $MENCODER_CMD &

echo "Czekam na koniec bg $!"
wait $!

kod mam nadzieje w miare czytelny.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

... kod mam nadzieje w miare czytelny.

Jasne, dzięki. Zawsze miło się czegoś nowego nauczyć z linuxa (trap). Byłem ostatnio trochę zajęty a dziś przepity po sylwku, ale wkrótce sprawdzę czy ten sposób zadziała i dam znać

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Witam

Można by to opisać jakimś bardziej przystępnym językiem, bo jestem zainteresowany tym tematem, a nie mam pojęcia o co chodzi z mencoderem, mediatombem czy rptmdump

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Witam

Można by to opisać jakimś bardziej przystępnym językiem, bo jestem zainteresowany tym tematem, a nie mam pojęcia o co chodzi z mencoderem, mediatombem czy rptmdump

A co by miało być bardziej przystępnym językiem? Paczkę do ściągnięcia masz i po kolei jakie komendy wpisywać w konsoli też. Dodatkowe oprogramowaniem (php, mencoder, mediatomb) instalujesz z repozytorium poleceniem:

sudo apt-get install php5-cli mencoder mediatomb

Jedyny problem to spatchowanie rtmpdumpa ale nie będę tutaj się rozwodził nad tym bo dokładniejsze rozważania i potrzebne materiały są w wątku Pleskena.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

ale exec w takim przypadku sie nie sprawdzi. Mozesz jeszcze sprobowac kombinacji trap/bg/wait. Cos w stylu...

Niestety...

Sprawdziłem Twoje skrypty i są jak najbardziej poprawne. Wydaje mi się że coś tutaj jest nie tak z uwagi na sposób działania aplikacji rtmpdump oraz mediatomb.

Po pierwsze w:

$RTMPDUMP_CMD | $MENCODER_CMD &

w takiej konfiguracji rtmpdump nie chce zadziałać i wyrzuca własne błędy. Natomiast poprawnie działa:

bash -c "$RTMPDUMP_CMD | $MENCODER_CMD" &

i również ładnie ubija wątek w tle razem z procesami rtmpdump-a i mencoder-a. Jednakże tak jak w moim przypadku - tylko spod konsoli. Jak wchodzę już przez mediatomba to niestety wszystko zostaje i działa dalej. Cholera wie co on robi, prawdopodobnie jedyny pewny sposób to przegrepować procesy od czasu do czasu i je ręcznie ubić. Więc pewnie przy tym zostaniemy.

W każdym razie wielkie dzięki za pomoc!

A przy okazji pokazał się mi inny problem "linuxowy" który nie wiem jak rozwiązać, może lookniesz? Otóż jeśli łącze jest wolne lub renderer DLNA zbyt "szybki", to zanim przyjdzie pierwszy fragment stream do urządzenia, to ono decyduje że nie dostało streama i resetuje połączenie. I tak w kółko. Np. TV samsunga musi dostać w ciągu 2-3 sekund video bo resetuje połączenie i pyta ponownie o content.

Wymyśliłem pewne rozwiązanie ale nie wiem jak zaimplementować i czy w ogóle się da. Otóż nagrywamy parę sekund materiału do pliku mpeg-a, powiedzmy że 10s. I teraz w momencie uruchomienia TV najpierw przesyłamy do fifo te 10s nagrania (natychmiastowo), natomiast w tle już puszczamy rtmpdumpa, który sobie zaczyna pobierać. Jak mencoder "wyciągnie" te pierwsze 10s z fifo, to juz mamy gdzieś zbuforowany fragment streamu i go dalej przesyłamy do fifo jako content. Jednak to wymagało by jakiegoś przepływnego bufora pośredniczącego pomiędzy źródłem a fifo - orientujesz się może czy w ogóle jest to wykonalne?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ech, dziś miałem bardzo nudny dzień, w dużej mierze patrzenie w progresy... więc sam obczaiłem parę komend, a w szczególności pv i udało mi się osiągnąć powyższe. Robi się to tak:

{ cat cache.mpg; rtmpdump ... | mencoder ... ; } | pv -B 8M > fifo

Potestowałem sobie i .. działa.

Na dropboxie wrzuciłem zupdatowane skrypty, poprawiłem parę rzeczy:

  1. skrypt KSV z nowymi poprawkami (parsowanie layoutu, url-e, nowe kanały)
  2. config username/password wyciągnięty do XML
  3. parę fixów
  4. opcja na dumpowanie weeb.tv z powyższym, dodatkowym cachem

Żeby zadziałał cache trzeba zainstalować:

sudo apt-get install pv

i zdumpować sobie parę sekund materiału do /opt/weebtv/cache.mpg przy użyciu skryptu 'test'. Na razie jeszcze jest to w wersji próbnej, bo jak np. mam cache zrobione z animalplanet, to działa mi poprawnie jako cache do kanału 'animalplanet' a np. do innego później laguje, więc pewnie trzeba jeszcze ujednolicić jakieś parametry podczas transkodowania.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A jaki jest url?

Jest w pierwszym poście. Na szczęście na dropie się nie zmienia jak updatuję plik.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mam problem. Nie mogę odpalić żadnego programu. Niby wszystko ok. Dostaje w konsoli:

2012-01-05 17:14:18 WARNING: You enabled the YouTube feature, which allows you
                            to watch YouTube videos on your UPnP device!
                            Please check http://www.youtube.com/t/terms
                            By using this feature you may be violating YouTube
                            service terms and conditions!

2012-01-05 17:14:18    INFO: Configuration check succeeded.
2012-01-05 17:14:18    INFO: Initialized port: 49152
2012-01-05 17:14:18    INFO: Server bound to: 192.168.1.100
2012-01-05 17:14:18    INFO: Adding HTTP header "transferMode.dlna.org: Streaming"
2012-01-05 17:14:18    INFO: Adding HTTP header "contentFeatures.dlna.org: DLNA.ORG_OP=00;DLNA.ORG_CI=1;DLNA.ORG_FLAGS=01700000000000000000000000000000"
2012-01-05 17:14:19    INFO: MediaTomb Web UI can be reached by following this link:
2012-01-05 17:14:19    INFO: http://192.168.1.100:49152/
2012-01-05 17:15:11    INFO: Arguments: %in %out
started: /tmp/weebtv/hbo-HBO.mpg /tmp/mt_transcode_ON5Y7V [18233]
./usr/local/bin/rtmpdump -r "rtmp://r6.getstream.tv/live/53/liveHI" -W "http://static2.weeb.tv/player.swf" --weeb "171617ca12cc0e98925e;xxxx;xxxx" --live | mencoder -of mpeg -mpegopts format=mpeg2:muxrate=500000:vbuf_size=1194:abuf_size=64 -srate 48000 -ofps 30000/1001 -ovc lavc -oac lavc -lavcopts autoaspect=1:vcodec=mpeg2video:acodec=ac3:abitrate=640:threads=4:keyint=5:vqscale=1:vqmin=2:vrc_maxrate=60000:vrc_buf_size=7000 -cache 8920 -quiet -aspect 16:9 -vf scale=1280:720 -o /tmp/mt_transcode_ON5Y7V -
Token: 171617ca12cc0e98925e

Dumplive process spawned, waiting for the end...
nohup: przekierowanie standardowego wyjścia błędów do standardowego wyjścia

Chyba wszystko zrobiłem zgodnie z instrukcją. Pozdrawiam

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mam problem. Nie mogę odpalić żadnego programu. Niby wszystko ok.

A co masz w /var/log/weebtv.log? Masz premium ustawione? Działasz na roocie? Wykonałeś pierwszy test z wklejeniem outputu ze skryptu 'test'? Co wyświetlił?

Pierwszy i najważniejszy test czy w ogóle ciągnie wygląda tak:

/opt/weebtv$ /bin/bash -c "`./test animalplanet animalplanet.mpg`"

Powinien zacząć ciągnąć animalplanet do pliku animalplanet.mpg.

Edytowane przez l0co

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Uwagi końcowe

Sposób odpalania w tle i killowania poszczególnym procesów przez moje skrypty wydaje mi się być dość skomplikowany, jakby się znalazł jakiś spec od linuxa mógłby looknąć czy nie da się tego uprościć.

Znalazlem chwilke czasu i sprawdzilem dlaczego Ci nie ubija... ogolnie problem jest w tym ze:

1. mencoder sie forkuje

2. zle reaguje na EPIPE jak pisze do pliku

rozwiazaniem problemu jest pipeowanie przez stdout do czegos innego (np cat, lub pv ktorego zaczales uzywac)

Ponizej kod mediatomb-start:

#!/bin/bash
# starts encoding from within the mediatomb (waits to be killed)
cleanup(){
       KPID="$!"
       [ -n "$KPID" ] && {
               echo "Zabijam bg $KPID"
               kill -13 $KPID
       }
}
trap cleanup 0 1 2 3 9 13 15

echo "started: $1 $2 [$$]"
cd /opt/weebtv/

# MPEGTS container
#eval $ORGCMD  | ffmpeg -i pipe: -vcodec copy -acodec copy -vbsf h264_mp4toannexb -f mpegts pipe: | pv -B 2m > $2 &

# AVI container
eval $ORGCMD  | ffmpeg -i pipe: -vcodec copy -acodec copy -f avi pipe: | pv -B 2m > $2 &

echo "Czekam na koniec bg $!"
wait $!

Mozesz oczywiscie nadal uzywac mencodera zamiast ffmpeg, ale z doswiadczenia wiem, ze lepiej sie sprawdza ffmpeg.

Druga sprawa to parametr "-aspect 16:9 -vf scale=1280:720" w mencoderze w skrypcie 'mediatomb-dumplive' (zresztą możecie sprawdzić jest tam więcej wykomentowanych sposobów transkodingu - można się pobawić). Nad tym parametrem spędziłem najwięcej czasu, otóż na początku (bez tego) wszystko ładnie działało, ale tylko dla telewizji HD. Dla LD (np. tvn24) nie mogłem złapać streama na TV, a nawet czasem kończyło się to twardym crashem TV (wyłączeniem całkowitym). Długo nad tym kombinowałem i wreszcie pomogło przeskalowanie do tego aspectu i tej rozdzielczości każdego video - teraz działa również LD. Jak ktoś będzie miał czas to może z tym pokombinować.

Ostatnia rzecz to jakość video z mencodera - jest bardzo przyzwoita, chociaż oryginalny strumień x264 moim zdaniem nieco lepszy. Ktoś wie czy da się coś jeszcze dopisać do parametrów mencodera żeby to poprawić? Albo inaczej - może ktoś skonstruuje polecenie które nie transkoduje, tylko muxuje ten FLV do formatu rozpoznawanego przez PS3/TV z zachowaniem oryginalnego kodeka? Mnie to się na razie nie udało.

Te pseudo smart TV maja taka wykastrowana obsluge UPnP, ktora szumnie nazwano DLNA. Niestety (albo na szczescie) nie mam ani Samsunga, ani PS3 wiec nie moge sprawdzic co dziala, a co nie.. ale sam container mozesz zmienic ffmpeg-iem tak jak w kodzie powyzej.

Co do dlugiego oczekiwania zanim rozpocznie sie stream... to rzeczywiscie jakos strasznie dlugo to trwa. Zamiast podkladania nagranego streama mozesz sprobowac z jakim statycznym jpegiem, ktorego mozesz konwertowac do video. Cos w stylu:

ffmpeg -r 25 -loop_input -i test.jpg -s 1280x720 -vframes 5000 -an -vcodec mpeg4 -f mpegts -r 25 pipe:

Czyli 25fpsowy filmik z obrazka test.jpg o rozdzielczosci 1280x720 trwajacego 5000klatek (czyli 5000/25 sekund), bez dzwieku z codeciem MPEG4 w containerze MPEGTS.

Edytowane przez jezierK

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Znalazlem chwilke czasu i sprawdzilem dlaczego Ci nie ubija...

Bardzo ładne, wreszcie działające poprawnie z mediatombem rozwiązanie! Updatuję skrypty na dropboxie, potrzebujemy już właściwie tylko ze skryptów 'mediatomb-start'. Wywalam skrypt 'test', bo można testować już bez problemu z konsoli za pomocą 'mediatomb-start':

./mediatomb-start animalplanet ap.mpg

Teraz konieczne jest zainstalowanie 'pv':

sudo apt-get install pv

Bez bufora czysty output z ffmpeg-a słabo działa ogólnie i tnie u mnie na konsoli.

Pozostaje problem kompatybilności z rendererem. Twój przykład, najlepszy jeśli chodzi o jakość i wydajność (bez encodingu, tylko mux) działa mi na PS3 ale bez dźwięku. Dźwięk muszę jednak transcodować do mp3. Pozostaje niestety jednak problem z wersjami LD, które są w niekompatyblinej rozdzielczości dla PS3 i nie działają. Ostatecznie ja sobie muszę transkodować wszystko do MPEG2 aby zachować pełną kompatybilność z konsolą.

Obecnie w skrypcie znajduje się kilka profili które można sobie zaaktywować:

  • MPEGTS container / AUDIO COPY / VIDEO COPY - najepsza jakoś video/audio bez transkodingu, na PS3 nie działa dźwięk
  • MPEGTS container / AUDIO MP3 (PS3 compatible) / VIDEO COPY - dźwięk transkodowany do MP3, HD działa w pełni na PS3, ale niestety nie działa LD (nieprawidłowa rozdzielczość video)
  • MPEGTS container / AUDIO MP3 (PS3 compatible) / VIDEO MPEG2 (PS3 compatible) / RESCALE (LD video compatible) - video transkodowane do MPEG2 + rescaling; wszystko działa na PS3
  • MPEGTS container / AUDIO MP3 (PS3 compatible) / VIDEO MPEG2 (PS3 compatible) / RESCALE (LD video compatible) / INITIAL BUFFER - jw. wersja z buforem

Tym razem dla ffmpeg-a jeden nagrany bufor działa mi prawidłowo dla wszystkich telewizji. Poleceniem:

./mediatomb-start animalplanet buffer.mpg

nagrywam sobie 5 sekund materiału. Jeśli istnieje plik 'buffer.mpg' to uruchamiany jest profil transkodingu z buforem. Same klatki jpeg nagrane nie działają mi poprawnie - na konsoli obraz wykrzacza się po przejściu z bufora do streama, pewnie jakieś szczególy ustawień video lub brak audio.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No niestety ale jest jeszcze jeden problem. Po dłuższym testowaniu i dumpie paru streamów przy bieżącej konfiguracji ffmpeg często się zdarza że przycina, natomiast na szajsungu mam co parę sekund artefakty. Do mencodera nie ma co wracać już bo też bliżej potestowałem i tego dziadostwa nie da się sensownie opanować jeśli chodzi o komunikację z procesami. Więc musi zostać ffmpeg, tylko potrzeba dopracować jeszcze config.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A sprawdzales czy Ci procek wyrabia? Takie przekodowywanie HD to troche jednak CPU potrzebuje.

Zobacz tez moze pv przed ffmpegiem (lub opcje ffmpega -bufsize, ktora chyba powinna sie tak samo zachowywac). Moze ma za maly bufor i nie zawsze ma tyle danych ile potrzebuje do przekodowania).

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A sprawdzales czy Ci procek wyrabia? Takie przekodowywanie HD to troche jednak CPU potrzebuje.

Zobacz tez moze pv przed ffmpegiem (lub opcje ffmpega -bufsize, ktora chyba powinna sie tak samo zachowywac). Moze ma za maly bufor i nie zawsze ma tyle danych ile potrzebuje do przekodowania).

Nie, spoko. Procek się wyrabia, mam dość silną maszynę. Okazało się, że po prostu kanał na którym testuję wczoraj ciął. Sprawdzałem surowy stream flv i to samo. Na innym jest OK, tak że ustawienia są poprawne teraz.

Jeszcze wczoraj próbowałem jeden pomysł, ale ciągle do dopracowania. Otóż można sprawdzić poprzez 'ffmpeg -i' jaka jest rozdzielczość bazowego strumienia i gdzieś tą informację zcachować. Następnie w zależności od tego czy jest to hd720 czy nie, transkodować (+resize) lub tylko muxować stream w oryginalnym x264 jak podałeś na początku. Wstępnie wyglądałoby to tak:

INFOCACHE=.infocache
BASENAME=`echo $1 | sed "s/\..*//" | sed "s/.*\///"`

cd /opt/weebtv/

# first check the video resolution
if [ ! -d $INFOCACHE ]; then mkdir $INFOCACHE; fi
if [ ! -f $INFOCACHE/$BASENAME ]; then
 echo "testing video resolution"
 eval `/opt/weebtv/weebtv $1` | ffmpeg -i - 2>$INFOCACHE/$BASENAME
fi

if [ `cat $INFOCACHE/$BASENAME | grep "Video: h264" | grep "1280x720" | wc -l` == 1 ]; then
 echo "using plain audio encoding + muxing, video is 1280x720 compatible"
 eval `/opt/weebtv/weebtv $1` | ffmpeg -i pipe: -vcodec copy -acodec libmp3lame -ar 128000 -ac 2 -vbsf h264_mp4toannexb -f mpegts pipe: | pv -B 2m > $2 &
else
 echo "$PREFIX using full audio/video encoding, incompatible resolution"
 eval `/opt/weebtv/weebtv $1` | ffmpeg -i pipe: -vcodec libx264 -vpre lossless_ultrafast -s hd720 -sameq -acodec libmp3lame -ar 128000 -ac 2 -vbsf h264_mp4toannexb -f mpegts pipe: | pv -B 2m > $2 &
fi

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeszcze wczoraj próbowałem jeden pomysł, ale ciągle do dopracowania. Otóż można sprawdzić poprzez 'ffmpeg -i' jaka jest rozdzielczość bazowego strumienia i gdzieś tą informację zcachować. Następnie w zależności od tego czy jest to hd720 czy nie, transkodować (+resize) lub tylko muxować stream w oryginalnym x264 jak podałeś na początku. Wstępnie wyglądałoby to tak:

Teoretycznie bys mogl tez sprawdzac po urlu, ktory generuje weebtv, bo z tego co sie orientuje poki co weeb.tv nadaje tylko w 2 rozdzialkach. Te HD maja w urlu liveHI, a SD maja live.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Teoretycznie bys mogl tez sprawdzac po urlu, ktory generuje weebtv, bo z tego co sie orientuje poki co weeb.tv nadaje tylko w 2 rozdzialkach. Te HD maja w urlu liveHI, a SD maja live.

Good idea. Ale to już na przyszłą iterację, bo jak na razie to kończę grzebać - trzeba trochę pooglądać zanim znowu coś pozmieniają i będzie trzeba kombinować, bo w sumie jeszcze nic nie obejrzałem tylko grzebię w skryptach :) Ale hmm, no tak zapomniałem - przecież ja nie lubię telewizji ;)

Może jeszcze usiądę jak będę miał chwilę w weekend tylko i napiszę skrypt który pat[beeep]e rtmpdumpa i to wszystko instaluje od zera dla ludzi co się tak nie chcą wgłębiać jak my, bo teraz już naprawdę wszystko pięknie działa, czas na pierwszy release :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Po męczarniach z rtmpdumpem w końcu udało się wszystko odpalić. W totemie i ps3 wszystko śmiga, aż miło, a w tv(samsung) mam problem. Bardzo długo się ładuje, w końcu wskakuje z 2s bufora i średnio co 10 sek pojawia sie jakiś obraz/audio. Nie wiem co mógłbym zmienić w konfiguracji, żeby ruszyło...

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Po męczarniach z rtmpdumpem w końcu udało się wszystko odpalić. W totemie i ps3 wszystko śmiga, aż miło, a w tv(samsung) mam problem. Bardzo długo się ładuje, w końcu wskakuje z 2s bufora i średnio co 10 sek pojawia sie jakiś obraz/audio. Nie wiem co mógłbym zmienić w konfiguracji, żeby ruszyło...

Ale działasz na poprzedniej wersji z mencoderem czy na nowej z ffmpeg?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.
Uwaga: Twój wpis zanim będzie widoczny, będzie wymagał zatwierdzenia moderatora.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić obrazków. Dodaj lub załącz obrazki z adresu URL.


  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...