Czołówki radiowych serwisów informacyjnych — jak stworzyłem nową kompilację?

Kategoria: Telewizja i radio Data publikacji:

Od publikacji mojej ostatniej kompilacji czołówek serwisów informacyjnych w stacjach radiowych minęło siedem lat. Wczoraj opublikowałem nowy materiał w tej formie: zestawienie aktualnych czołówek niusowych. Jeśli interesujesz się mediami i informatyką, zachęcam cię do obejrzenia materiału oraz do zapoz­nania się z opisem procesu jego powstania. Podzielę się tym, w jaki sposób zebrałem nagrania i jakich narzędzi użyłem.

Kompilacja znajduje się na moim (dosyć pustym) kanale na YouTube. W jaki sposób powstała?

Etap pierwszy: wykonanie nagrań

Moim celem było wykonanie nagrań serwisów informacyjnych we wszystkich znanych mi ogólnopolskich i ponadregionalnych stajach radiowych — w tym samym momencie, tego samego dnia i o tej samej godzinie. Do tego celu wykorzystałem program Streamripper, który nie posiada interfejsu okienkowego i uruchamia się go z wiersza polecenia. Wytypowałem 21 stacji radiowych, a następnie z bazy radio-browser.info pozyskałem adresy URL strumieni każdej z nich.

Przygotowałem niewielki skrypt w Bashu, który w tym samym momencie wykonuje cztero­minutowe nagrania 21 stacji radiowych jednocześnie. Skonfigurowałem na moim serwerze automatyczne uruchomienie skryptu dnia 2 listopada dokładnie o godzinie 6:59:00.
Kod skryptu prezentował się mniej więcej tak:

#!/bin/bash

opt="-Asi -l 240 -d ./audio"

streamripper "http://stream3.polskieradio.pl:8950/;.mp3" -a "01 Polskie Radio Jedynka" $opt &
streamripper "http://stream3.polskieradio.pl:8952/;.mp3" -a "02 Polskie Radio Dwójka" $opt &
streamripper "http://stream3.polskieradio.pl:8954/;.mp3" -a "03 Polskie Radio Trójka" $opt &
streamripper "http://stream3.polskieradio.pl:8956/;" -a "04 Polskie Radio Czwórka" $opt &
streamripper "http://stream3.polskieradio.pl:8080/;.mp3" -a "05 Polskie Radio 24" $opt &

streamripper "http://195.150.20.9/RMFFM48" -a "11 RMF FM" $opt &
streamripper "http://195.150.20.242/rmf_maxxx" -a "12 RMF Maxxx" $opt &
streamripper "http://31.192.216.8/RMFCLASSIC48" -a "13 RMF Classic" $opt &

streamripper "http://zet-net-01.cdn.eurozet.pl:8400" -a "21 Radio Zet" $opt &
streamripper "http://ant-kat.cdn.eurozet.pl:8602" -a "22 Antyradio" $opt &
streamripper "http://mel0101.cdn.eurozet.pl:8804/mel-ktw.mp3" -a "23 Meloradio" $opt &

streamripper "http://waw01-02.ic.smcdn.pl:8000/t042-1.mp3" -a "31 Radio Eska" $opt &
streamripper "http://waw01-02.ic.smcdn.pl:8000/t049-1.mp3" -a "32 Vox FM" $opt &
streamripper "http://waw01-01.ic.smcdn.pl:8000/t050-1.mp3" -a "33 Radio WAWA" $opt &
streamripper "http://plu01.cdn.eurozet.pl:8318/plu-waw.mp3" -a "34 Radio Plus" $opt &

streamripper "http://gdansk1-1.radio.pionier.net.pl:8000/pl/tuba10-1.mp3" -a "41 Tok FM" $opt &
streamripper "https://stream.open.fm/201" -a "42 Złote Przeboje" $opt &
streamripper "https://stream.open.fm/203" -a "43 Radio Pogoda" $opt &
streamripper "https://stream.open.fm/202" -a "44 Rock Radio" $opt &

streamripper "https://n06a-eu.rcs.revma.com/1nnezw8qz7zuv?rj-ttl=5&rj-tok=AAABdY40jtAAhSn1mhKN8U6Tkg" -a "51 Muzo.fm" $opt &
streamripper "http://198.50.238.178:5946/stream" -a "52 Radio Maryja" -u "noelo" $opt &

wait

