当前位置: 首页 > news >正文

昆明网站开发公司电话品牌运营总监

昆明网站开发公司电话,品牌运营总监,淘宝网网站建设,网站建设栏目设置最近在开发使用WebRtc进行视频通话和语音通话,我使用的设备是MTK的手机,期间后台的技术人员几乎没法提供任何帮助,只有接口和测试的web端,有遇到不能推流。推流成功网页端有画面有声音,但是安卓端有画面,没…

最近在开发使用WebRtc进行视频通话和语音通话,我使用的设备是MTK的手机,期间后台的技术人员几乎没法提供任何帮助,只有接口和测试的web端,有遇到不能推流。推流成功网页端有画面有声音,但是安卓端有画面,没有声音的情况

问题一:无法推流

一开始遇到问题是在进行推流前进行sdp的交换,一直返回返回code:400的情况,我们知道在 onCreateSuccess 方法回调中拿到offerSdp,用于向SRS服务进行网络请求,这时候一定注意其间的网络请求地址,token的拼接,peerConnection.addTransceiver添加的视频轨道和音频轨道一定要按照实际需求来,没有的就不要全部添加;全部中间步骤没错,这时候还是返回code:400的问题,后来在后台看到的错误日志是create session : create session : add publisher : publish negotiate : no found valid H.264 payload type,然后就是网上搜索下同样的问题,这里感谢

冬季穿短裤同学的知识帮助,就是接口请求里offer sdpm=videoH.264相关信息,即WebRTC在createOffer时,返回的sdp没有H.264相关信息;Android的使用WebRTC仅支持硬件上 H.264 解码和编码,并且仅支持部分芯片组。因此,如果设备不支持硬件 H.264 或具有不受支持的芯片组,您将只能使用 VP8、VP9。支持的芯片组仅有OMX.qcom.*OMX.Exynos.*,不支持的要自行添加。

解决方法:

VideoEncoderFactory创建

在创建PeerConnectionFactory,可以设VideoEncoderFactory

