我正在为用 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
都是仅输入选项,对输出文件没有影响。 -
消除该变量。 关于node.js - Ffmpeg:如何同时捕获音频和元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59705650/