【问题标题】:ffmpeg/ffprobe to produce a numeric array outputffmpeg/ffprobe 生成数字数组输出
【发布时间】:2016-04-02 16:49:04
【问题描述】:

我一直在使用this npm module: 创建波形数字输出,如下所示:

[0,0.0062,0.0688,0.2524,0.2691,0.2645,0.1594,0.1397,0.1672

但是,这个模块可能没有得到很好的支持,并且已经有几年没有维护了。该模块将自己描述为“ffprobe 的小型包装器”。

我的问题 - ffmpeg/ffprobe 命令行如何生成数字数组输出?

非常感谢。

【问题讨论】:

  • 我应该提到这一点:我对 node.js 不够了解,无法深入研究源代码并确定对 ffmpeg/ffprobe 的调用发生在哪里并尝试剖析它。
  • 数组代表什么?
  • 我认为数组是分贝的十进制值,但这只是一个猜测。当我将阵列输入到 wavesurfer 播放器时,我得到了一个很好的波形。
  • 我找到了另一个有效且更新的:npmjs.com/package/waveform-node

标签: node.js ffmpeg ffprobe


【解决方案1】:
$ npm install waveform-util 
$ cd node_modules\waveform-util
$ cat package.json | grep depend -A 10 | head -4

我们看到有 node-ffprobepcm 依赖。

$ cd lib
$ vim waveform.js

有两个出口。 audio_data 使用 ffprobegenerate_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.jsgenerate_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 需要的任何东西的命令。请注意,pcmspawn 调用下方的.on('data', ... 处理程序上进行了额外的操作,因此它可能不是相同的输出,但您将捕获该命令。

【讨论】:

  • 谢谢-我尝试根据您设法发现的内容运行命令,该命令如下所示:“ffmpeg -i /test.opus -f s16le -ac 1 -acodec pcm_s16le -y pipe :1 > result.txt" 但 result.txt 文件包含原始数据,而不是数字数组。
  • 我应该认为会有几个简单的 CLI 开关来创建一个数字,它会在 ffmpeg 指令中介绍。
  • @edwardsmarkf 你好。到底有没有找到获取数值数组的方法?
  • 更新:我不得不使用 python 在此处的帮助下解码原始数据:superuser.com/questions/1481748/…
  • 对不起,时间太长了,我不记得了。我想我们在这一点上切换到了 katspaugh-wavesurfer,所以我不再需要这个了。
猜你喜欢
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
  • 2020-04-08
相关资源
最近更新 更多