Bagaimana cara membatasi nilai frekuensi audio dalam ffmpeg?

0

Jika saya ingin membuat visualiser audio saya sendiri, misalnya memiliki gambar sesuatu yang meluas dan berkontraksi dengan ketukan audio, bagaimana saya melakukan ini? Apakah ada cara untuk mendapatkan frekuensi audio dalam ffmpeg dan membatasi ke nilai lain? Terima kasih.

Meme Stream
sumber

Jawaban:

3

Yang Anda inginkan adalah beberapa indikasi kenyaringan sampel. Untuk sinyal digital, ini dapat diukur melalui level RMS. Anda dapat menggunakan astats filter dalam ffmpeg dengan injeksi metadata untuk mendapatkan level RMS per sampel:

ffmpeg -i input.m4a -filter:a "astats=metadata=1:reset=1,ametadata=mode=print:key=lavfi.astats.Overall.RMS_level:file=stats.txt" -f null -

Sini, metadata=1 dan reset=1 mengaktifkan keluaran metadata, dan ametadata filter mencetak nilai-nilai tersebut ( mode=print ). Outputnya ditulis untuk stats.txt sementara tidak ada pengkodean aktual dilakukan ( -f null - ). Log terlihat seperti ini:

frame:0    pts:0       pts_time:0      
lavfi.astats.Overall.RMS_level=-77.999541
frame:1    pts:1536    pts_time:0.032  
lavfi.astats.Overall.RMS_level=-68.693275
frame:2    pts:3072    pts_time:0.064  
lavfi.astats.Overall.RMS_level=-62.974396
frame:3    pts:4608    pts_time:0.096  
lavfi.astats.Overall.RMS_level=-61.259331
frame:4    pts:6144    pts_time:0.128  

Anda dapat memfilter garis berdasarkan pada lavfi.astats.Overall.RMS_level kunci dan gunakan nilai-nilai dB untuk visualisasi:

grep "lavfi.astats.Overall.RMS_level=" stats.txt | sed 's/lavfi.astats.Overall.RMS_level=//g' > stats_clean.txt

Minumum adalah minus tak terhingga, dan maksimum adalah 0 - jadi Anda harus menentukan sendiri nilai-nilai itu dengan tepat. Anda mungkin harus memfilter nilai-nilai ini berdasarkan beberapa filter rata-rata bergerak untuk mendapatkan visualisasi yang tepat.

PS: Dengan musik, tidak ada tunggal frekuensi audio. Audio yang Anda dengar terdiri dari frekuensi yang berbeda, yang kami sebut a spektrum . Sepertinya ini, di mana Anda melihat intensitas frekuensi tertentu dari waktu ke waktu:

By Aquegg - Own work, Public Domain, https://commons.wikimedia.org/w/index.php?curid=5544473

ffmpeg astats filter hanya dapat menampilkan informasi dalam domain waktu, bukan domain frekuensi (seperti yang ditunjukkan gambar di atas). Jika Anda ingin menghasilkan spektrum dengan ffmpeg, Anda dapat melakukannya dengan showspectrum filter meskipun.

slhck
sumber
terima kasih atas tanggapannya! Apakah Anda tahu bagaimana saya benar-benar akan melakukan sedikit kendala? Mungkin gambar lingkaran memompa ke amplitudo atau sesuatu?
Meme Stream
Bagi saya, "membatasi" berarti hanya menskalakan (mungkin secara logaritma?) Dari nilai dBFS [-∞, 0] untuk [0, 100]. Implementasi praktis tergantung pada apa yang Anda gunakan untuk benar-benar menampilkan visualisasi (program C? Python?), Dan jenis visualisasi apa yang telah Anda pilih (mis., Bilah “fader” sederhana?). Tidak dapat memberi Anda contoh yang lebih spesifik di sana.
slhck
tidak, saya ingin visualisasi dalam video yang sebenarnya. Apakah tidak ada perintah ffmpeg untuk 'memetakan' nilai dBFS dengan lebar -i image.png atau -i video.mov misalnya?
Meme Stream
Ini tidak begitu jelas dari pertanyaan Anda. Anda dapat menggunakan showvolume memfilter dan mengekspornya, tetapi itu tidak dapat disesuaikan. ffmpeg -i input.mp4 -filter_complex showvolume output.mp4 sebagai contoh.
slhck