Ses Eşitleme & Re-encode Rehberi

Production sunucu için adım adım talimatlar (~30.000 şarkı)

Herkes İçin Özet

Bazı şarkılar çok yüksek, bazıları çok kısık çalıyordu. Bu güncelleme ile:

  • Tüm şarkılar aynı ses seviyesinde çalacak (geçişlerde ses patlaması veya düşmesi yok)
  • Peak koruması — en yüksek anlarda bile ses bozulması (clipping) olmayacak
  • Hışırtı/cızırtı düzeltmesi — eski filtreler kaldırıldı, temiz ses
  • Orijinal MP3 dosyalarına kesinlikle dokunulmuyor

Ne Değişti? (Audio Filters v3)

ESKİ (v2) — Sorunlu
  • Tek geçişli loudnorm (pumping artifact)
  • EQ bass boost (gereksiz renklendirme)
  • Şarkılar arası ~6 dB fark
  • 17 şarkıda clipping (peak 0.0 dB)
YENİ (v3) — Temiz
  • İki geçişli loudnorm (hassas ölçüm)
  • EQ yok (doğal ses)
  • Şarkılar arası ~1 dB fark
  • alimiter ile peak koruması

Filtre Zinciri (Teknik)

PASS 1 — Ölçüm (encode yok, sadece analiz)
ffmpeg -i {input} -af "loudnorm=I=-16:TP=-1.5:LRA=14:print_format=json" -f null -

Çıktı: input_i, input_tp, input_lra, input_thresh değerleri (JSON)

PASS 2 — Hassas Normalizasyon + Limiter
loudnorm=I=-16:TP=-1.5:LRA=14:measured_I={i}:measured_TP={tp}:measured_LRA={lra}:measured_thresh={thresh}:linear=false,alimiter=limit=0.95:attack=5:release=50

loudnorm: Tüm şarkıları -16 LUFS'e normalize eder (iki geçişli = artifact yok)

alimiter: Peak'leri 0.95 (-0.45 dB) ile sınırlar → clipping imkansız

linear=false: Dinamik normalizasyon (yüksek sesliyi bastırır, düşük sesliyi yükseltir)

Her Şarkı İçin Üretilen Dosyalar

storage/tenant{id}/app/public/muzibu/hls/{song_id}/
├── enc.bin              ← 16 byte AES-128 key (dokunulmaz)
├── enc.keyinfo          ← Key URI + path + IV (dokunulmaz)
├── master.m3u8          ← 4 varyant referansı
├── playlist.m3u8        ← high kalite (orijinal bitrate, 4sn, VOD)
├── segment-*.ts         ← high segment'ler
├── ultralow/playlist.m3u8  ← 32kbps, mono, 22050Hz
├── low/playlist.m3u8       ← 64kbps, mono, 22050Hz
└── mid/playlist.m3u8       ← 128kbps, stereo, 44100Hz

storage/tenant{id}/app/public/muzibu/songs/
├── song_xxxxx.mp3       ← Orijinal (DOKUNULMAZ)
├── mp3_64/{song_id}.mp3 ← 64kbps MP3 fallback
└── mp3_128/{song_id}.mp3← 128kbps MP3 fallback

Production Re-encode Adımları (~30K Şarkı)

1
Kodu Deploy Et
cd /var/www/vhosts/muzibu.com/httpdocs
git pull origin main

Güncellenen dosyalar: ConvertToHLSJob.php, AddHlsVariantsCommand.php, HLSService.php

2
Eski Variant'ları Sil (Yenileri Oluşacak)
HLSDIR="storage/tenant1001/app/public/muzibu/hls"
MP3DIR="storage/tenant1001/app/public/muzibu/songs/mp3_128"
MP3DIR64="storage/tenant1001/app/public/muzibu/songs/mp3_64"

# Variant klasörlerini sil
find $HLSDIR -maxdepth 2 -type d -name ultralow -exec rm -rf {} +
find $HLSDIR -maxdepth 2 -type d -name low -exec rm -rf {} +
find $HLSDIR -maxdepth 2 -type d -name mid -exec rm -rf {} +

# MP3 fallback'leri sil
rm -rf "$MP3DIR" "$MP3DIR64"

