Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Radio sterowane przez Wi-Fi

przemwach 08 Sty 2020 08:22 2451 7
  • Witam,

    Przedstawię Wam odbiornik radia internetowego i nie tylko sterowany za pośrednictwem Wi-Fi.
    Ale od początku. Zaczęło się to kilkanaście lat temu gdy poczciwe radio Amator firmy Unitra zakończyło swój żywot. Zaistniała pustka musiała zostać zastąpiona. W pierwszej kolejności zawitała nisko budżetowa mikro wierza, z przykrością odnotowałem, że nie dało się tego słuchać. Więc szybka rewizja domowego magazynu "przyda się". To co mogło się nadać to aktywne kolumny 2+1 i jeszcze działający komputer typu desktop pracujący jako serwer plików. Wszystko zapowiadało się ciekawie i interesująco, ale nie obyło się bez problemów.
    Na tak zwanym serwerze pracuje dystrybucja GNU/Linux - Slackware w wersji 14.1 i jak to przystało na serwer nie posiadała zainstalowanego podsystemu audio. Gdy pierwszy problem został rozwiązany pojawił się kolejny jaki odtwarzacz do obsługi strumieni radiowych, wybór padł na "Music on console" (mocp), który ma dodatkowe zalety ale o nich później. Po instalacjach i pierwszych próbach okazało się, że jakość dźwięku jest na naprawdę dobrym poziomie. Muzyka miała barwę a komentarze i rozmowy zrozumiały wydźwięk nawet przy minimalnych ustawieniach głośności. Pierwszy tydzień minął na testach i na kontroli radia za pomocą konsoli. Co dla pozostałych użytkowników dyskwalifikowało tę formę sterowania radia do codziennego użytku.
    Kolejny problem.
    Jak umożliwić pozostałym członkom rodziny na łatwy i przyjazny sposób sterowania radiem. Po szybkiej rewizji możliwych sposobów komunikacji z serwerem wyszło, że jedyny dostępny sposób to Wi-Fi i naturalnie byłoby zastosować serwer http. Jako, że ówczesne telefony posiadały już Wi-Fi i przeglądarkę internetową na pokładzie umożliwiało to na stworzenie łatwo dostępnego interfejsu do radia. Pierwszy serwer http powstał na bazie skryptów bash i netcat-a (nc). NetCat uruchomiony w trybie serwera na porcie 80:
    Code:
    nc -l -p 80

    NetCat otrzymane zapytanie od przeglądarki przekazywał do skryptu, który analizował pierwszą linię zapytania:
    Code:
    GET /radio.html HTTP/1.1

    Jeżeli w linii tej była metoda GET to skrypt wysyłał zawartość żądanego pliku w tym przypadku radio.html.
    Code:
    POST /station/1 HTTP/1.1

    Jeżeli otrzymane zapytanie zawierało metodę POST to uruchamiany był skrypt "station" z parametrem 1. Jak z powyższego przykładu co oznaczało uruchom radio z pozycji 1 z listy stacji. Po przeanalizowaniu zapytania i wydobyciu potrzebnych informacji przekazywane
    były parametry do programu "mocp". Tu ujawniają się zalety tego programu.
    Code:
    mocp -S

    Tak wywołany program startował w trybie serwera i przechodził do pracy w tle. Następnie za pomocą kolejnych parametrów można sterować jego działaniem.
    Code:
    mocp -l adres_url

    Rozpoczęcie odtwarzania podanego adresu.
    Code:
    mocp -s

    zatrzymanie odtwarzania.
    Tak stworzone radio na bazie skryptów bash działało przez kolejne kilka miesięcy. Doczekało się rozbudowy o kolejny pokój. Z jednego serwera i za pośrednictwem zewnętrznych kart muzycznych podpiętych przez USB obsługuję radio w dwóch pokojach. W kolejnej wersji zamieniłem program "NetCat" serwerem "Apache" i wykorzystałem interfejs CGI. Pod ten interfejs przerobiłem istniejące skrypty.
    Jako pasjonat języka C (nie mylić z C++) w wersji 3.0 postanowiłem zastąpić serwer "Apach" własnym serwerem i pozbyć się skryptów. Ta wersja otrzymał po stronie klienta dodatkowo asynchroniczną obsługę sterowania za pośrednictwem JavaScript. Co w eliminowało konieczność odświeżania strony www przy każdym zapytaniu. Strona raz załadowana odświeżała swoją zawartość przy każdym kliknięciu bez przeładowywania całości. Wersja 3.0 działała aż do mijających świąt.
    Problemy pojawiały się stopniowo. Część stacji przestała odbierać, inne odtwarzały się ale z lagami. W trakcie poszukiwania przyczyn usterek okazało się, że część nadawców przeszła na bardziej wyrafinowane sposoby dostępu do swoich strumieni radiowych. Inni przeszli na kodowane strumienie (https). Kolejni zmienili format strumieni z mp3 na aac+. Wszystkie te problemy dotyczyły odtwarzacza, który pracował nieustannie od pierwszej wersji. Z częścią problemów poradziłem sobie dzięki forum "Music on console" gdzie znalazłem rozwiązanie problemu strumieni https (szyfrowanych). Polegała ona na dodaniu linii kodu w jednym z plików źródłowych programu. Zmiana formatu na aac+ i poprawne jego odtwarzanie w "mocp" przysporzyła więcej problemów. Łącznie z prze kompilowaniem kodeków "ffmpeg", które jak się okazało nie rozwiązały problemu. Po kolejnej analizie forum "mocp" okazało się, że nie obsługuje
    on strumieni aac czy też aac+. Co postawiło realizację radia pod znakiem zapytania.
    Przy opisach kompilacji kodeka ffmpeg natknąłem się na możliwości bezpośredniego odtwarzania plików jak i strumieni przez aplikację ffmpeg.
    Code:
    ffmpeg -i nazwa_pliku.mp3
    
    ffmpeg -i adres_url_strumienia

    Po dalszym zagłębieniu się w temat okazało się, że kodek ten potrafi przekazać zdekodowany strumień bezpośrednio do żądanej karty muzycznej co też było ważnym aspektem przy wyborze odtwarzacza.
    Code:
    ffmpeg -i źródło -f alsa hw:0,0

    A wisienką na torcie była możliwość odtwarzania strumienia z youtub-a. Nie jest to bezpośrednie, ale za pośrednictwem youtube-dl.
    Code:
    ffmpeg -i (youtube-dl -x -g https://youtube.com) -f alsa hw:0,0

    Gdzie opcja -x oznacza pobierz tylko strumień audio, a flaga -g tryb symulacji podaj adres url pliku. W ten oto sposób poszerzyłem możliwości swojego radia.
    Więc w okresie po świątecznym a przed nowym rokiem mając już pełen zasób wiedzy ruszyłem do prac programowych. Sam interfejs www pozostał prawie nie zmieniony. Zmieniła się struktura samego serwera. Główna część serwera jest napisana w C i bazuje na wersji 3.0. Została rozszerzona o plik konfiguracyjny oraz o wczytywani plików z katalogu źródłowego bezpośrednio do pamięci ram. Miało to przyśpieszyć ładowanie strony, ale jak się okazało po testach jest na podobnym poziomie jak w poprzedniej wersji gdzie pliki były odczytywane z dysku przy każdym zapytaniu. Wynika to pewnie z buforowania często otwieranych plików przez system.
    Plik konfiguracyjny dodałem w cellu umożliwienia testowania kolejnych wersji radia na tym samym sprzęcie dla różnych ustawień.
    Jeszcze jedno udogodnienie jakie dodałem to możliwość kontroli całego radia za pośrednictwem konsoli. Okazuje się, że w przypadku jakichkolwiek błędów jest to najszybszy sposób do diagnostyki. Aby móc to zrealizować powstała hybryda składająca się z głównego programu serwera http napisanego w "C" i szeregu prostych skryptów wykonawczych. Podczas kontroli radia przez przeglądarkę serwer uruchamia poszczególne skrypty z odpowiednimi parametrami aby włączyć np. radio. Ten sam skrypt można wywołać również z konsoli osiągając dokładne ten sam efekt.
    Obecna wersja pozwala odtwarzać strumienie radia internetowego, strumienie audio z youtub-a, inne strumienie radiowe nie będące na liście stacji oraz odtwarzanie plików z katalogów na dysku. Te wszystkie opcje działają niezależnie dla każdego z pokoju, w którym są zainstalowane głośniki radia podłączone do jednego serwera.
    Radio sterowane przez Wi-Fi

    Przedstawiony interfejs wygląda tak samo na każdym urządzeniu. Pierwszy wiersz przycisków pozwala wybrać źródło muzyki i pokój w którym ma ona grać. I tak oznaczenie "FM_N" informuje, że źródłem jest radio internetowe i ma grać w pokoju północnym. Po kolejnym naciśnięciu przycisku "FM" przełączymy się na pokój południowy oznaczony "FM_S". Analogicznie wygląda sprawa dla pozostałych
    przycisków wyboru "źródła", przy wybranej opcji pojawia się dopisek "_N" lub "_S" informujący o wybranym pokoju. Rząd przycisków mający w oznaczeniu literę "V" służy do kontroli głośności w wybranym pokoju. Na samym dole znajduje się rozwijalna lista z wyborem stacji jeżeli wybranym źródłem jest radio. Gdy jako źródło wybrany jest dysk lokalny to w liście tej
    są umieszczone nazwy katalogów z plikami audio. W przypadku wybrania źródła YT lub URL lista rozwijalna zastąpiona jest polem
    tekstowym gdzie wklejamy adres url utworu lub strumienia.
    Po kilku dniach pracy najnowszej wersji "radia" już udało się nam wykorzystać wszystkie nowe opcje.

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
    O autorze
    przemwach
    Poziom 13  
    Offline 
    przemwach napisał 35 postów o ocenie 15, pomógł 7 razy. Jest z nami od 2003 roku.
  • #2
    Awyrdonyt
    Poziom 15  
    Czy do słuchania radia internetowego muszę wymienić kartę dźwiękową na kartę muzyczną?
  • #4
    przemwach
    Poziom 13  
    @Awyrdonyt Nic nie musisz jeżeli twoja karta dźwiękowa - muzyczna działa bez zastrzeżeń to nie ma takiej potrzeby.

    @janusz121 Tak zwany serwer to stary desktop i posiada kartę dźwiękową - muzyczną. W pierwszej wersji nawet z niej korzystał, następnie powstała idea obsłużenia drugiego pokoju. Zakupiłem więc zewnętrzną kartę dźwiękową pod USB i jak porównałem jakość odtwarzania wewnętrznej karty do zewnętrznej... To w niedługim czasie wymieniłem kartę wewnętrzna na zewnętrzną.
    Cały dźwięk obsługuje przez "Alsa". O "Pulseaudio" tylko trochę czytałem i nie mam planu się przesiadać na "Pulseaudio".
  • #5
    janusz121
    Poziom 16  
    Rozumiem, źle przeczytałem to, co napisałaś. Myślałam, że zrobiłeś to tak, że masz serwer, przetwarzający stacje radiowe i idzie to do odbiorników - tych kilku pc z kartami muzycznymi. Moje radio to zlepek tutoriali, oparte jest na mpd. No i ten mpd, w pliku mpd.conf, ma wyjścia audio, alse, pulseaudio, httpd - z tego ostatniego korzystam na telefonie, ponieważ na moim pi nie odpaliłem bluetooth w konsoli ( pokonało mnie to- a może zbyt mało się starałem), aktywowałem to wyjście, jak wiesz zrobiłem sobie radio internetowe grające u mnie w podsieci (lanie po wifi, czy jak to się fachowo nazywa), no i telefon z słuchawkami ( na androidzie), używam jako "Walkmana". Ale Ty się zdecydowanie "narobiłeś" bardziej. Pozdrawiam
  • #6
    przemwach
    Poziom 13  
    @janusz121 Pozwoliłem sobie przeczytać Twój projekt Odbiornik radia internetowego oparty o Raspberry pi 1. - pierwszy projekt.. Też ciekawy.
    W moich planach jest przesiadka całego obecnego serwera na Raspberry Pi 2. Pierwsze testy już wykonane i nie jest źle. Jedyny problem to mój za słaby zasilacz (ładowarka od telefonu), jak podłączam zewnętrzne karty dźwiękowe to brakuje mocy. Jak się zbiorę i dokupię odpowiedni zasilacz to się przesiadam. Idea jest taka radia x2 plus serwer plików. Mocy powinno wystarczy w zupełności. Teraz tak zwany serwer zawiera: Pentium III 800 MHz 128 MB RAM a Pi: 4 rdzenie do 900 MHz i 1 GB RAM. Przy testach porównawczych ciężko wyłonić zwycięzcę.
  • #8
    Peter1994
    Poziom 13  
    Czegoś podobnego szukałem. Mam nadzieję, że i mi uda się coś takiego zrobić.