Mediasoup 传输至FFmpeg 或GStreamer

    // plain传输至其它服务,如 FFmpeg GStreamer 等
    async plainTransport({ av, ip, port }) {
        let rtpTransport;
        let rtpConsumer;
        try {
            const plainTransport = {
                listenIp: { ip: "192.168.0.252", announcedIp: null }, // 本机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, // 目标ip
                port: parseInt(port), // 目标端口
                // rtcpPort: parseInt(port) + 1, // rtcpMux 为true时,不能设置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, // 测试只取第1个
                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;
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容