HLS 4 Saniye Production

HLS 4-Saniye Standardizasyon

Production Deployment Rehberi

📝 Basit Anlatım (Herkes İçin)

Muzibu'daki şarkılar dinlenirken küçük parçalar halinde (segment) yükleniyor. Önceden bu parçalar 6 saniyeydi, şimdi tüm kalite seviyelerinde 4 saniye olarak standardize edildi.

Önceki Durum

  • High kalite: 6 saniye segment
  • Diğer kaliteler: 4 saniye segment
  • Tutarsız FFmpeg parametreleri
  • Eski ölü kodlar mevcut

Şimdiki Durum

  • Tüm kaliteler: 4 saniye segment
  • Standart FFmpeg parametreleri
  • Ölü kodlar temizlendi
  • Production'a hazır

Neden Önemli? 4 saniye segment, Apple HLS standardına uygun ve tüm varyantlar arasında tutarlılık sağlıyor. Bu sayede adaptive bitrate (otomatik kalite geçişi) daha yumuşak çalışıyor.

🔧 Teknik Detaylar (Geliştiriciler İçin)

Yapılan Kod Değişiklikleri

# Dosya Değişiklik
1 ConvertToHLSJob.php FFmpeg'e -profile:a aac_low -ar 48000 -ac 2 eklendi
2a HLSService.php:125 $targetBitrate undefined bug fix
2b HLSService.php:158 buildFFmpegCommand() internal helper olarak işaretlendi
2c HLSService.php:469 Yorum düzeltmesi: enc.key → enc.bin
3 AddHlsVariantsCommand.php --re-encode-high flag'i eklendi
4 ConvertSongToHLS.php Silindi (ölü kod — 10sn segment, encryption yok)
5 routes/web.php:161 /stream/key/ eski route kaldırıldı
6 hls-streaming.blade.php Dokümantasyon güncellendi (dosya yapısı, URL formatları)

FFmpeg Standart Parametreler

High (Orijinal Kalite)

-map 0:a -c:a aac -b:a {orijinal}k
-profile:a aac_low -ar 48000 -ac 2
-af {Ultimate Edition filters}
-hls_time 4 -hls_list_size 0
-hls_playlist_type vod
-hls_key_info_file {enc.keyinfo}

Mid (128kbps)

-c:a aac -b:a 128k
-profile:a aac_low -ar 44100 -ac 2 -vn
-hls_time 4 -hls_list_size 0
-hls_playlist_type vod
-hls_key_info_file {enc.keyinfo}

Low (64kbps)

-c:a aac -b:a 64k
-profile:a aac_low -ar 22050 -ac 1 -vn
-hls_time 4 -hls_list_size 0
-hls_playlist_type vod
-hls_key_info_file {enc.keyinfo}

Ultralow (32kbps)

-c:a aac -b:a 32k
-profile:a aac_low -ar 22050 -ac 1 -vn
-hls_time 4 -hls_list_size 0
-hls_playlist_type vod
-hls_key_info_file {enc.keyinfo}

Her Şarkı Dosya Yapısı

storage/tenant{id}/app/public/muzibu/hls/{song_id}/
├── enc.bin              ← 16 byte AES-128 key (binary)
├── enc.keyinfo          ← 3 satır: URI + path + IV
├── master.m3u8          ← 4 varyant referansı
├── playlist.m3u8        ← high kalite (4sn, VOD, encrypted)
├── segment-*.ts         ← high segment'ler
├── ultralow/
│   ├── enc.keyinfo      ← aynı key, farklı IV, ?v=ultralow
│   ├── playlist.m3u8    ← 32kbps, mono, 22050Hz, 4sn, VOD
│   └── segment-*.ts
├── low/
│   ├── enc.keyinfo
│   ├── playlist.m3u8    ← 64kbps, mono, 22050Hz, 4sn, VOD
│   └── segment-*.ts
└── mid/
    ├── enc.keyinfo
    ├── playlist.m3u8    ← 128kbps, stereo, 44100Hz, 4sn, VOD
    └── segment-*.ts

storage/tenant{id}/app/public/muzibu/songs/mp3_128/
└── {song_id}.mp3        ← 128kbps MP3 fallback

🚀 Production Deployment Rehberi (~30K Şarkı)

ADIM 1

Kod Değişikliklerini Deploy Et

