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