1.问题描述
在Android中,使用webrtc官方提供的Demo。在创建peerconnectionfactory时,将自定义so库中的音频编解码器工厂对象传递给webrtc的so库。webrtc的so库会使用刚传递进来的编解码器工厂对象,去调用这个工厂对象中的函数GetSupportedEncoders(),而函数将会构造数据将vector<.AudioCodecSpec>的对象specs进行返回。然后再webrtc的so库中,根据specs进行数据打印,发现如果直接cout打印specs里面的string成员变量name,日志输出无值;如果name调用了c_str()方法,cout打印输出才有值。
2.相关代码
2.1自定义so库中的GetSupportedEncoders()方法
std::vector<AudioCodecSpec> GetSupportedEncoders()override {
std::vector<AudioCodecSpec> specs;
const SdpAudioFormat fmt = {"opus",
48000,
2,
{{"minptime", "10"}, {"useinbandfec", "1"}}};
AudioCodecInfo info(48000, 2,
32000,
6000,
510000);
info.allow_comfort_noise = false;
info.supports_network_adaption = true;
AudioCodecSpec spec ={fmt,info};
specs.push_back(spec);
return specs;
}
2.2webrtc中so库函数调用与数据打印
函数调用:
CollectCodecs(encoder_factory_->GetSupportedEncoders());
数据打印:
std::vector<AudioCodec> WebRtcVoiceEngine::CollectCodecs(
const std::vector<webrtc::AudioCodecSpec>& specs) const {
PayloadTypeMapper mapper;
std::vector<AudioCodec> out;
std::string name = "webrtc";
RTC_LOG(LS_ERROR) << "WebRtcVoiceEngine::CollectCodecs() webrtc.name="<< name;
RTC_LOG(LS_ERROR) << "WebRtcVoiceEngine::CollectCodecs() specs.size="<<specs.size();
RTC_LOG(LS_ERROR) << "WebRtcVoiceEngine::CollectCodecs() specs.back().format.name= "<<specs.back().format.name;
RTC_LOG(LS_ERROR) << "WebRtcVoiceEngine::CollectCodecs() specs.back().format.name.c_str()= "<<specs.back().format.name.c_str();
RTC_LOG(LS_ERROR) << "WebRtcVoiceEngine::CollectCodecs() specs.back().format.clockrate_hz="<<specs.back().format.clockrate_hz;
RTC_LOG(LS_ERROR) << "WebRtcVoiceEngine::CollectCodecs() specs.back().format.num_channels="<<specs.back().format.num_channels;
}
#3.Android-Logcat日志截图
#4.备注说明
4.1.如果直接在webrtc的so库中定义string类型变量,直接打印输出是有值;
4.2.自定义so库是在Android studio中用cmake生成放入到webrtc中的demo;
4.3.webrtc中demo使用的webrtc.aar文件是自己重新编译生成的;