Çalma listesi önerisinde kütüphane taramasını geçiş süresine göre budamak
这篇内容暂时只有 Türkçe 版本,以下是原文。
Kütüphanemde 4.200 parça var, çoğu 128–320 kbps MP3 ve bir kısmı FLAC. Çalma listesi önerisi üreten küçük bir betiğim var; her çalıştırmada tüm kütüphaneyi tarayıp geçiş uygunluğunu hesaplıyordu. Son zamanlarda öneri üretimi 6–8 saniyeye çıktı, çünkü geçiş hesabı için her dosyanın ilk ve son birkaç saniyesini decode ediyordum. Sorun şu: kütüphanenin yarısı zaten geçiş için uygun değil, ama bunu ancak decode ettikten sonra anlıyordum.
Önce hangi parçaların geçiş hesabına hiç girmemesi gerektiğini ayırdım. Kriter basit: son 8 saniyesinde belirgin bir sessizlik ya da ani kesilme olan parçalar geçiş adayı olmasın. Bunu ffmpeg’in silencedetect filtresiyle dosya başına bir kez hesaplayıp yanına küçük bir metin dosyası yazıyorum:
for f in "$LIB"/*.mp3; do
out="${f%.mp3}.tail.txt"
[ -f "$out" ] && continue
ffmpeg -hide_banner -nostats -sseof -10 -i "$f" \
-af silencedetect=noise=-38dB:d=0.6 -f null - 2> "$out"
done
Sonra öneri betiği geçiş hesabına girmeden önce bu dosyaya bakıyor; silence_end satırı varsa parçayı “geçişsiz” havuzuna atıyor, decode etmiyor. 4.200 parçanın yaklaşık 900’ü bu havuzda kaldı. Öneri üretimi 7 saniyeden 2,5 saniyeye indi; asıl kazanç decode sayısının düşmesi, çünkü geçiş hesabı hâlâ pahalı.
Bunu neden böyle yaptım: geçiş uygunluğu parçanın tamamına değil, sadece sonuna bağlı. Tam decode etmek, son 8 saniyeyi öğrenmek için 4 dakikalık dosyayı açmak demek. -sseof -10 ile sondan 10 saniye okuyup bırakıyorum; bedeli, dosya başına bir kez ödenen yaklaşık 0,1 saniye. Metin dosyası da kütüphane değişmedikçe geçerli kalıyor.
Nerede bozuluyor: ilk denemede -sseof bazı VBR MP3’lerde yanlış konuma düşüyor, sessizlik yanlış yerde raporlanıyor. FLAC’ta sorun görmedim, ama MP3’te dosyanın ortasını “son” sanabiliyor. Bunu fark ettiğimde birkaç parçayı elle dinleyip doğruladım; artık -sseof çıktısında süre uyuşmazlığı görürsem o dosyayı tam taramaya geri düşürüyorum. İkinci tuzak: dosya değişince eski .tail.txt kalıyor, bu yüzden kütüphaneyi güncellediğimde bu dosyaları siliyorum, yoksa bayat veriyle öneri üretiyorum. Üçüncüsü, sessizlik eşiğini -38 dB yaptım; çok sessiz kayıtlarda (oda kaydı, canlı) bu eşik gerçek geçişleri de eliyor. Canlı albümlerde eşiği -45 dB’e çekiyorum, ama bunu otomatikleştirmedim, albüm bazında elle seçiyorum.
Sizin kütüphanenizde geçiş hesabına hiç girmemesi gereken parçaları hangi tek ölçütle ayırıyorsunuz; sessizlik dışında bir işaret kullanıyor musunuz?


0 条评论
还没有评论,写下第一条。