Bilgisayarların sıkıcı işleri yapmasına izin vermeyi tercih ediyorum, bu yüzden flolilo'nun cevabından başlayarak şunu bitirdim:
ffmpeg -i is_this_stereo.wav -filter_complex 'pan=mono|c0=0.5*FL+-0.5*FR,silenceremove=start_periods=1' -f null -
Bu, eğer giriş dosyasının kanalları tam kopyalarsa (CD'lerin en az biri için olan), "Çıkış dosyası boş, hiçbir şey kodlanmadı" uyarısını gösterir. Susturucu filtre filtresini , örneğin, silenceremove=start_periods=1:start_threshold=0.02
veya bazı gürültülere aldırmamak için rahatlatabilirsiniz start_threshold=-17dB
, ancak bu göreceli genlik, kayıt seviyesine göre değil, PCM özelliğine göredir. Bazı CD'lerim için bu değer, ince ancak oldukça sesli stereoları filtreler; diğerleri için asgari düzeyde.
-f null -
Bölüm basitçe konsol mesajı yeterli olması durumunda dosya çıktısı, bastırır, ama tabii ki bunu fark dosyası yazmak sağlayabilirsiniz. Bir betiğin içindeki tekliği kontrol etmek için, geldiğim en iyi şey:
out=$(ffmpeg -nostdin -loglevel error -i "$infile" -filter_complex 'pan=mono|c0=0.5*FL+-0.5*FR,silenceremove=start_periods=1:detection=peak' -t 0.00002 -f crc -)
if [ "$out" == 'CRC=0x00000001' ]
then echo "$infile is definitely mono"
fi
Bu komut dosyasında:
- Zaman sınırı
-t 0.00002
, farkı tek bir numuneye indirir (standart 44.100 numune / saniye CD içeriği için), bu da stereo dosyalarda algılamayı büyük ölçüde hızlandırır. -frames 1
aynı sonuçları verir, sistemimde, ancak bir çerçevenin birden fazla örnek içerdiğinden olması gerektiğinden emin değilim. -fs 1
Bir baytın nispeten ötesine geçer.
-f crc
çıktıyı bir komut dosyasında ele almak daha kolay olan ASCII olarak yazıyor. Bir 16 bit örnek sessizlik gidericiden geçerse, 32 bit CRC'nin başlangıçtaki 1 değerinden değişmesi gerektiğini düşünüyorum. Ayrıca -f md5
veya kullanabilirsiniz -f hash
.
out
Kabuk -e seçeneğini kullanırsanız, aşağıdaki test yerine, ayrı ayrı atama , betiğin hatalı durmasını sağlar.