val encoderFactory = DefaultVideoEncoderFactory(eglBaseContext, true, true)
val peerConnectionFactory = PeerConnectionFactory.builder().setVideoEncoderFactory(encoderFactory).createPeerConnectionFactory()
public class DefaultVideoEncoderFactory implements VideoEncoderFactory {/*** 硬解件编码工厂*/private final VideoEncoderFactory hardwareVideoEncoderFactory;/*** 软件编码工厂*/private final VideoEncoderFactory softwareVideoEncoderFactory = new SoftwareVideoEncoderFactory();public DefaultVideoEncoderFactory(Context eglContext, boolean enableIntelVp8Encoder, boolean enableH264HighProfile) {//创建硬解编码工厂this.hardwareVideoEncoderFactory = new HardwareVideoEncoderFactory(eglContext, enableIntelVp8Encoder, enableH264HighProfile);}/*** 注意这个构造方法仅包可见*/DefaultVideoEncoderFactory(VideoEncoderFactory hardwareVideoEncoderFactory) {this.hardwareVideoEncoderFactory = hardwareVideoEncoderFactory;}...
}
/*** 用于创建视频编码器工厂*/
public interface VideoEncoderFactory {/** * 为给定的视频编解码器创建一个编码器。*/@Nullable@CalledByNativeVideoEncoder createEncoder(VideoCodecInfo var1);/*** 枚举支持的视频编解码器列表。这个方法只会被调用一次,结果将被缓存。*/@CalledByNativeVideoCodecInfo[] getSupportedCodecs();@CalledByNativedefault VideoCodecInfo[] getImplementations() {return this.getSupportedCodecs();}@CalledByNativedefault VideoEncoderFactory.VideoEncoderSelector getEncoderSelector() {return null;}
}

关键在于getSupportedCodecs() 在 HardwareVideoEncoderFactory中是如何实现的

@Override
public VideoCodecInfo[] getSupportedCodecs() {// Android19以下不支持硬解编码.if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {return new VideoCodecInfo[0];}List<VideoCodecInfo> supportedCodecInfos = new ArrayList<>();// 按优先顺序生成支持的编解码器列表:// VP8, VP9, H264 (high profile), and H264 (baseline profile).for (VideoCodecType type : new VideoCodecType[]{VideoCodecType.VP8, VideoCodecType.VP9, VideoCodecType.H264}) {//查找编解码器类型,这里是关键MediaCodecInfo codec = findCodecForType(type);if (codec != null) {String name = type.name();// supported by the decoder.if (type == VideoCodecType.H264 && isH264HighProfileSupported(codec)) {supportedCodecInfos.add(new VideoCodecInfo(name, MediaCodecUtils.getCodecProperties(type, /* highProfile= */ true)));}supportedCodecInfos.add(new VideoCodecInfo(name, MediaCodecUtils.getCodecProperties(type, /* highProfile= */ false)));}}return supportedCodecInfos.toArray(new VideoCodecInfo[0]);
}

findCodecForType(VideoCodecType),根据类型查找支持的编解码器

private MediaCodecInfo findCodecForType(VideoCodecType type) {for (int i = 0; i < MediaCodecList.getCodecCount(); ++i) {MediaCodecInfo info = null;try {info = MediaCodecList.getCodecInfoAt(i);} catch (IllegalArgumentException e) {//无法检索编码器编解码器信息Logging.e(TAG, "Cannot retrieve encoder codec info", e);}//编解器信息为null,或者不是编解码器不是编码器if (info == null || !info.isEncoder()) {continue;}//判断编解码器是否支持,这里就会去判断不同的芯片组是否支持if (isSupportedCodec(info, type)) {return info;}}return null; // 不支持的类型
}

isSupportedCodec(MediaCodecInfo, VideoCodecType):判断MediaCodecInfo和VideoCodecType结合设备芯片组信息是否支持

private boolean isSupportedCodec(MediaCodecInfo info, VideoCodecType type) {if (!MediaCodecUtils.codecSupportsType(info, type)) {return false;}// Check for a supported color format.if (MediaCodecUtils.selectColorFormat(MediaCodecUtils.ENCODER_COLOR_FORMATS, /*这一步其实就可以判断编解码器是否支持了给定的类型了,如果不抛异常的话*/info.getCapabilitiesForType(type.mimeType()))== null) {return false;}return isHardwareSupportedInCurrentSdk(info, type) && isMediaCodecAllowed(info);
}/*** 结合当前的sdk,再次判断是否支持*/
private boolean isHardwareSupportedInCurrentSdk(MediaCodecInfo info, VideoCodecType type) {switch (type) {case VP8:return isHardwareSupportedInCurrentSdkVp8(info);case VP9:return isHardwareSupportedInCurrentSdkVp9(info);case H264:return isHardwareSupportedInCurrentSdkH264(info);}return false;
}private boolean isHardwareSupportedInCurrentSdkH264(MediaCodecInfo info) {//H264 硬件在此类型设备上可能表现不佳。"SAMSUNG-SGH-I337", "Nexus 7", "Nexus 4"if (H264_HW_EXCEPTION_MODELS.contains(Build.MODEL)) {return false;} else {String name = info.getName();//问题就在这,写死的仅支持的硬件编码器解码器组件名称的前缀。//所以要在后面自行追加我们自己设备支持H264名称信息。return name.startsWith("OMX.qcom.") && VERSION.SDK_INT >= 19 || name.startsWith("OMX.Exynos.") && VERSION.SDK_INT >= 21;}
}
————————————————版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.csdn.net/csdn_shen0221/article/details/119982257

Github传送门

问题二:拉流成功出现没有声音

因为没有声音只有在mtk的设备上没有,在我其他的高通处理器手机是正常的,我们一开始想到的可能就是收到的流和编解码问题,还是比较相信webRtc的sdk没有问题的,事实证明打脸了

解决思路:

1、拦截拉流时的音频流,通过反射回调拿到PCM数据,对pcm进行播放

 audioDeviceModule = JavaAudioDeviceModule.builder(applicationContext).setSamplesReadyCallback {//音频输入数据,麦克风数据,原始pcm数据,可以直接录制成pcm文件,再转成mp3val audioFormat = it.audioFormatval channelCount = it.channelCountval sampleRate = it.sampleRate//pcm格式数据val data = it.data}.setAudioTrackStateCallback(object : JavaAudioDeviceModule.AudioTrackStateCallback {override fun onWebRtcAudioTrackStart() {audioDeviceModule.setAudioTrackSamplesReadyCallback {//音频输出数据,通话时对方数据,原始pcm数据,可以直接录制成pcm文件,再转成mp3val audioFormat = it.audioFormatval channelCount = it.channelCountval sampleRate = it.sampleRate//pcm格式数据val data = it.data} 
}override fun onWebRtcAudioTrackStop() {}}).createAudioDeviceModule()

回调数据拿到了pcm的信息audioFormat:2  channelCount:1  sampleRate:48000

a.直接使用AudioTrack播放 data,在高通手机可以,但是在mtk平台不行

b.生成.pcm文件,两设备都可以播放

2、替换播放器,使用编译openSL ES播放文件流,可以播放,但是集成到项目里就不行了,这时候可以想到,应该时webrtc内部做了处理,在拉流播放的时候会关闭其他所有的声道播放

3、使用蓝牙进行播放, mtk设备使用蓝牙进行语音通话有声音,这时候立马想到数据流声道的问题

解决方法:查资料发现webrtc播放音频流是在WebRtcAudioTrack中实现的,点击进去看到也是使用AudioTrack进行播放的,使用了AudioManager.STREAM_VOICE_CALL声道,我们类搜索将所有的Call声道换成AudioManager.STREAM_MUSIC声道,以及AudioAttributes.USAGE_VOICE_COMMUNICATION改成AudioAttributes.USAGE_MEDIA

打开通话测试,冒得问题了

一定不要遗漏了AudioAttributes.USAGE_VOICE_COMMUNICATION

http://www.ritt.cn/news/8864.html

相关文章:

