Radyoda "şu an çalıyor" bilgisi nereden gelir? ICY, ID3 etiketi ve bozuk başlıklar
İnternet radyosunda şarkı adı, ses verisinin arasına belirli bayt aralıklarıyla eklenen metinle gelir. ICY metadata, icy-metaint, ID3 etiketleri ve bozuk Türkçe karakterin nedenini anlattık.
Telefonunuzda bir internet radyosu açıyorsunuz ve ekranda çalan şarkının adı beliriyor. Şarkı değişince yazı da değişiyor. Bu bilgi ses dosyasının içinden sihirli bir biçimde okunmuyor; ses verisinin arasına belli aralıklarla sıkıştırılmış küçük metin paketleriyle geliyor. Bazen de hiç gelmiyor, yanlış geliyor ya da "ü" gibi anlamsız karakterlerle geliyor.
Bu yazı, "şu an çalıyor" bilgisinin yolculuğunu baştan sona izliyor: şarkı dosyasının içindeki etiketten yayın yazılımına, oradan sunucuya ve dinleyicinin oynatıcısına. Bu zincirin neden önemli olduğu basit: dinleyici için şarkıyı tanımanın, radyo için de istek sistemlerinin ve çalma geçmişinin tek dayanağı bu metin.
-
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 →
Başlangıç noktası: dosyanın içindeki etiket
Her şey şarkı dosyasının kendisinde başlıyor. ID3 standardını belgeleyen id3.org sitesine göre MPEG ses biçiminin, MP3 dahil, içeriği tanımlayacak yerleşik bir yolu yoktu; "telif hakkı var mı" gibi birkaç evet/hayır işaretinden başkasını saklayamıyordu. Çözüm 1996'da Eric Kemp'in (NamkraD) "Studio3" programıyla geldi: dosyanın sonuna küçük bir veri parçası eklendi. İlk sürüm olan ID3v1 kolay bulunabilsin diye sabit 128 bayt boyutundaydı ve "TAG" harfleriyle başlıyordu.
ID3v1'in alanları katıydı: şarkı adı için 30 bayt, sanatçı için 30 bayt, albüm için 30 bayt, yıl için 4 bayt. Uzun bir şarkı adı basitçe kesiliyordu. Daha sonra gelen ID3v2 bu sınırları kaldırdı. id3.org'daki ID3v2.3.0 belgesine göre etiket artık dosyanın başında duruyor ve "çerçeve" denen bölmelerden oluşuyor. Şarkı adı TIT2, ana sanatçı TPE1, albüm TALB çerçevesinde tutuluyor. Radyocuları ilgilendiren iki çerçeve daha var: internet radyosu istasyonunun adı ve sahibi için TRSN ve TRSO.
Türkçe açısından kritik ayrıntı karakter kodlaması. ID3v2.3 belgesine göre metinler ya ISO-8859-1 ya da bayt sırası işaretiyle başlayan 16 bitlik Unicode olarak yazılıyor. ISO-8859-1, Batı Avrupa dilleri için tasarlanmış bir karakter tablosu ve içinde ğ, ş, ı, İ gibi Türkçe harfler yok. "Tuğba" adlı bir sanatçının adı bu tabloyla yazılmaya çalışıldığında harf ya kayboluyor ya da başka bir işarete dönüşüyor.
ICY: ses akışının arasına sıkıştırılan metin
MP3 ya da AAC dosyası tek başına dinlenirken etiket okunabilir. Ama radyo yayını bitmeyen bir akış; oynatıcı dosyanın başına ya da sonuna hiç ulaşmıyor. Üstelik yayın yazılımı şarkıları çözüp yeniden kodladığı için orijinal etiket yayına zaten taşınmıyor. Başlığın ayrıca iletilmesi gerekiyor.
Bunun için kullanılan mekanizmanın adı ICY. Liquidsoap belgeleri ICY metadata'yı Icecast kaynak akışlarında üst veriyi güncellemek için kullanılan mekanizma olarak tanımlıyor ve bunun esasen MP3 ya da AAC gibi akış içinde üst veri taşımayı desteklemeyen biçimler için tasarlandığını belirtiyor.
ICY'nin iki yüzü var:
- Yayıncıdan sunucuya: Liquidsoap belgelerine göre yeni başlık, sesin içinden değil, ayrı bir HTTP isteğiyle sunucuya bildiriliyor. Icecast'in yönetim arayüzü belgesi de bir kaynak istemcisinin ya da herhangi bir harici programın bir bağlantı noktasının şarkı bilgisini bu yolla güncelleyebildiğini anlatıyor.
- Sunucudan dinleyiciye: Sunucu başlığı ses verisinin arasına belirli aralıklarla yerleştiriyor.
icy-metaint: her kaç baytta bir
İkinci yüz için oynatıcının sunucuya "ben şarkı bilgisini okuyabilirim" demesi gerekiyor. Bunu bağlantı isteğine Icy-MetaData: 1 başlığını ekleyerek yapıyor. Sunucu da yanıtında icy-metaint başlığıyla bir sayı gönderiyor. Icecast yapılandırma belgesi bu aralığı "SHOUTcast uyumlu akışlarda üst veri güncellemeleri arasındaki bayt cinsinden aralık" olarak tanımlıyor.
Bu yazı için bu mekanizmayı canlı bir Icecast yayınında kendimiz denedik. Sunucu icy-metaint: 16000 yanıtı verdi. Akışın ilk 16.000 baytı saf ses verisiydi; hemen ardından gelen tek bayt 3 değerini taşıyordu. Bu bayt, arkadan gelecek metnin uzunluğunu 16'nın katı olarak söylüyor: 3 × 16 = 48 bayt. O 48 baytın içinde StreamTitle='Sanatçı - Şarkı'; biçiminde başlık, geri kalanında boş doldurma baytları vardı. Sonra yeniden 16.000 bayt ses geliyor ve döngü sürüyor.
Bu yapının iki pratik sonucu var. Birincisi, ICY'yi anlamayan bir oynatıcı Icy-MetaData başlığını göndermiyor ve sunucu ona araya metin karıştırmadan saf ses yolluyor; yoksa metin baytları ses sanılıp kısa cızırtılara yol açardı. İkincisi, şarkı adının ekranda güncellenmesi biraz gecikebiliyor, çünkü yeni başlık ancak bir sonraki aralıkta akışa girebiliyor.
Bir sınırı da dürüstçe yazmak gerekiyor: ICY, IETF gibi bir standart kuruluşunun yayımladığı resmî bir belgeye sahip değil. SHOUTcast'ten miras kalan ve Icecast, Liquidsoap gibi yazılımların uyguladığı fiilî bir standart. Yukarıdaki bayt yapısı bu yüzden resmî bir şartnameden değil, uygulamaların davranışından ve bizim ölçümümüzden aktarılıyor.
Ogg yayınlarında durum farklı
Ogg kapsayıcısı üst veriyi akışın kendi içinde taşıyabildiği için ICY'ye ihtiyaç duymuyor. Liquidsoap belgelerine göre ICY güncellemeleri MP3, AAC, AAC+ ve WAV için varsayılan olarak açık, Ogg kapsayıcısı kullanan biçimler için kapalı. Ancak bunun bir yan etkisi var: AzuraCast belgeleri Ogg Opus ve Ogg FLAC yayınlarının Icecast'e "şu an çalan şarkı", sanatçı ve başlık bilgisini göndermediğini belirtiyor. Yani kullanılan codec doğrudan ekrandaki şarkı adını etkileyebiliyor.
Boş ya da yanlış etiket nelere yol açıyor
Zincirin her halkası bir önceki halkadan gelen veriye güveniyor. Etiket kötüyse hiçbir yazılım onu kendiliğinden düzeltmiyor. En sık görülen sorunlar şunlar:
- Sanatçı alanı boş: Liquidsoap belgelerine göre yayına giden "song" bilgisi varsayılan olarak "sanatçı - başlık" biçiminde birleştiriliyor; iki alandan yalnızca biri doluysa sadece o gönderiliyor. Sanatçı alanı boş bir dosyada dinleyici yalnızca şarkı adını görüyor. Aynı adı taşıyan farklı şarkılar birbirinden ayırt edilemiyor, istek sistemlerinde arama zorlaşıyor.
- Yanlış alana yazılmış bilgi: "Sanatçı - Şarkı" metninin tamamı başlık alanına yazılmışsa ve sanatçı ayrıca doluysa ekranda sanatçı adı iki kez görünüyor. Sanatçı ve başlık yer değiştirmişse istatistikler ve çalma geçmişi yanlış kişiye yazılıyor.
- Bozuk Türkçe karakterler: Icecast yapılandırma belgesi bu sorunu açıkça anlatıyor: MP3 gibi Ogg dışı akışlarda üst verinin karakter kümesi çoğu zaman tanımlı değil. Icecast geçmişte UTF-8 varsaymış, ama pek çok MP3 kaynak istemcisi Latin-1 (ISO 8859-1) ya da kendi sisteminin kodlamasını kullanmış. Belgeye göre Icecast bu uyumsuzluk yüzünden artık Ogg dışı akışlar için Latin-1 varsayıyor; farklı bir kodlama için bağlantı noktası ayarında ya da güncelleme isteğinde karakter kümesi belirtilebiliyor. Kaynak UTF-8 gönderip sunucu Latin-1 sanarsa "ş" harfi iki anlamsız işarete dönüşüyor.
- Hiç etiket yok: Bazı yayın yazılımları bu durumda dosya adını başlık olarak kullanıyor. "parca_final_v2" gibi bir dosya adı dinleyicinin ekranına aynen düşebiliyor.
Şarkı adının ikinci yolu: API
Modern radyo paketleri ICY'ye tek başına güvenmiyor. AzuraCast belgelerine göre sistem, çalan şarkıyı, başladığı zamanı, şarkının listeden mi istekten mi canlı yayından mı geldiğini ve son çalınanları ayrı bir "şu an çalıyor" API'si üzerinden sunuyor; bu veri yayın Icecast'ten de SHOUTcast'ten de yapılsa aynı biçimde geliyor. Sitelere gömülen oynatıcılar ve mobil uygulamalar çoğu zaman şarkı adını bu yoldan alıyor. Ama API de sonuçta aynı dosya etiketlerini okuyor; kaynaktaki hata burada da aynen görünüyor.
Bu yüzden bir radyonun "şu an çalıyor" satırının kalitesi, sunucu yazılımından çok arşivin ne kadar düzenli etiketlendiğine bağlı. Açık soru şu: binlerce şarkılık, yıllar içinde farklı kaynaklardan toplanmış bir arşivi, sanatçı alanı boş dosyaları tahminle doldurmadan nasıl temizlersiniz? Bu işin henüz otomatik ve kusursuz bir çözümü yok.
İnternet radyosu serisinin diğer yazıları
- AzuraCast nedir? Açık kaynak internet radyosu paketi nasıl çalışır
- Liquidsoap nedir? İnternet radyosunda otomatik yayını yöneten betik dili
- 128 kbps ne demek? İnternet radyosunda bit hızı, bant genişliği ve codec farkı
- 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: By Danny ChooDanny Choo, CC BY-SA 2.0, Wikimedia Commons