cd /var/www/vhosts/muzibu.com/httpdocs
git pull origin main

# Cache temizle
php artisan cache:clear
php artisan route:clear
php artisan config:clear
php artisan view:clear
composer dump-autoload
ADIM 2

Küçük Batch Test (10 Şarkı)

# Önce 10 şarkıyla test et
php artisan tenants:run hls:add-variants --tenants=1001 \
    --option="quality=all" \
    --option="mp3-128=1" \
    --option="refresh-master=1" \
    --option="re-encode-high=1" \
    --option="limit=10"

Sonucu kontrol et: segment süreleri 4sn mi? Tüm varyantlar oluştu mu?

ADIM 3

Tam Re-encode (Paralel Batch'ler)

3 terminal açarak paralel çalıştır. Her terminal farklı offset ile başlasın:

# Terminal 1: İlk 10.000 şarkı
php artisan tenants:run hls:add-variants --tenants=1001 \
    --option="quality=all" --option="mp3-128=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="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="refresh-master=1" --option="re-encode-high=1" \
    --option="limit=10000" --option="offset=20000"

Tahmini Süre: ~30K şarkı x 4 varyant x ~6sn = ~20 saat (3 paralel = ~7 saat)

ADIM 4

Doğrulama

# Rastgele 10 şarkı kontrol
for id in $(shuf -i 1-30000 -n 10); do
    DIR="storage/tenant1001/app/public/muzibu/hls/$id"
    if [ -d "$DIR" ]; then
        echo "=== Song #$id ==="
        # 4 varyant kontrolü
        for v in playlist ultralow/playlist low/playlist mid/playlist; do
            [ -f "$DIR/$v.m3u8" ] && echo "  OK: $v.m3u8" || echo "  EKSIK: $v.m3u8"
        done
        # Segment süresi kontrolü
        grep '#EXTINF' "$DIR/playlist.m3u8" | head -3
        # master.m3u8 kontrolü
        cat "$DIR/master.m3u8" 2>/dev/null | head -5
    fi
done
ADIM 5

Cache Temizliği

php artisan cache:clear
php artisan view:clear
php artisan responsecache:clear

Rollback Planı

Re-encode işlemi mevcut dosyaların üzerine yazar. Geri almak için:

  1. Git ile kod değişikliklerini geri al: git checkout -- .
  2. Re-encode öncesi backup alınmışsa segment'leri geri koy
  3. Segment'ler kaybolmuşsa, komutu --re-encode-high olmadan tekrar çalıştır (sadece variant)
  4. Orijinal MP3'ler her zaman mevcut — yeniden HLS dönüşümü yapılabilir

Test Sunucusu Sonuçları (mztest.muzibu.com)

Varyant Dosya Segment Durum
high (orijinal) 66/66 4 sn ✅ Re-encoded
ultralow (32k) 66/66 4 sn
low (64k) 66/66 4 sn
mid (128k) 66/66 4 sn
MP3 128k 66/66
master.m3u8 66/66 ✅ 4 varyant
enc.keyinfo URI 264/264 ✅ /hls-key/
VOD tipi 264/264

🗑️ Temizlenen Ölü Kodlar

Dosya İşlem Neden
ConvertSongToHLS.php Silindi 10sn segment, encryption yok, dispatch yok — ConvertToHLSJob ile değiştirilmişti
routes/web.php:161 Route kaldırıldı /stream/key/ eski format — /hls-key/ ile değiştirilmişti
hls-streaming.blade.php Güncellendi enc.key→enc.bin, /stream/key/→/hls-key/, dosya yapısı, v7+ özellikleri

⚙️ Artisan Command Referansı

php artisan tenants:run hls:add-variants --tenants=1001

Seçenekler:
  --option="quality=all"        Tüm varyantlar (ultralow + low + mid)
  --option="quality=low"        Sadece low varyant
  --option="mp3-128=1"          128kbps MP3 de üret
  --option="refresh-master=1"   master.m3u8'i yeniden oluştur
  --option="re-encode-high=1"   High playlist'i 4sn segment ile yeniden oluştur
  --option="song=123"           Belirli bir şarkı ID
  --option="limit=100"          Maksimum işlenecek şarkı
  --option="offset=0"           Atlanacak şarkı (paralel batch için)
  --option="dry-run=1"          Sadece sayıları göster, işlem yapma
22 Şubat 2026 • Muzibu.com.tr