// plain傳輸至其它服務(wù),如 FFmpeg GStreamer 等
async plainTransport({ av, ip, port }) {
let rtpTransport;
let rtpConsumer;
try {
const plainTransport = {
listenIp: { ip: "192.168.0.252", announcedIp: null }, // 本機(jī)ip地址,不能127.0.0.1
};
const key = av === 'video' ? 'VC' : 'AC';
const router = await this._routers.get(key).getAvailableMediasoupRouter();
rtpTransport = await router.createPlainTransport({
// No RTP will be received from the remote side
comedia: false,
// FFmpeg and GStreamer don't support RTP/RTCP multiplexing ("a=rtcp-mux" in SDP)
rtcpMux: true,
...plainTransport,
});
// global.mediasoup.rtp.videoTransport = rtpTransport;
this.plainTransports.push(rtpTransport);
rtpTransport.on('tuple', (tuple) => {
console.log('plainTransport on tuple', tuple);
});
rtpTransport.on('rtcptuple', (rtcptuple) => {
console.log('plainTransport on rtcptuple', rtcptuple);
});
rtpTransport.on('sctpstatechange', (sctpState) => {
console.log('plainTransport on tuple', sctpState);
});
await rtpTransport.connect({
ip: ip, // 目標(biāo)ip
port: parseInt(port), // 目標(biāo)端口
// rtcpPort: parseInt(port) + 1, // rtcpMux 為true時(shí),不能設(shè)置rtcpPort
});
/* console.log(
"mediasoup %a RTP SEND transport connected: %s:%d <--> %s:%d (%s)",
av,
rtpTransport.tuple.localIp,
rtpTransport.tuple.localPort,
rtpTransport.tuple.remoteIp,
rtpTransport.tuple.remotePort,
rtpTransport.tuple.protocol
);
console.log(
"mediasoup %a RTCP SEND transport connected: %s:%d <--> %s:%d (%s)",
av,
rtpTransport.rtcpTuple.localIp,
rtpTransport.rtcpTuple.localPort,
rtpTransport.rtcpTuple.remoteIp,
rtpTransport.rtcpTuple.remotePort,
rtpTransport.rtcpTuple.protocol
); */
const producers = [...this.producers.values()]
.filter((producer) => producer.kind === av)
.map((producer) => ({
id: producer.id
}));
console.log('plainTransport producers', producers);
rtpConsumer = await rtpTransport.consume({
producerId: producers[0].id, // 測(cè)試只取第1個(gè)
rtpCapabilities: router.rtpCapabilities, // Assume the recorder supports same formats as mediasoup's router
paused: true,
});
// global.mediasoup.rtp.videoConsumer = rtpConsumer;
rtpTransport.consumer = rtpConsumer;
/* console.log(
"mediasoup %a RTP SEND consumer created, kind: %s, type: %s, paused: %s, SSRC: %s CNAME: %s",
av,
rtpConsumer.kind,
rtpConsumer.type,
rtpConsumer.paused,
rtpConsumer.rtpParameters.encodings[0].ssrc,
rtpConsumer.rtpParameters.rtcp.cname
); */
rtpConsumer.resume();
return { status: 0 };
} catch (error) {
if (rtpConsumer) rtpConsumer.close();
if (rtpTransport) rtpTransport.close();
return error;
}
}
Mediasoup 傳輸至FFmpeg 或GStreamer
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 本文首發(fā)地址:開(kāi)源實(shí)踐網(wǎng):Mediasoup項(xiàng)目實(shí)踐(一)mediasoup-demo部署[https://www...
- 服務(wù)器環(huán)境 CentOS7 Node.js v14.17.5 GCC v9.1.1 Python 2.7.5 (3...
- 1、Gstreamer design Overview 概括性介紹GStreamer的架構(gòu)及Gstreamer內(nèi)部...
- 簡(jiǎn)單的說(shuō)就是把中文字符串利用URLEncode 進(jìn)行轉(zhuǎn)換,在Django端需要用Python 利用相同的方法去解析...