javascript - 使用在线 SDP 执行 FFmpeg 录制

标签 javascript node.js ffmpeg sdp

我正在尝试使用 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/

相关文章:

c - FFmpeg 解码 .mp4 视频文件

javascript - 通过 javascript 动态附加 html 代码

javascript - Promise { <pending> } ' why is it still pending?' 我该如何解决这个问题?

node.js - 无法将 node.js 应用程序部署到 heroku

javascript - 在javascript中定义对象

ffmpeg - 显示字幕列表,获取每个字幕轨道的 id 和名称

c++ - 使用ffmpeg构建opencv出错

javascript - 在 element.bind 中实现闭包 - Angular

javascript - window.scrollTo 是否在 Safari 中异步工作?

javascript - 获取 DIV ID 然后更改 href 值