Mediasoup 傳輸至FFmpeg 或GStreamer

    // 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;
        }
    }
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容