ffmpeg max_volume Olumlu Desibeller?


1

Ffmpeg'in max_volumeparametresi pozitif değerler veriyor 0mu , yoksa maksimumu alıyor mu?

0Maksimum birim için dönen birden fazla dosya görüyorum , ancak birim düzeyleri aynı değil. Bazılarında algılamaya ve çıkarmaya çalıştığım sağır edici kabarcıklar var.

Örnek ffmpeg çıktısı:

frame=19323 fps=1143 q=0.0 Lsize=N/A time=00:12:52.92 bitrate=N/A    
video:1812kB audio:144184kB subtitle:0 global headers:0kB muxing overhead -100.000015%
n_samples: 73822208
[Parsed_volumedetect_0 @ 0x7f77e0] mean_volume: -22.6 dB
[Parsed_volumedetect_0 @ 0x7f77e0] max_volume: 0.0 dB
[Parsed_volumedetect_0 @ 0x7f77e0] histogram_0db: 8169
[Parsed_volumedetect_0 @ 0x7f77e0] histogram_1db: 388
[Parsed_volumedetect_0 @ 0x7f77e0] histogram_2db: 531
[Parsed_volumedetect_0 @ 0x7f77e0] histogram_3db: 2389
[Parsed_volumedetect_0 @ 0x7f77e0] histogram_4db: 5039
[Parsed_volumedetect_0 @ 0x7f77e0] histogram_5db: 12128
[Parsed_volumedetect_0 @ 0x7f77e0] histogram_6db: 24978
[Parsed_volumedetect_0 @ 0x7f77e0] histogram_7db: 48077

Kullanırken:

ffmpeg -i /var/www/CDNFiles/Video_1Web.mp4 -af "volumedetect" -f null /dev/null/ 2>&1

... veya bunun için yanlış araç ffmpeg mi? H264 codec ile kodlanmış mp4 video dosyalarım var.

Teşekkürler.


Deneyin -af astats=reset=1:metadata=1,ametadata=print:file=volume.logve volume.log dosyasını kontrol edinlavfi.overall.RMS_level / peak
Gyan

Bir dosyaya doğru atmam gerekmiyor mu? ffmpeg -i /var/www/CDNFiles/Video_1Web.mp4 -af "astats=reset=1:metadata=1,ametadata=print" -f null /dev/null/ 2>&1çalışmalı? Bu hiçbir değeri lavfiveya peakdeğeri geri getirmiyor. Bu doğru kullanım ise soruyu yanıtla güncelleyeceğim.
chris85,

Konsol çıkışı için volume.logile değiştirin -. Ama o tarafından zip olacak.
Gyan

Yani döndürüyor At least one output file must be specifiediçin ffmpeg -i /var/www/CDNFiles/Video_1Web.mp4 -af "astats=reset=1:metadata=1,ametadata=print:file=/home/chris/volume.log"veyaffmpeg -i /var/www/CDNFiles/Video_1Web.mp4 -af "astats=reset=1:metadata=1,ametadata=print:file=-"
chris85

-f null /dev/nullÇıktısını saklamanız gerekiyor, yani süzgeç bildirimdeki volume.log dosyasını değiştiriniz-
Gyan

Yanıtlar:


2

"max_volume", 0'dan büyük olamaz.

Göre libavfilter / af_volumedetect.c :

av_log(ctx, AV_LOG_INFO, "max_volume: %.1f dB\n", -logdb(max_volume * max_volume));

Bu nedenle, istediğiniz gibi pozitif geri dönmek için "logdb" negatif bir sayı döndürmelidir. İşte logdb:

#define MAX_DB 91

static inline double logdb(uint64_t v)
{
    double d = v / (double)(0x8000 * 0x8000);
    if (!v)
        return MAX_DB;
    return -log10(d) * 10;
}

"D" 1'den büyükse, "logdb" negatif döndürür:

$ awk 'BEGIN {print -log(2) / log(10) * 10}'
-3.0103

"D" almak için 1'in üzerinde "max_volume", 0x8000'den büyük olmalıdır. "Max_volume" 0x8000'den büyük olabilir mi? Hayır bu olamaz:

max_volume = 0x8000;
while (max_volume > 0 && !vd->histogram[0x8000 + max_volume] &&
                         !vd->histogram[0x8000 - max_volume])
    max_volume--;

Dosyayı yeniden kodlamak istemiyorsanız, dosyada bir ses akışı olduğu sürece AacGain'i kullanabilirsiniz:

aacgain -k -r -s s -m 10 file

Veya sadece analiz etmek istiyorsanız:

aacgain -s s file

Bilgi:

-k - automatically lower Track/Album gain to not clip audio
-r - apply Track gain automatically (all files set to equal loudness)
-s s - skip (ignore) stored tag info (do not read or write tags)
-m <i> - modify suggested gain by integer i

Bu aacgainseçeneği henüz deneme şansım olmadı ama buna bakacak. Teşekkürler.
chris85
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.