$ npm install waveform-util
$ cd node_modules\waveform-util
$ cat package.json | grep depend -A 10 | head -4
我们看到有 node-ffprobe 和 pcm 依赖。
$ cd lib
$ vim waveform.js
有两个出口。 audio_data 使用 ffprobe 和 generate_peaks 使用 pcm。让我们先检查node-ffprobe。
$ cd ..\node-ffprobe # I'm on windows - hence backslashes
$ grep -Rni spawn . # or exec, but exec returned nothing useful
我们看到spawn 用在./lib/ffprobe.js L84 中
$ head -84 lib/ffprobe.js | tail -1 # just print line 84
C:\del\express-drive\node_modules\node-ffprobe>head -84 lib/ffprobe.js | tail -1
var proc = spawn('ffprobe', ['-show_streams', '-show_format', '-loglevel', 'warning', file]),
所以这是运行ffprobe 命令的瓶颈。通过在该行之前加上:console.log(file) 或 console.log('ffprobe', ['-show_streams', '-show_format', '-loglevel', 'warning', file].join(' '));,我们可以获得运行应用程序时使用的特定命令。
你还没有发布你正在使用的例子,所以我必须回到波形工具。
$ cd ..\waveform-util
$ grep -Rni ffprobe .
所以lib\waveform.js L122 使用audio_path 作为传递给node-ffmpeg 的第一个参数。我想这将是file 作为spawn 的最后一个参数。但这并不能回答您的问题。
如果我们回头看看waveform-util\lib\waveform.js:audio_data,它使用ffprobe 仅导出有关音频数据文件的基本信息,而不是从 ffmpeg 命令生成音频流。
(head tail 只是打印文件中的行范围)
PCM
让我们检查一下pcm。
来自waveform-util\lib\waveform.js 的generate_peaks 使用pcm 模块。我会缩短这个。
$ (node_modules) cd pcm
$ grep -Rni -A 2 spawn .
第二个结果显示:
./lib/pcm.js:33: var ffmpeg = spawn('ffmpeg', ['-i',filename,'-f','s16le','-ac',channels,
./lib/pcm.js-34- '-acodec','pcm_s16le','-ar',sampleRate,'-y','pipe:1']);
./lib/pcm.js-35-
您可以生成与上述相同的命令;把它放在spawn 之前/之后,它会打印你正在运行的命令:
console.log('ffmpeg', ['-i',filename,'-f','s16le','-ac',channels,'-acodec','pcm_s16le','-ar',sampleRate,'-y','pipe:1'].join(' '));
当通过waveform-util 运行任何东西时,你会看到产生pcm 需要的任何东西的命令。请注意,pcm 在spawn 调用下方的.on('data', ... 处理程序上进行了额外的操作,因此它可能不是相同的输出,但您将捕获该命令。