Liquidsoap nedir? İnternet radyosunda otomatik yayını yöneten betik dili
Şarkı geçişleri, araya giren jingle'lar ve canlı DJ'e sorunsuz geçiş çoğu radyoda bir betikle yapılıyor. Liquidsoap'un kaynak mantığını, crossfade ve harbor girişini resmî belgelerden anlattık.
Gece üçte bir internet radyosunu açtığınızda şarkılar birbirine yumuşakça bağlanıyor, arada istasyonun tanıtım sesi giriyor, bir DJ bağlandığında müzik alçalıp yerini canlı sese bırakıyor. Stüdyoda kimse yok. Bu işi çoğu zaman bir insan değil, bir betik yapıyor. Açık kaynak dünyasında bu betiklerin en bilinen dillerinden biri Liquidsoap.
Liquidsoap'un resmî sitesi aracı "genellikle internet radyolarını ve web televizyonlarını hedefleyen, karmaşık ses ve video akışı üreteçleri kurmaya yarayan güçlü bir araç" diye tanımlıyor. Proje, Savonet adlı açık kaynak girişimin ürünü. AzuraCast gibi hazır radyo paketleri de otomatik yayın motoru olarak Liquidsoap'u kullanıyor; yani bir panelde "çalma listesi" oluşturduğunuzda arka planda aslında bir Liquidsoap betiği yazılıyor.
-
Yemek tarifleri
Malzeme listesi, adım adım yapılış, süre ve porsiyon bilgisiyle. Çorbadan tatlıya kategoriye göre gez ya da aradığını doğrudan ara.
Tariflere bak → -
Nasıl yapılır rehberleri
Telefon ayarlarından resmî işlemlere, hesap güvenliğinden günlük hayattaki küçük sorunlara: numaralı adımlar ve tahmini süreyle anlatılmış rehberler.
Rehberleri gör → -
Program arşivi
Tarayıcılar, güvenlik araçları, ofis ve medya yazılımları. Her kayıtta ne işe yaradığı, sürümü ve indirme bağlantısı.
Programlara göz at → -
Sesli ve görüntülü sohbet
Odalarda grup görüntülü sohbet, birebir sesli arama ve canlı yayın. Tarayıcıdan çalışır — eklenti, uygulama ya da kurulum gerekmez.
Odalara gir →
Liquidsoap'u anlamak, internet radyosunun görünmeyen katmanını anlamak demek. Aşağıdaki anlatım projenin resmî belgelerine dayanıyor; belgelerin kendisi de sürümden sürüme değişiyor, bu yazı hazırlanırken sitede güncel kararlı sürüm olarak 2.4.5 gösteriliyordu.
Radyo zincirinde Liquidsoap'un yeri
Liquidsoap belgelerindeki hızlı başlangıç rehberi internet radyosunu üç halkalı bir zincir olarak anlatıyor:
- Akış üreteci: Ses akışını oluşturan yazılım. Liquidsoap burada duruyor; bir DJ'in bilgisayarındaki yayın programı da aynı rolü üstlenebilir.
- Yayın sunucusu: Icecast gibi, akışı alıp dinleyicilere dağıtan sunucu.
- Oynatıcı: VLC, tarayıcı ya da telefon uygulaması gibi, akışı çekip hoparlöre veren program.
Belgeler önemli bir ayrıntının altını çiziyor: akış, dinleyici olsun olmasın her zaman üreteçten sunucuya gönderiliyor; sunucu da onu her dinleyiciye ayrı ayrı iletiyor. Dolayısıyla Liquidsoap yayını "üreten" taraf, kalabalığa "dağıtan" taraf değil.
Her şey bir "kaynak"
Liquidsoap'un dilini diğer programlardan ayıran fikir, "kaynak" (source) kavramı. Belgelere göre kaynak, ses ve/veya video, parça işaretleri ve üst veri (metadata) taşıyan bir medya akışı. Bir çalma listesi bir kaynak; tek bir ses dosyası bir kaynak; canlı bağlanan bir DJ de bir kaynak.
Betik, bu kaynakları birbirine bağlayan bir ağaç kuruyor. Basit kaynaklar birleştirilerek karmaşık kaynaklar elde ediliyor, en sonda da bu ağaç bir "çıkışa" takılıyor. Çıkış, hoparlör, bir dosya ya da Icecast sunucusu olabilir. Belgelerin ifadesiyle kaynaklara hayat veren şey bu çıkışlar; çünkü içeriği sürekli olarak çeken onlar.
Bir benzetmeyle: kaynaklar su boruları, birleştirme işlemleri vanalar ve kavşaklar, çıkış ise musluk. Musluk açık kaldıkça su akmak zorunda.
"Bu kaynak düşebilir" uyarısı
Suyun kesilmemesi gerektiği fikri Liquidsoap'un en karakteristik kuralını doğuruyor. Belgeler her zaman kullanılabilir olan kaynağa "düşmez" (infallible), bir şeylerin ters gidebileceği kaynağa "düşebilir" (fallible) diyor. Varsayılan olarak bir çıkış, kendisine bağlanan kaynağın düşmez olmasını istiyor; değilse betik çalışmadan önce uyarı veriyor.
Belgelerdeki örneklere göre sıradan bir çalma listesi düşebilir bir kaynak: içinde yalnızca bozuk dosyalar olabilir ya da uzaktaki dosyalara her zaman ulaşılamayabilir. Dinleyici isteklerinin kuyruğu da öyle. Buna karşın diskteki geçerli tek bir ses dosyası düşmez sayılıyor.
Çözüm için iki yol anlatılıyor. Birincisi kaynağı, kesinti anında sessizlik yayınlayan bir sarmalayıcıya almak. Belgeler radyo için sessizliğin iyi bir çözüm olmadığını da ekliyor ve ikinci yolu öneriyor: bir "yedek" (fallback) zinciri kurup ana kaynak düştüğünde her zaman çalabilecek bir "güvenlik" dosyasına geçmek. Radyo dilinde bunun karşılığı ölü hava, yani yayının sessiz kalması, yaşanmasın diye önceden hazırlanmış bir kayıt.
Basit bir radyonun tarifi
Belgelerdeki başlangıç örneği, bir radyonun mantığını adım adım kuruyor. Kodu burada tekrarlamak yerine akışı anlatmak daha öğretici:
- Müzik dosyalarını içeren bir çalma listesi kaynak olarak tanımlanıyor.
- Ayrı bir çalma listesine istasyonun tanıtım sesleri (jingle) konuyor.
- İki liste, ağırlık verilerek rastgele karıştırılıyor. Örnekte jingle listesine 1, müziğe 4 ağırlık veriliyor; belgeler bunu "kabaca her dört şarkıda bir jingle" diye açıklıyor. Burada dikkat: rastgele bir karışım olduğu için bu kesin bir sıra değil, ortalama bir oran.
- Her şey ters giderse çalınacak tek bir güvenlik dosyası yedek olarak ekleniyor.
- Son olarak ortaya çıkan yayın Ogg Vorbis biçiminde kodlanıp Icecast sunucusuna gönderiliyor.
Liquidsoap basit işler için tek satırlık komutlarla da çalışabiliyor, ama belgeler karmaşıklaştıkça betiğin .liq uzantılı bir dosyaya yazılmasını öneriyor.
Geçişler: crossfade ve jingle
Bir şarkının sonu alçalırken diğerinin başının yükselmesine crossfade, Türkçede çapraz geçiş deniyor. Liquidsoap'un özellik listesinde "keyfî geçişler: çapraz geçiş, jingle ekleme, özel geçişler" açıkça yer alıyor ve geçişin davranışının üst veriye ve ortalama ses düzeyine göre programlanabildiği belirtiliyor.
Belgelerin crossfade sayfası, projenin bu konudaki deneyimini de itiraf ediyor: yıllar içinde çapraz geçişin "çok hassas bir konu" olduğunu ve insanların ayrıntıları çok önemsediğini fark etmişler. Kutudan çıkan hazır bir crossfade işlemi var. Ayrıca 2.2.5 sürümünden bu yana kullanıcıların katkısıyla geliştirilen, geçiş noktalarını otomatik hesaplayan bir mekanizma bulunuyor; bunun için FFmpeg bağlantılarının etkin olması gerekiyor.
Daha titiz olanlar kendi geçiş kuralını yazabiliyor. Belgelerdeki örnek mantık şöyle işliyor: biten ve başlayan parçanın desibel cinsinden ortalama ses düzeyi ölçülüyor. İkisi de çok yüksek değilse ve birbirine yakınsa tam çapraz geçiş yapılıyor; yeni parça belirgin biçimde daha yüksekse yalnızca eskisi kısılıyor; ikisi de üst üste binemeyecek kadar gürse geçiş uygulanmadan biri bitince diğeri başlıyor. Örnek kodun içindeki bir yorum da dürüst: gür bir bitişle sessiz bir başlangıcı ayırmak için jingle kullanmak iyi fikir, "ama bu başka bir hikâye".
Canlı DJ girişi: harbor
Otomatik yayının en kritik anı, canlı bir DJ'in bağlandığı an. Liquidsoap bu iş için "harbor" (liman) adını verdiği bir giriş kullanıyor. Belgelere göre Liquidsoap bu girişle bir ağ portu açıyor ve Icecast ya da SHOUTcast (ICY) kaynak protokolüyle gelecek bir bağlantıyı bekliyor. DJ, BUTT ya da Mixxx gibi yayın programını bu porta yönlendiriyor; bağlantı kurulup ses gelmeye başladığında bu giriş, betikteki diğer kaynaklar gibi kullanılabilir hale geliyor.
Harbor girişi doğası gereği düşebilir bir kaynak: DJ bağlıyken var, değilken yok. İşin inceliği tam da burada. Belgelere göre canlı giriş ile müzik listesi bir yedek zincirine canlı giriş önde olacak şekilde konduğunda ek ayar gerekmeden doğru davranış elde ediliyor: DJ şarkının ortasında yayına giriyor, çalan şarkı alttan kısılarak çıkıyor, DJ bağlantıyı kestiğinde ise müzik yeni bir parçayla baştan başlıyor.
Belgelerde birkaç teknik ayrıntı daha var. Harbor girişinin varsayılan portu 8005; ICY protokolü etkinleştirildiğinde SHOUTcast istemcilerinin bir sonraki porta bağlanması gerekiyor. Bağlantılar varsayılan olarak sabit bir kullanıcı adı ve şifreyle doğrulanıyor, ama istenirse harici bir programa danışan özel bir doğrulama işlevi yazılabiliyor. AzuraCast'teki her DJ'in ayrı hesapla bağlanabilmesi bu tür bir esnekliğin ürünü.
Liquidsoap ne değildir
Proje kendi sınırlarını da açıkça yazıyor. Belgelere göre Liquidsoap "ses ve video akışlarını işlemek için esnek bir araç, o kadar". Güzel bir grafik arayüzü yok; betik elle yazılıyor, çalışan bir Liquidsoap ile etkileşim telnet sunucusu ya da UNIX soketi üzerinden kuruluyor. Dinleyici sayfası, istek formu, istatistik ekranı gibi bir radyonun ihtiyaç duyduğu diğer parçalar Liquidsoap'un işi değil. AzuraCast gibi paketlerin var olma nedeni de bu boşluk.
Liquidsoap'u öğrenmenin en zor yanı, bir radyonun davranışını "ne zaman ne çalsın" sorusundan "hangi kaynak düşerse ne olsun" sorusuna çevirmek. Bu soruyu baştan doğru soran bir betik gecenin üçünde de susmuyor.
İnternet radyosu serisinin diğer yazıları
- AzuraCast nedir? Açık kaynak internet radyosu paketi nasıl çalışır
- 128 kbps ne demek? İnternet radyosunda bit hızı, bant genişliği ve codec farkı
- Radyoda "şu an çalıyor" bilgisi nereden gelir? ICY, ID3 etiketi ve bozuk başlıklar
- SAM Broadcaster, RadioDJ, mAirList, BUTT ve Mixxx: Hangi Yayın Yazılımı Ne İşe Yarar?
- İnternet Radyosunda Canlı Yayına Nasıl Girilir? Sunucu, Port, Mount ve Codec Rehberi
- İnternet Radyosu İçin Ekipman Rehberi: Mikrofon, Ses Kartı, Kulaklık ve Ses Seviyesi
- İnternet Radyosunda Telif ve Lisans: Hangi Haklar Var, Hangi Birlik Neyi Temsil Ediyor?
- İnternet radyosunun doğuşu: 1993'teki haftalık sohbetten RealAudio'nun canlı yayınına
- SHOUTcast'in hikâyesi: Winamp'ın yanında doğan yayın sunucusu Nullsoft'tan Azerion'a
- Icecast: Bir üniversite radyosu için yazılan açık kaynak sunucunun çeyrek asrı aşan hikâyesi
- FM'den internete radyo: RDS, DAB+ ve akışlı yayın arasındaki farklar, Türkiye'deki durum
Fotoğraf: Infrogmation of New Orleans, CC BY-SA 4.0, Wikimedia Commons