🎵

Muzibu Şarkı İşleme Workflow Analizi

Fade-In/Fade-Out + HLS Conversion Pipeline

FFmpeg HLS Streaming Audio Processing Queue System

📝 Basit Anlatım (Herkes İçin)

Ne Yapıyoruz?
Muzibu'ya yüklenen şarkıların başlangıcında ve sonunda ses yumuşak bir şekilde açılıp kapanacak. Profesyonel müzik platformlarında olduğu gibi şarkı aniden başlamayacak, yavaşça fade-in (ses açılma) yapacak. Şarkı bitişinde de aniden kesilmeyecek, fade-out (ses kapanma) ile yumuşak bitecek.

Nasıl Çalışacak?
Kullanıcı şarkı yüklediğinde sistem 3 adımda işlem yapacak:

  1. Orijinal dosya korunacak: Artist'in yüklediği ham MP3 dosyası arşivde saklanacak
  2. Efektli kopya oluşturulacak: Başına ve sonuna fade efekti eklenmiş geçici bir kopya oluşturulacak
  3. Streaming'e hazırlanacak: Efektli kopya HLS formatına (internet üzerinden akış için) dönüştürülecek

Neden Önemli?
✅ Profesyonel dinleme deneyimi (Spotify, Apple Music gibi)
✅ Orijinal dosyalar korunuyor (arşiv güvencesi)
✅ Gerekirse efekt ayarları değiştirilebilir (orijinal durduğu için)
✅ Disk alanı tasarrufu (geçici dosyalar temizleniyor)

Kullanıcı Fark Eder Mi?
Hayır! Upload süresi sadece birkaç saniye uzar. İşlem arka planda queue sistemi ile yapılır, kullanıcı beklemez. Şarkı dinlenirken ise zaten işlenmiş HLS versiyonu çalınır.

🔧 Teknik Detaylar (Geliştiriciler İçin)

📁 İlgili Dosyalar

  • Modules/Muzibu/app/Services/SongUploadService.php (yeni oluşturulacak)
  • Modules/Muzibu/app/Jobs/ProcessSongWithFadeJob.php (yeni oluşturulacak)
  • Modules/Muzibu/app/Jobs/ConvertToHLSJob.php (güncellenecek)
  • Modules/Muzibu/app/Http/Controllers/Admin/SongController.php (mevcut)

⚙️ Kullanılan Teknolojiler

FFmpeg

Audio processing için açık kaynak multimedia framework. Fade-in/fade-out efektleri ve HLS conversion işlemlerini yapar.

Laravel Queue

Arka plan işleme sistemi. Upload sonrası işlemler queue'da çalışır, kullanıcı beklemez.

HLS Protocol

HTTP Live Streaming. Şarkılar küçük segment'lere (.ts) bölünür, adaptive streaming sağlar.

Storage System

Tenant-aware storage. Her tenant'ın kendi storage klasörü (storage/tenant1001/app/public/songs/).

🗄️ Veritabanı Yapısı

Tenant Database: tenant_muzibu_1528d0

Tablo: songs

Yeni Field'ler (eklenmeli):

  • original_file - Orijinal MP3 path (arşiv)
  • hls_path - HLS .m3u8 playlist path
  • fade_duration - Fade süresi (saniye, default: 3)
  • processing_status - pending/processing/completed/failed

🔄 İşlem Akışı (Step-by-Step)

1

Upload & Validation

Kullanıcı admin panelden şarkı yükler. Dosya tipi, boyut, format kontrolleri yapılır.

İşlemler:

  • File type check (MP3, FLAC, WAV vb.)
  • File size validation (max: 50MB önerilen)
  • Duplicate check (aynı dosya var mı?)
  • Artist/album/genre metadata validation
SongController@store ~2-5 saniye
2

Orijinal Dosya Kaydet

Yüklenen dosya orijinal haliyle storage'a kaydedilir. Bu dosya arşiv amaçlıdır, asla silinmez.

Kayıt Konumu:

storage/tenant1001/app/public/songs/originals/song-{id}.mp3

Database Kaydı:

  • songs.original_file = "songs/originals/song-123.mp3"
  • songs.processing_status = "pending"
  • songs.fade_duration = 3 (default)
Storage::put() ~1-3 saniye
3

Queue Job: Fade-In/Fade-Out Ekle

Arka planda queue job tetiklenir. Orijinal dosyadan kopya oluşturulur, fade efekti eklenir.

FFmpeg Komutu (Örnek):

ffmpeg -i original.mp3 \ -af "afade=t=in:st=0:d=3,afade=t=out:st=[duration-3]:d=3" \ -c:a libmp3lame -b:a 320k \ processed.mp3

Parametreler:

  • afade=t=in:st=0:d=3 → Baştan 3 saniye fade-in
  • afade=t=out:st=[duration-3]:d=3 → Sondan 3 saniye fade-out
  • -b:a 320k → Kalite (320 kbps önerilen)

Geçici Dosya:

storage/tenant1001/temp/song-{id}-processed.mp3
ProcessSongWithFadeJob ~10-30 saniye (dosya boyutuna göre)
4