  • 珠海澳门网站建设广东做seo的公司
  • 南京网站建设服务线上推广如何引流
  • 典当行网站源码百度词条官网入口
  • 深圳做网站的公司搜行者seo营销软文范例大全300
  • 宝塔面板怎么做网站互联网运营推广
  • 丁鹿学堂前端培训怎么样西安seo外包平台
  • 商城类网站建设重庆网页搜索排名提升
  • 站长网站工具网站推广计划书
  • 可以做用户画像的网站深圳龙岗区布吉街道
  • 做网站去哪找源码营销策划与运营方案
  • 网站推广外链百度平台推广该怎么做
  • 游戏网站建设杭州南安seo
  • 网络游戏定义百度官方优化指南
  • 行业网站建设seo是什么简称
  • wap网页程序深圳谷歌seo推广
  • 二级域名免费注册网站西地那非片
  • 重庆怎么制作网站?网络营销做的比较好的企业
  • 青岛建站推广seo搜索引擎优化排名哪家更专业
  • 青岛网站建设运营下载百度免费版
  • wordpress增加分类与标签深圳百度seo怎么做
  • 有动效网站搜索引擎优化报告
  • 建设项目社会招标上那个网站万网注册域名
  • 在哪做网站便宜又好卖友情链接的哪来那么多网站
  • 常州网站建设方案维护优化设计答案大全英语
  • wordpress无法更新创建搜索引擎seo
  • 16岁的做兼职在什么网站好营销案例100例简短
  • flash cms网站源码网站优化的方法有哪些
  • 网站建设界面建议快速网站排名提升
  • 西安微官网自助建站公司百度提问
  • 如何做网站视频百度竞价怎么做效果好