node.js - Ffmpeg:如何同时捕获音频和元数据

标签 node.js sockets audio ffmpeg pipe

我正在为用 JS 编写的实时音频流开发一个多平台应用程序。目标是在从声卡捕获音频的同时获取每个 channel 的仪表/音量。这必须在一个命令中完成,因为我收到错误 device or resource busy当使用相同的输入触发多个命令时。

使用以下命令捕获音频可以正常工作:

ffmpeg -y -f alsa -i hw:CARD=PCH,DEV=0 -ac 2 -b:a 192k -acodec libmp3lame -f mp3 -probesize 64 -rtbufsize 64 -reservoir 0 -fflags +nobuffer -hide_banner pipe:1

使用此命令获取右声道的音量(左声道是模拟的,为 -map_channel 提供 0.0.1):
ffmpeg -f alsa -i hw:CARD=PCH,DEV=0 -map_channel 0.0.0 -af ebur128=metadata=1,ametadata=print:key=lavfi.r128.M -f null pipe:1

问题是如何组合这些,提供一种正确管道输出的方法。

作为第一步,我目前的方法是使用 file ametadata 过滤器 ( documenation here ) 的参数并写入使用以下 JS 代码打开的套接字
var net = require('net');

var server = net.createServer(function (stream) {
  stream.on('data', function (c) { console.log('data:', c.toString()); });
});

server.listen('/tmp/test.sock');

喜欢
ffmpeg -f alsa -i hw:CARD=PCH,DEV=0 -map_channel 0.0.1 -af ebur128=metadata=1,ametadata=mode=print:key=lavfi.r128.M:file=unix\:/tmp/test.sock:direct -f null -

但是套接字没有接收到数据并且ffmpeg中没有错误。

将流命令的输出重定向到套接字但是有效:
ffmpeg -y -f alsa -i hw:CARD=PCH,DEV=0 -ac 2 -b:a 192k -acodec libmp3lame -f mp3 -probesize 64 -rtbufsize 64 -reservoir 0 -fflags +nobuffer -hide_banner unix:/tmp/test.sock

我想知道我错过了什么以及我是否走在正确的轨道上。

最佳答案

语法是
ffmpeg -y -f alsa -i hw:CARD=PCH,DEV=0 -filter_complex "asplit=2[out][stats];[stats]ebur128=metadata=1,ametadata=print:key=lavfi.r128.M:file=unix\:/tmp/test.sock:direct=1,anullsink" -map '[out]' -ac 2 -b:a 192k -acodec libmp3lame -f mp3 -reservoir 0 -hide_banner pipe:1
笔记:

  • 必须为过滤器选项提供值,所以它是 direct=1 .
  • 选项 -probesize -rtbufsize -fflags +nobuffer都是仅输入选项,对输出文件没有影响。
  • 我相信 ebur 过滤器默认会扫描并打印所有 channel 的数据。如果您只想使用一个 channel ,请在 ebur128 之前添加一个平移过滤器。
  • 您的 unix proto url 应该没问题,但请检查常规文件或 -消除该变量。
  • 关于node.js - Ffmpeg:如何同时捕获音频和元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59705650/

    相关文章:

    javascript - 使用express.js 路线设置来 react 应用程序

    java - 使用 TCP/IP 在两台不同的计算机之间进行通信

    javascript - SoundManager2 在 Android 上同时播放多个声音

    node.js - 在 View 中获取编译的 Jade 模板?

    javascript - 函数适用于 Promises

    java - JDK 1.5 SSLHandshakeException

    c++ - QT中QAudioInput bufferSize()和bytesReady()的关系

    audio - 将音频从 WebAudio API 广播到服务器端然后到连接的客户端的方法

    javascript - Async/Await 未按照 for 循环语句的预期工作

    sockaddr_in 结构中 "localhost"的 C Linux 宏?