我正在尝试使用 FFmpeg 在 NodeJS 中的 webrtc 服务器上录制音频。
如果我明确创建一个 input.sdp 文件并将其与 FFmpeg 的“-i”标志一起使用,我就能够录制音频。
我的问题是:如何在代码中创建一个字符串来动态更改端口号以同时记录不同的流?
我试过这样做:
const sdpInfo = `data:application/sdp;charset=UTF-8,v=0\no=- 0 0 IN IP4 ${ipAddr}\ns=-\nc=IN IP4 ${ipAddr}\nt=0 0\nm=audio ${port} RTP/AVPF 111\na=rtcp:${port+1}\na=rtpmap:111 opus/48000/2\na=fmtp:111 minptime=10;useinbandfec=1`
但是,如果我使用“-i”标志将其作为输入,我会收到以下错误:data:application/sdp;charset=UTF-8,v=0: Invalid data found when processing input
有人可以帮忙吗?
最佳答案
您必须将 SDP 通过管道传送到 stdin
.为此,您需要先将其转换为流。使用以下代码来实现您想要的:
import * as childProcess from 'child_process';
import FFmpegStatic from 'ffmpeg-static';
function convertStringToStream(stringToConvert)
{
const stream = new Readable();
stream._read = () => { };
stream.push(stringToConvert);
stream.push(null);
return stream;
}
const sdpInfo = `v=0\no=- 0 0 IN IP4 ${ipAddr}\n` +
`s=-\nc=IN IP4 ${ipAddr}\n` +
`t=0 0\nm=audio ${port} RTP/AVPF 111\n` +
`a=rtcp:${port+1}\na=rtpmap:111 opus/48000/2\n` +
`a=fmtp:111 minptime=10;useinbandfec=1`;
const ffmpegArgs = [
'-loglevel',
'debug',
'-protocol_whitelist',
'pipe,udp,rtp',
'-f',
'sdp',
'-i',
'pipe:0',
// Rest of your parameters
];
const process = childProcess.spawn(FFmpegStatic, ffmpegArgs);
const sdpStream = convertStringToStream(sdpInfo);
sdpStream.resume();
sdpStream.pipe(process.stdin);
关于javascript - 使用在线 SDP 执行 FFmpeg 录制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65120104/