Audio 如何使用FFmpeg获得音频峰值?

Audio 如何使用FFmpeg获得音频峰值?,audio,ffmpeg,waveform,spectrum,audiowaveform,Audio,Ffmpeg,Waveform,Spectrum,Audiowaveform,我正在开发一个音乐应用程序,需要为我的文件生成音频频谱。像这个: 所以我试着这样使用: audiowaveform -i music.mp3 --pixels-per-second 1 -o out.dat 这给了我以下结果[正确的结果]:[前10个单词是元数据] 0000000 0001 0000 0000 0000 bb80 0000 bb80 0000 0000020 00f9 0000 df3e 1fa2 e22c 1ef3 e0bb 1e5a 0000040 e099 1e88 df

我正在开发一个音乐应用程序,需要为我的文件生成音频频谱。像这个:

所以我试着这样使用:

audiowaveform -i music.mp3 --pixels-per-second 1 -o out.dat
这给了我以下结果[正确的结果]:[前10个单词是元数据]

0000000 0001 0000 0000 0000 bb80 0000 bb80 0000
0000020 00f9 0000 df3e 1fa2 e22c 1ef3 e0bb 1e5a
0000040 e099 1e88 dfcf 1c33 e29f 1d4c e055 1f80
0000060 df63 1e3a e1b4 1f31 e271 1d81 e0e5 1b1c
0000100 e06d 1be4 dee2 1cb0 e118 1da1 e026 1dea
0000120 e055 1dac df9b 1dbf e0c3 2063 ded4 21b2
0000140 dec9 1f8d de5b 20c8 e02d 216a dd7e 21af
0000160 dea1 20ac de6c 2170 de80 1e12 de6f 1fb9
0000200 dde3 2106 e0d9 21be de88 218c de81 1f9f
0000220 decb 20ff deb2 1edc df32 20c4 dde7 ...
但当我用FFmpeg做这种工作时:

ffmpeg -y -i music.mp3 -acodec pcm_s16le -f s16le -ac 1 -ar 1 -v quiet out.pcm
这会得出以下结果,但结果完全不同:

0000000 0001 fffe fffe fffe 0000 ffff fffd 0000
0000020 ffff ffff fffe 0001 0001 fffd 0001 fffe
0000040 0002 fffe fffc 0002 ffff fffc fffe 000b
0000060 0007 fffb 0004 0001 ffff fffd ffff 0002
0000100 0008 0006 fffe ffff 0001 0000 0003 000a
0000120 fffd ffff 0004 ffff 0001 ffff fffd ffff
0000140 fffe ffff 0001 fffd fffe 0000 fffb 0002
0000160 0002 0000 fffe 0000 fffb fffe fffe 0000
0000200 ffff 0000 ffff fffc 0002 0003 0005 0003
0000220 0002 fffb fffb fffa fffa 0004 0009 ...

你可能想知道为什么我要做-ar 1或-1像素每秒?这是因为我想为每秒钟画一条线,所以我需要得到每秒钟的峰值。我不知道我遗漏了什么,但我希望从FFmpeg中得到同样的结果

这不是FFMPEG的解决方案,但仍然是波形阵列的结果

我的解决方案是使用linux软件包,该软件包有一个简单的cli来提取具有所需采样率的波形数据

您可以在ubuntu上安装它,如:

sudo添加apt存储库ppa:chris needham/ppa 更新源 sudoapt安装音频波形 或在macOS上使用类似的:

brew tap bbc/audiowaveform brew安装音频波形 首先,我使用问题中提供的命令来绘制波形,但它不准确且肮脏。因为它每秒钟采集一个样本,这不是我想要的。所以我决定每秒抽取100个样本,用一些JS代码得到平均值。因此,提取波形的命令为:

audiowaveform-i/root/audio.mp3-像素每秒100-输出格式json- 这将在stdout上输出音频波形数据以及一些元数据,最后连字符完成了这项工作。所以在我的例子中,我使用NodeJs来获得这个输出,并将波形数组减少到波形块的平均值。请注意,我从波形中删除了负数,以处理波形的上半部分

从子进程导入{exec}; 导出默认函数getAudioWaveformfilename,blockSize=100{ 返回新的PromiseSolve,拒绝=>{ const命令=`audiowaveform-i${filename}-每秒像素数${blockSize}-输出格式json-`; execcommand,错误,stdout,stderr=>{ 如果错误为rejecterror,则为stderr; 试一试{ const data=JSON.parsestdout.data.filter,i=>i%2==1 常量波形=[]; 对于let i=0;is+n,0/100; 分解波形; }缉捕犯{ rejectex; } }; } }
这不是FFMPEG的解决方案,但仍然是波形阵列的结果

我的解决方案是使用linux软件包,该软件包有一个简单的cli来提取具有所需采样率的波形数据

您可以在ubuntu上安装它,如:

sudo添加apt存储库ppa:chris needham/ppa 更新源 sudoapt安装音频波形 或在macOS上使用类似的:

brew tap bbc/audiowaveform brew安装音频波形 首先,我使用问题中提供的命令来绘制波形,但它不准确且肮脏。因为它每秒钟采集一个样本,这不是我想要的。所以我决定每秒抽取100个样本,用一些JS代码得到平均值。因此,提取波形的命令为:

audiowaveform-i/root/audio.mp3-像素每秒100-输出格式json- 这将在stdout上输出音频波形数据以及一些元数据,最后连字符完成了这项工作。所以在我的例子中,我使用NodeJs来获得这个输出,并将波形数组减少到波形块的平均值。请注意,我从波形中删除了负数,以处理波形的上半部分

从子进程导入{exec}; 导出默认函数getAudioWaveformfilename,blockSize=100{ 返回新的PromiseSolve,拒绝=>{ const命令=`audiowaveform-i${filename}-每秒像素数${blockSize}-输出格式json-`; execcommand,错误,stdout,stderr=>{ 如果错误为rejecterror,则为stderr; 试一试{ const data=JSON.parsestdout.data.filter,i=>i%2==1 常量波形=[]; 对于let i=0;is+n,0/100; 分解波形; }缉捕犯{ rejectex; } }; } }
我有完全相同的场景,你找到解决方案了吗?不确定我是在做梦还是你说你找到了解决方案:D@MarcoMedrano是 啊不久前找到的。我已经发布了我的解决方案谢谢!我想我的浏览器缓存了旧页面,看不到它,但现在我可以了@MarcoMedrano希望这对我有帮助我有完全相同的场景,你找到解决方案了吗?不确定我是在做梦还是你说你找到了解决方案:D@MarcoMedrano是 啊不久前找到的。我已经发布了我的解决方案
谢谢你!我想我的浏览器缓存了旧页面,看不到它,但现在我可以了@MarcoMedrano希望这有助于感谢最后的连字符制作了这个神奇的json-到目前为止,它还没有文档记录,谢谢分享@MarcoMedrano很高兴它帮助了Hanks,在最后连字符创造了魔法,json-在日期,它没有被记录,谢谢分享@马可梅德拉诺很高兴这有帮助