Zaplanowałem uruchomienie kodu na dokładnie minutę przed pełną godziną, ponieważ rozgłośnie przykładają różną wagę do punktualności rozpoczęcia serwisów, a także ze względu na fakt, iż niektóre stacje (np. RMF FM) na początku odtwarzania strumienia doklejają dodatkową reklamę, zasłaniającą bieżący dźwięk ze stacji radiowej. Oczywiście nie obyło się bez kłopotów. :)

Program Streamripper nie jest kompatybilny z niektórymi formatami strumieni używanych przez rozgłośnie radiowe. Żeby nie tracić zbyt dużo energii na poszukiwanie zamiennika dla tej aplikacji, użyłem alternatywnych strumieni, dlatego na przykład nagranie z Meloradia pochodzi z wersji katowickiej, a nie ogólnopolskiej/warszawskiej.

Skrypt Bash w oryginalnej formie przygotowałem kilka dni przed faktycznym uruchomieniem go na serwerze. W międzyczasie wpisany w nim strumień stacji Muzo.fm przestał działać, dlatego dla tej stacji musiałem dograć nagranie oddzielnie, dzień później.

Serwer jednej ze stacji jest tak skonfigurowany, aby wykrywać zgrywanie sygnału przez program Streamripper i blokować dostęp. Co ciekawe, jest to stacja, po której najmniej się tego spodziewałem, a mianowicie… Radio Maryja! Blokadę można jednak bardzo prosto obejść: wystarczy skonfigurować program tak, by przestawiał się nie jako „streamripper”, a na przykład jako „noelo”. ;) Tak czy siak nagranie Radia Maryja i tak musiałem wykonać oddzielnie, ponieważ o siódmej rano zamiast serwisu informacyjnego jest tam nadawana msza święta.

Etap drugi: obróbka nagrań

Na wykonane nagrania nałożyłem kompresję dynamiki dźwięku oraz zaaplikowałem niewielką dawkę korektora graficznego, aby nagrania brzmiały równo i przyjemnie, oczywiście według mojego własnego, subiektywnego odczucia. :) Użyłem programu Audacious — popularnego linuksowego odtwarzacza muzycznego, który posiada takie możliwości.

W połączeniu z dość nietypową funkcją „wypluwania” odtwarzanego dźwięku nie tylko na kartę dźwiękową, ale też do plików WAV, byłem w stanie wykonać to zadanie w dosłownie kilka sekund na wszystkich 21 nagraniach. Kompresja dynamiki Audaciousa nie jest jednak doskonała, co w kompilacji można zauważyć na przykład w nierówno przyciszonym ostatnim „piknięciu” sygnału czasu w nagraniu z Programu Trzeciego Polskiego Radia. Był to jednak kolejny kompromis, którym zaoszczędziłem sobie czas.

Finalnie każde z nagrań przyciąłem za pomocą powszechnie znanej aplikacji Audacity, aby zawierało tylko intro i kawałek pierwszego niusa, ew. niewielki wstęp przed intrem serwisu.

Etap trzeci: przygotowanie materiałów wideo

Jako że jestem programistą stron internetowych, najłatwiejszą dla mnie metodą „rysowania po ekranie” jest posługiwanie się narzędziami witryn WWW. Dlatego zamiast pełnowymiarowego oprogramowania do tworzenia filmów wykorzystałem HTML i CSS — języki, w których „progra­muje się” strony internetowe.

Dla każdej ze stacji radiowych przygotowałem niewielki dokument HTML, w którym ułożyłem logo, dodatkowy opis i „pasek postępu” nagrania, a także dodałem animacje CSS. Stworzyłem też dwa dodatkowe dokumenty HTML — dla czołówki kompilacji i dla napisów końcowych.

W każdym pliku HTML „na sztywno” wpisałem czas trwania animacji paska postępu równy długości nagrania audio. Przyjąłem też konwencję, że przy końcowym montażu nie będę robić żadnych przejść, a ostatnia klatka każdego składowego materiału wideo musi równać się pierwszej klatce następnego składowego wideo. Dlatego w finalnej kompilacji pod koniec każdego nagrania audio logo stacji znika animacją, a pasek postępu chowa się w dół.

Aby uatrakcyjnić formę, dodałem też animację pojawiania się logo każdej ze stacji radiowych, a także animację wejścia tytułu całego filmu w czołówce kompilacji. Obydwie te animacje wybrałem z kolekcji stworzonej w ramach projektu Animate.css.