⚠️ Orijinal MP3 ve high HLS'e dokunmaz. Sadece türetilmiş çıktılar silinir.

3
Küçük Test Batch'i (10 şarkı)
php artisan tenants:run hls:add-variants --tenants=1001 \
  --option="quality=all" --option="mp3-128=1" --option="mp3-64=1" \
  --option="refresh-master=1" --option="re-encode-high=1" \
  --option="limit=10"

Önce 10 şarkıyla test et. Sorun yoksa devam.

4
Tam Re-encode (Paralel Terminal'ler)

~30K şarkı uzun sürer. 3 paralel terminal ile ~7 saat:

# Terminal 1: İlk 10.000
php artisan tenants:run hls:add-variants --tenants=1001 \
  --option="quality=all" --option="mp3-128=1" --option="mp3-64=1" \
  --option="refresh-master=1" --option="re-encode-high=1" \
  --option="limit=10000" --option="offset=0"

# Terminal 2: 10.001-20.000
php artisan tenants:run hls:add-variants --tenants=1001 \
  --option="quality=all" --option="mp3-128=1" --option="mp3-64=1" \
  --option="refresh-master=1" --option="re-encode-high=1" \
  --option="limit=10000" --option="offset=10000"

# Terminal 3: 20.001-30.000
php artisan tenants:run hls:add-variants --tenants=1001 \
  --option="quality=all" --option="mp3-128=1" --option="mp3-64=1" \
  --option="refresh-master=1" --option="re-encode-high=1" \
  --option="limit=10000" --option="offset=20000"
5
Doğrulama
# Toplam sayıları kontrol et
HLSDIR="storage/tenant1001/app/public/muzibu/hls"
echo "HLS klasör: $(ls -d $HLSDIR/*/ | wc -l)"
echo "ultralow: $(find $HLSDIR -maxdepth 2 -name ultralow -type d | wc -l)"
echo "low: $(find $HLSDIR -maxdepth 2 -name low -type d | wc -l)"
echo "mid: $(find $HLSDIR -maxdepth 2 -name mid -type d | wc -l)"
echo "master: $(find $HLSDIR -name master.m3u8 | wc -l)"
echo "mp3_128: $(ls songs/mp3_128/*.mp3 | wc -l)"
echo "mp3_64: $(ls songs/mp3_64/*.mp3 | wc -l)"

# Rastgele şarkı volume testi
shuf -n 5 -e $HLSDIR/*/playlist.m3u8 | while read f; do
  dir=$(dirname "$f")
  id=$(basename "$dir")
  echo "Song $id:"
  ffmpeg -hide_banner -i "$f" -af volumedetect -f null /dev/null 2>&1 | grep mean_volume
done
6
Cache Temizle
php artisan cache:clear
php artisan view:clear
php artisan responsecache:clear

Tahmini Süreler

İşlem Şarkı Başına 30K Şarkı (1 terminal) 30K Şarkı (3 paralel)
Pass 1 (ölçüm) ~3 sn ~25 saat ~8.5 saat
Pass 2 (high encode) ~7 sn
3 variant (ultralow+low+mid) ~12 sn
MP3 128k ~3 sn
TOPLAM ~25 sn ~21 saat ~7 saat

Rollback Planı

Sorun çıkarsa eski koda dönmek yeterli:

git checkout HEAD~1 -- Modules/Muzibu/App/Jobs/ConvertToHLSJob.php
git checkout HEAD~1 -- Modules/Muzibu/App/Console/Commands/AddHlsVariantsCommand.php
git checkout HEAD~1 -- app/Services/Muzibu/HLSService.php

Zaten encode edilmiş dosyalar çalışmaya devam eder. Sadece yeni encode'lar eski filtre ile yapılır.

Güncellenen Dosyalar

Modules/Muzibu/App/Jobs/ConvertToHLSJob.php — Yeni şarkı yüklendiğinde

Modules/Muzibu/App/Console/Commands/AddHlsVariantsCommand.php — Batch re-encode

app/Services/Muzibu/HLSService.php — Variant + MP3 üretimi

24 Şubat 2026 • Muzibu.com.tr