默认
发表评论 5
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
webrtc中的so库,调用其他so库传递过来的数据,无法使用?
阅读(27122) | 评论(5 收藏 淘帖
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打印输出才有值。请问,在webrtc的so里面,如何不调用c_str()前提获取值。

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文件是自己重新编译生成的;



即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

标签:Android webrtc

1595991422_432560.png (212.41 KB, 下载次数: 1187)

日志输出

日志输出
推荐方案
评论 5
你这是打算做什么样的定制开发吗
在Android上,我需要使用自定义的音频编解码器,不使用webrtc提供的内置音频编解码器
引用:JackJiang 发表于 2020-07-31 21:25
你这是打算做什么样的定制开发吗


在Android上,我需要使用自定义的音频编解码器,不使用webrtc提供的内置音频编解码器
引用:Rowen 发表于 2020-07-31 22:31
在Android上,我需要使用自定义的音频编解码器,不使用webrtc提供的内置音频编解码器

使用内置音频编解码器时,没有任何问题是吧,下载的源码是稳定版吗
引用:JackJiang 发表于 2020-07-31 23:05
使用内置音频编解码器时,没有任何问题是吧,下载的源码是稳定版吗

内置的都没问题,源码也是稳定的,就是在创建peerconnectionfactory音频工厂传的是我自己的,webrtc调我自定义的so库函数都没问题,就是在传值的时候,把值传递给webrtc,它不能直接获取,只能调用c_str()才能获取到值,导致后面创建sdp一直出错。
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部