HLS Conversion

İşlenmiş (fade'li) MP3 dosyası HLS formatına dönüştürülür. Şarkı segment'lere (.ts) bölünür.

FFmpeg HLS Komutu (Örnek):

ffmpeg -i processed.mp3 \ -c:a aac -b:a 128k \ -f hls -hls_time 10 -hls_list_size 0 \ -hls_segment_filename "segment_%03d.ts" \ playlist.m3u8

Çıktı Dosyaları:

  • playlist.m3u8 → HLS playlist (stream URL'i bu olacak)
  • segment_000.ts, segment_001.ts... → Audio segment'leri

Kayıt Konumu:

storage/tenant1001/app/public/songs/hls/song-{id}/
ConvertToHLSJob ~15-45 saniye
5

Geçici Dosya Temizliği

HLS conversion tamamlandıktan sonra geçici işlenmiş MP3 dosyası silinir. Disk tasarrufu sağlanır.

Silinen Dosya:

storage/tenant1001/temp/song-{id}-processed.mp3

Kalıcı Dosyalar:

  • ✅ Orijinal MP3 (arşiv)
  • ✅ HLS klasörü (streaming için)
Storage::delete() ~1 saniye

İşlem Tamamlandı

Database güncellenir, şarkı stream'e hazır hale gelir.

Database Güncelleme:

  • songs.hls_path = "songs/hls/song-123/playlist.m3u8"
  • songs.processing_status = "completed"
  • songs.processed_at = current_timestamp

Stream URL (Frontend):

https://muzibu.com/storage/songs/hls/song-123/playlist.m3u8
Song::update() Şarkı dinlenebilir!

💾 Disk Kullanımı Analizi

📦

Orijinal MP3

~8 MB

Kalıcı arşiv

🎵

HLS Klasörü

~8 MB

Streaming dosyaları

🗑️

Geçici MP3

0 MB

Otomatik silindi

Örnek Hesaplama (1000 Şarkı İçin)

Orijinal dosyalar (arşiv) 1000 × 8 MB = 8 GB
HLS dosyaları (streaming) 1000 × 8 MB = 8 GB
Geçici dosyalar 0 MB (silindi)
TOPLAM 16 GB

💡 Not: Her şarkı için 2 kopya kalıyor (orijinal + HLS). Geçici işlenmiş dosyalar temizlendiği için %33 disk tasarrufu sağlanıyor.

⚖️ Avantajlar & Riskler

✅ Avantajlar

  • Profesyonel kullanıcı deneyimi: Spotify, Apple Music seviyesinde dinleme kalitesi
  • Arşiv güvencesi: Orijinal dosyalar korunur, her zaman geri dönülebilir
  • Esneklik: Fade süresi ayarlanabilir, toplu güncelleme yapılabilir
  • Disk tasarrufu: Geçici dosyalar temizlenir
  • Performans: HLS stream'den fade çalınır, runtime işlem yok
  • Artist kontrolü: Gerekirse fade kapatılabilir (song bazında)

⚠️ Dikkat Edilmesi Gerekenler

  • !
    FFmpeg bağımlılığı: Sunucuda FFmpeg kurulu olmalı ve güncel tutulmalı
  • !
    Queue sistemi: Redis/Horizon düzgün çalışmalı, aksi halde işlem takılır
  • !
    CPU kullanımı: Toplu upload'larda CPU spike olabilir, queue limit gerekli
  • !
    Disk alanı: Geçici işlem sırasında ek alan gerekir
  • !
    Hata yönetimi: FFmpeg hatalarında retry/fallback mekanizması şart
  • !
    Permission: Storage klasörlerinde doğru izinler olmalı (644/755)

💡 Uygulama Önerileri

1. Settings Panel Ekle

Admin panelde "Muzibu Settings" bölümüne fade ayarları ekle:

  • Fade aktif/pasif toggle
  • Fade-in süresi (1-10 saniye slider)
  • Fade-out süresi (1-10 saniye slider)
  • Fade tipi seçimi (linear/logarithmic)

2. Song Bazında Override

Song edit sayfasına özel kontroller:

  • Bu şarkıda fade uygulama (checkbox)
  • Custom fade süresi (bu şarkıya özel)
  • Re-process butonu (fade değişince yeniden işle)

3. Toplu İşleme (Batch)

Mevcut şarkıları toplu güncelleme:

  • Artisan command: php artisan muzibu:reprocess-songs
  • Gece saatlerinde queue ile tümünü işle
  • Progress bar ile takip

4. Monitoring & Logging

İşlem takibi için:

  • Processing status görüntüleme (admin song list)
  • Failed job'ları retry mekanizması
  • FFmpeg error logları (Laravel Log facade)
  • Queue performance metrics (Horizon dashboard)

5. Fallback Mekanizması

FFmpeg hatalarında:

  • 3 retry dene (Queue::retry)
  • Başarısız olursa fade'siz orijinali HLS'e dönüştür
  • Admin'e bildirim gönder (email/Slack)
  • Song status = "failed", hata mesajı kaydet