Odnalezienie loga każdej ze stacji radiowych w wysokiej jakości nie zawsze było możliwe i tutaj też pozwoliłem sobie na kompromis tam, gdzie było to konieczne. W przypadku logo niektórych nadawców musiałem dokonać manualnych interwencji, np. wyciąć białe tło w logo Rock Radia i Vox FM lub dodać tło w logo Radia Pogoda, aby było je widać na ciemnym tle całego materiału.

Przygotowane w ten sposób 23 pliki w formacie HTML przekonwertowałem do formatu wideo — do plików MP4. Użyłem w tym celu narzędzia record-page, które potrafi wygenerować materiał wideo z dokumentu HTML za pomocą silnika przeglądarki Chromium. Narzędzie record-page nie posiada interfejsu okienkowego lub tekstowego, a dostarcza jedynie API dla środowiska Node.js, dlatego przygotowałem sobie niewielki program JavaScript napisany „na brudno”:

#!/usr/bin/node 

const path = require('path');
const fs = require('fs');
const record = require('record-page');

const args = process.argv.slice(2);
 
(async () => {
    await record({
        url: 'file://' + path.resolve(process.cwd(), args[0]),
        filename: args[1],
        framesPerSecond: 60,
        maxFramesCount: 60 * args[2],
        framesDir: fs.mkdtempSync('/tmp/record'),
    });
})();

Aby przekonwertować plik rmf-fm.html do pliku rmf-fm.mp4, należy uruchomić:

./record.js rmf-fm.html rmf-fm

Renderowanie 60 sekundowej animacji w full HD i 60 klatkach na moim laptopie trwało wiele minut, dlatego podjąłem próbę uruchomienia wielu kopii powyższego skryptu, aby renderować kilka animacji jednocześnie. Niestety w wyniku jakiegoś błędu w record-page i/lub Chromium, proces renderowania przerywał się samoczynnie z tego powodu. Ostatecznie napisałem niewielki skrypt w Bashu, który uruchamiał renderowanie każdego z 23 filmów sekwencyjnie, jeden po drugim, i zostawiłem go na całą noc. ;-)

Etap czwarty: złożenie kompilacji w całość

Finalnie złożyłem wszystkie nieme składowe pliki wideo w całość: czołówkę, animacje każdej ze stacji i napisy końcowe. Następnie podłożyłem odpowiednie nagrania audio. Zrezygnowałem z podkładu muzycznego czołówki i napisów końcowych, bo nie miałem na nie pomysłu, a dziesięciominutowa sesja googlowania nic w tym zakresie nie zmieniła. :)

Do złożenia kompilacji w całość wykorzystałem edytor wideo Shotcut. Niby nie miało to żadnego znaczenia, bowiem film składałem z „prefabrykatów”, ale tak się składa, że wybór edytora był nieprzypadkowy, a wynikał z przyzwyczajenia.

Shotcut posiadał bowiem funkcję dodawania dokumentu HTML do filmu za pomocą tzw. efektu „Overlay HTML” i to pierwotnie właśnie z jego użyciem zamierzałem zbudować cały materiał. Niezbyt często robię jakiekolwiek filmy — ostatni raz zdarzyło mi się to na początku 2017 roku, gdy przygotowywałem pracę do szkoły. Również i wtedy animowane plansze wykonałem w formie stron HTML i osadziłem je właśnie przez wspomniany efekt Shotcuta.

Niestety, ta funkcja została kilka tygodni temu usunięta. Decyzja twórców była podyktowana wyłącznie kwestiami technicznymi i pragmatyzmem. Powodem był fakt, że framework Qt, używany pod spodem przez edytor Shotcut, usunął wsparcie dla silnika WebKit renderującego strony internetowe, a silnik ten był niezbędny programowi Shotcut do realizowania tej funkcji. Ze względu na utrzymywalność, bezpieczeństwo i stabilność przyblokowanie się na starej wersji frameworka Qt było niemożliwe.

Zapytałem autorów programu, czy planują w przyszłości przywrócić możliwość umieszczania stron HTML w filmach. W odpowiedzi dostałem grzeczną sugestię, by nauczyć się używać „prawidłowych narzędzi do robienia animacji”. Trudno jest się z nią nie zgodzić, ale nie byłbym sobą, gdybym nie spróbował zrobić czegoś po swojemu, na przekór. ;-)

Dodaj komentarz