为什么一个简单的webrtcvoiceengine音频环回示例无法正常工作?

问题描述 投票:0回答:1
  • 示例代码:(webrtcengine音频环回示例)
#define WIN32_LEAN_AND_MEAN
#define NOMINMAX

#define _WINDOWS
#define WEBRTC_WIN
#define WIN32

#include "media/engine/webrtc_voice_engine.h"

#include "api/audio_codecs/audio_format.h"
#include "api/audio_codecs/builtin_audio_decoder_factory.h"
#include "api/audio_codecs/builtin_audio_encoder_factory.h"
#include "api/task_queue/default_task_queue_factory.h"
#include "api/call/transport.h"

#include "modules/audio_device/include/audio_device.h"
#include "modules/audio_processing/include/audio_processing.h"
#include "media/base/audio_source.h"
#include "media/engine/adm_helpers.h"
#include "rtc_base/copy_on_write_buffer.h"

#include <cstdio>
#include <locale>
#include <string>
#include <iostream>

using namespace webrtc;
using namespace cricket;

static Call *s_call = NULL;

class AudioLoopbackTransport :public webrtc::Transport {
public:
    virtual bool SendRtp(const uint8_t* packet, size_t length, const webrtc::PacketOptions& options)
    {
        std::cout << "Rtp-size: " << length << std::endl;

        webrtc::Call* call = s_call;
        webrtc::PacketReceiver::DeliveryStatus status =
                call->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO, rtc::CopyOnWriteBuffer(packet, length), 0);

        assert(status == webrtc::PacketReceiver::DeliveryStatus::DELIVERY_OK);

        return true;
    }
    virtual bool SendRtcp(const uint8_t* packet, size_t length)
    {
        std::cout << "rtcp-size: " << length << std::endl;
        Call* call = s_call;
        webrtc::PacketReceiver::DeliveryStatus status =
                call->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO, rtc::CopyOnWriteBuffer(packet, length), 0);
        assert(status == webrtc::PacketReceiver::DeliveryStatus::DELIVERY_OK);

        return true;
    }
};

class MyRtcEventLogOutput : public RtcEventLogOutput
{
public:
    explicit MyRtcEventLogOutput() {}
    virtual ~MyRtcEventLogOutput() {}
    bool IsActive() const { return true; }

    bool Write(const std::string& output) {
//        std::cout << output;
        return true;
    }

    void Flush() {}
};

int main(int argc, char *argv[])
{

    std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory = webrtc::CreateDefaultTaskQueueFactory();
    rtc::scoped_refptr<webrtc::AudioProcessing> apm = webrtc::AudioProcessingBuilder().Create();

    auto encoder_factory = webrtc::CreateBuiltinAudioEncoderFactory();
    auto decoder_factory = webrtc::CreateBuiltinAudioDecoderFactory();

    cricket::WebRtcVoiceEngine engine(task_queue_factory.get(),
                                      NULL,
                                      encoder_factory,
                                      decoder_factory,
                                      NULL,
                                      apm);
    engine.Init();

    std::unique_ptr<RtcEventLog> log = RtcEventLog::Create(RtcEventLog::EncodingType::NewFormat);
    std::unique_ptr<RtcEventLogOutput> output = std::make_unique<MyRtcEventLogOutput>();
    log->StartLogging(std::move(output), 100);

    webrtc::CallConfig callConfig(log.get());
    callConfig.audio_state = engine.GetAudioState();

    engine.GetAudioState()->SetPlayout(true);
    engine.GetAudioState()->SetRecording(true);

    s_call = Call::Create(callConfig);
    Transport *audioSendTransport = new AudioLoopbackTransport();
    AudioSendStream::Config streamConfig(audioSendTransport);
    streamConfig.rtp.ssrc = 0;
    AudioSendStream *audioSendStream = s_call->CreateAudioSendStream(streamConfig);

    audioSendStream->Start();

    AudioReceiveStream::Config receiveStreamConfig;
    receiveStreamConfig.rtp.remote_ssrc = 1;
    receiveStreamConfig.rtp.local_ssrc = 0;
    receiveStreamConfig.rtcp_send_transport = audioSendTransport;
    AudioReceiveStream *audioReceiveStream = s_call->CreateAudioReceiveStream(receiveStreamConfig);
    audioReceiveStream->Start();

    MediaConfig mediaConfig;
    AudioOptions audioOptions;
    CryptoOptions cryptoOptions;
    VoiceMediaChannel *voiceMediaChannel = engine.CreateMediaChannel(s_call, mediaConfig, audioOptions, cryptoOptions);
    std::cout << voiceMediaChannel->AddSendStream(cricket::StreamParams::CreateLegacy(0)) << std::endl;
    std::cout << voiceMediaChannel->AddRecvStream(cricket::StreamParams::CreateLegacy(1)) << std::endl;

    voiceMediaChannel->SetSend(true);
    voiceMediaChannel->SetPlayout(true);

    std::cout << "wait>>>>>" << std::endl;

    Sleep(INT_MAX * 1000);
    return 0;
}
  • 输出:enter image description here

该示例应该实现的是声音自发接收,然后播放录音,但未能达到预期的目的。没有声音,没有数据。没有收到RTP软件包,我的操作程序正确吗?是否有一个webrtcengine音频回送示例供参考。我不知道该怎么办。帮帮我。

c++ webrtc voice
1个回答
0
投票
@ cmdv @Philipp Hancke @jib帮帮我
© www.soinside.com 2019 - 2024. All rights reserved.