# PlainTransport, ffmpeg, recording

**URL:** <https://mediasoup.discourse.group/t/plaintransport-ffmpeg-recording/6512>\
**Category:** Integration\
**Created:** [February 28, 2025, 5:58pm UTC](https://mediasoup.discourse.group/t/plaintransport-ffmpeg-recording/6512 "2025-02-28T17:58:42Z")\
**Posts on this page:** 15\
**Page:** 1

<div class="post-metadata">

**Author:** ![MNormatov](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/mnormatov/32/2547_2.png) [@MNormatov](https://mediasoup.discourse.group/u/MNormatov)\
**Post date:** [February 28, 2025, 5:58pm UTC](https://mediasoup.discourse.group/t/plaintransport-ffmpeg-recording/6512/1 "2025-02-28T17:58:42Z")

</div>

Hello!  
I’m trying to record a video, and I do this:

```auto
       const worker = await mediasoup.createWorker(...);
       const router = await worker.createRouter(...);

      const webrtcTransport = ...;
      const producerMap = ...; // audio and video producers by kind

        let rtpTransport = await router.createPlainTransport({
            rtcpMux: false,
            listenInfo: {
                protocol: 'udp',
                ip: '192.168.0.218', // my local IP address
            },
        });

        console.log('rtp tuple: ', rtpTransport.tuple);

        await rtpTransport.connect({
            ip: '192.168.0.218', // my local IP address
            port: rtpTransport.tuple.localPort,
            rtcpPort: rtpTransport.rtcpTuple.localPort
        });

        for (let [kind, producer] of client.producerMap) {
            const codecs = [];
            const routerCodec = router.rtpCapabilities.codecs.find(
                codec => codec.kind === kind,
            );
            codecs.push(routerCodec);

            console.log('codecs: ', codecs);

            await rtpTransport.consume({
                producerId: producer.id, // producer id from WebRtcTransport
                rtpCapabilities: {
                    codecs,
                    rtcpFeedback: [],
                },
            });
        }

```

I check for a stream through the VLC media player, but nothing shows there. (it doesn’t work in ffmpeg command either.) I read the documentation and various examples. But I can’t figure out why it doesn’t work.  
What am I doing wrong?

---

<div class="post-metadata">

**Author:** ![ibc](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/ibc/32/1540_2.png) [@ibc](https://mediasoup.discourse.group/u/ibc)\
**Post date:** [February 28, 2025, 6:59pm UTC](https://mediasoup.discourse.group/t/plaintransport-ffmpeg-recording/6512/2 "2025-02-28T18:59:37Z")

</div>

Why are you assuming that the codecs supported by the mediasoup Router are the codecs that the consuming endpoint support?

---

<div class="post-metadata">

**Author:** ![MNormatov](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/mnormatov/32/2547_2.png) [@MNormatov](https://mediasoup.discourse.group/u/MNormatov)\
**Post date:** [March 1, 2025, 1:26am UTC](https://mediasoup.discourse.group/t/plaintransport-ffmpeg-recording/6512/3 "2025-03-01T01:26:05Z")

</div>

Thank you for your fast reply

I thought the consumer work through a transport created by the router, if their codecs are not supported by the router, the transport will also not accept them.  
Isn’t it so?

---

<div class="post-metadata">

**Author:** ![ibc](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/ibc/32/1540_2.png) [@ibc](https://mediasoup.discourse.group/u/ibc)\
**Post date:** [March 1, 2025, 7:35am UTC](https://mediasoup.discourse.group/t/plaintransport-ffmpeg-recording/6512/4 "2025-03-01T07:35:27Z")

</div>

> **[mediasoup :: Communication Between Client and Server](https://mediasoup.org/documentation/v3/communication-between-client-and-server/#consuming-media-in-an-external-endpoint)**
>
> Cutting Edge WebRTC Video Conferencing

---

<div class="post-metadata">

**Author:** ![MNormatov](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/mnormatov/32/2547_2.png) [@MNormatov](https://mediasoup.discourse.group/u/MNormatov)\
**Post date:** [March 3, 2025, 10:57am UTC](https://mediasoup.discourse.group/t/plaintransport-ffmpeg-recording/6512/5 "2025-03-03T10:57:01Z")

</div>

It doesn’t work! Has anyone done this in practice? any help!!

---

<div class="post-metadata">

**Author:** ![ibc](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/ibc/32/1540_2.png) [@ibc](https://mediasoup.discourse.group/u/ibc)\
**Post date:** [March 3, 2025, 11:10am UTC](https://mediasoup.discourse.group/t/plaintransport-ffmpeg-recording/6512/6 "2025-03-03T11:10:34Z")

</div>

Of course that assuming that your consuming endpoint (VLC media player) supports the exact codecs and codec configurations than the codecs given to the mediasoup Router won’t work. I sent a link above. Please don’t ignore it.

---

<div class="post-metadata">

**Author:** ![MNormatov](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/mnormatov/32/2547_2.png) [@MNormatov](https://mediasoup.discourse.group/u/MNormatov)\
**Post date:** [March 3, 2025, 12:23pm UTC](https://mediasoup.discourse.group/t/plaintransport-ffmpeg-recording/6512/7 "2025-03-03T12:23:00Z")

</div>

Yes, I read the documentation by link above, and I logged this data:

audio consumer for sdp data

```auto
{
localIp: '127.0.0.1',
  localPort: 40874,
  codecs: [
    {
      mimeType: 'audio/opus',
      clockRate: 48000,
      payloadType: 100,
      channels: 2,
      ssrc: 650582774,
      cname: '/obshdcxRX6Lju3w'
    }
  ]

```

and video consumer sdp data

```auto
localIp: '127.0.0.1',
  localPort: 40074,
  codecs: [
    {
      mimeType: 'video/VP8',
      clockRate: 90000,
      payloadType: 101,
      channels: undefined,
      ssrc: 554091003,
      cname: '/obshdcxRX6Lju3w'
    }
  ]

```

than I created SDP file

```auto
v=0
o=- 0 0 IN IP4 127.0.0.1
s=Mediasoup RTP Stream
t=0 0
c=IN IP4 127.0.0.1

m=video 40074 RTP/AVP 101
a=rtpmap:101 VP8/90000
a=framesize:101 640-480
a=ssrc:554091003 cname:/obshdcxRX6Lju3w

m=audio 40874 RTP/AVP 100
a=rtpmap:100 OPUS/48000/2
a=ssrc:650582774 cname:/obshdcxRX6Lju3w

```

in VCL media play, I can’t play with this SDP.

then I tried through ffmpeg commands. does not work((.

---

<div class="post-metadata">

**Author:** ![ibc](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/ibc/32/1540_2.png) [@ibc](https://mediasoup.discourse.group/u/ibc)\
**Post date:** [March 3, 2025, 12:55pm UTC](https://mediasoup.discourse.group/t/plaintransport-ffmpeg-recording/6512/8 "2025-03-03T12:55:15Z")

</div>

> [@MNormatov](#):
>
> ```auto
> v=0
> o=- 0 0 IN IP4 127.0.0.1
> s=Mediasoup RTP Stream
> t=0 0
> c=IN IP4 127.0.0.1
> 
> m=video 40074 RTP/AVP 101
> a=rtpmap:101 VP8/90000
> a=framesize:101 640-480
> a=ssrc:554091003 cname:/obshdcxRX6Lju3w
> 
> m=audio 40874 RTP/AVP 100
> a=rtpmap:100 OPUS/48000/2
> a=ssrc:650582774 cname:/obshdcxRX6Lju3w
> 
> ```

I don’t know what exactly VLC supports but probably you don’t want to have blank lines in the SDP (that’s incorrect) and most probably you want to place the audio section first.

---

<div class="post-metadata">

**Author:** ![MoatazNoaman2001](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/moataznoaman2001/32/2738_2.png) [@MoatazNoaman2001](https://mediasoup.discourse.group/u/MoatazNoaman2001)\
**Post date:** [March 3, 2025, 1:00pm UTC](https://mediasoup.discourse.group/t/plaintransport-ffmpeg-recording/6512/9 "2025-03-03T13:00:44Z")

</div>

hi media soup demo is disconnected for 2 days giving error in connection and then close()

---

<div class="post-metadata">

**Author:** ![MNormatov](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/mnormatov/32/2547_2.png) [@MNormatov](https://mediasoup.discourse.group/u/MNormatov)\
**Post date:** [March 3, 2025, 3:47pm UTC](https://mediasoup.discourse.group/t/plaintransport-ffmpeg-recording/6512/10 "2025-03-03T15:47:32Z")

</div>

I definitely couldn’t setting VLC codecs either, so I mainly test in ffmpeg

and updated the SDP as you said

```auto
v=0
o=- 0 0 IN IP4 127.0.0.1
s=Mediasoup RTP Stream
t=0 0
c=IN IP4 127.0.0.1
m=audio 40815 RTP/AVP 100
a=rtpmap:100 OPUS/48000/2
a=ssrc:490896972 cname:NtMtvNflfczSLdO3/
m=video 40714 RTP/AVP 101
a=rtpmap:101 VP8/90000
a=framesize:101 640-480
a=ssrc:599134926 cname:NtMtvNflfczSLdO3/

```

but unfortunately it is not recorded.  
below are some commands ffmpeg:

```auto
ffmpeg -loglevel debug -protocol_whitelist "file,udp,rtp" -f sdp -i input.sdp -map 0:v:0 -map 0:a:0 -c:v copy -c:a aac output.mp4(or .webm)

ffmpeg -loglevel debug -protocol_whitelist "file,rtp,udp" -i input.sdp -c:v copy -f mpegts output.mp4(or .webm)

ffmpeg -loglevel debug -protocol_whitelist "file,rtp,udp" -fflags nobuffer -flags low_delay -strict experimental -i input.sdp -c:v libx264 -preset ultrafast -crf 23 -an output.mp4(or .webm)

ffmpeg -loglevel debug -protocol_whitelist "file,pipe,rtp,udp" -i input.sdp -c:v libx264 -preset ultrafast output.mp4(or .webm)

```

---

<div class="post-metadata">

**Author:** ![ibc](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/ibc/32/1540_2.png) [@ibc](https://mediasoup.discourse.group/u/ibc)\
**Post date:** [March 3, 2025, 4:16pm UTC](https://mediasoup.discourse.group/t/plaintransport-ffmpeg-recording/6512/11 "2025-03-03T16:16:35Z")

</div>

I’m afraid I cannot help with ffmpeg things.

---

<div class="post-metadata">

**Author:** ![MNormatov](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/mnormatov/32/2547_2.png) [@MNormatov](https://mediasoup.discourse.group/u/MNormatov)\
**Post date:** [March 4, 2025, 5:27am UTC](https://mediasoup.discourse.group/t/plaintransport-ffmpeg-recording/6512/12 "2025-03-04T05:27:00Z")

</div>

please tell me how to check if RTP is working correctly?

---

<div class="post-metadata">

**Author:** ![ibc](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/ibc/32/1540_2.png) [@ibc](https://mediasoup.discourse.group/u/ibc)\
**Post date:** [March 4, 2025, 7:36am UTC](https://mediasoup.discourse.group/t/plaintransport-ffmpeg-recording/6512/13 "2025-03-04T07:36:57Z")

</div>

> [@MNormatov](#):
>
> ```auto
> await rtpTransport.connect({
> ip: '192.168.0.218', // my local IP address
> port: rtpTransport.tuple.localPort,
> rtcpPort: rtpTransport.rtcpTuple.localPort
> });
> 
> ```

Fix this, please. You are passing the ip and ports of the transport in mediasoup side instead than the ip and port where VLC or ffmpeg are listening. Read the docs of plainTransport.connect().

---

<div class="post-metadata">

**Author:** ![MNormatov](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/mnormatov/32/2547_2.png) [@MNormatov](https://mediasoup.discourse.group/u/MNormatov)\
**Post date:** [March 4, 2025, 12:58pm UTC](https://mediasoup.discourse.group/t/plaintransport-ffmpeg-recording/6512/14 "2025-03-04T12:58:41Z")

</div>

I really appreciate your help, your patience, and your time. Everything worked out perfectly. Thank you so much! 👍

---

<div class="post-metadata">

**Author:** ![ibc](https://yyz2.discourse-cdn.com/free1/user_avatar/mediasoup.discourse.group/ibc/32/1540_2.png) [@ibc](https://mediasoup.discourse.group/u/ibc)\
**Post date:** [March 4, 2025, 1:03pm UTC](https://mediasoup.discourse.group/t/plaintransport-ffmpeg-recording/6512/15 "2025-03-04T13:03:08Z")

</div>

Glad to hear that
