paullouisageneau / libdatachannel

C/C++ WebRTC network library featuring Data Channels, Media Transport, and WebSockets
https://libdatachannel.org/
Mozilla Public License 2.0
1.75k stars 357 forks source link

receive audio in streamer example #1113

Open freedom1810 opened 7 months ago

freedom1810 commented 7 months ago

I modified streamer example to send audio from browser to C++ site but dont know how to play it in C++

my modified code to receive audio packet from browser

shared_ptr<ClientTrackData> addAudio(const shared_ptr<PeerConnection> pc, const uint8_t payloadType, const uint32_t ssrc, const string cname, const string msid, const function<void (void)> onOpen) {
    auto audio = Description::Audio(
        cname
        );
    audio.setDirection(rtc::Description::Direction::SendRecv);
    audio.addOpusCodec(payloadType);
    audio.addSSRC(ssrc, cname, msid, cname);
    auto track = pc->addTrack(audio);
    // create RTP configuration
    auto rtpConfig = make_shared<RtpPacketizationConfig>(ssrc, cname, payloadType, OpusRtpPacketizer::DefaultClockRate);
    // create packetizer
    auto packetizer = make_shared<OpusRtpPacketizer>(rtpConfig);
    // add RTCP SR handler
    auto srReporter = make_shared<RtcpSrReporter>(rtpConfig);
    packetizer->addToChain(srReporter);
    // add RTCP NACK handler
    auto nackResponder = make_shared<RtcpNackResponder>();
    packetizer->addToChain(nackResponder);
    // set handler
    track->setMediaHandler(packetizer);
    track->onOpen(onOpen);

    track->onMessage(
        [packetizer](rtc::binary message) {
            // This is an RTP packet
            printf("Binary message from % d \n" ,int(message.size()));
        },
        nullptr);
    auto trackData = make_shared<ClientTrackData>(track, srReporter);
    return trackData;
}
vvalentinich commented 7 months ago

To play audio, you need: 1) Extract audio data from RTP packets; 2) Decode Opus to PCM (for example, using libopus); 3) Send PCM data to an audio playback device. Probably, it is worth to use a third-party library to implement some steps.