Android 4.4设备Native WebRTC无音频问题求助
我之前帮朋友排查过几乎一模一样的问题,Android 4.4设备上WebRTC音频死活出不来,高版本正常,单独用官方库不行但AppRTC演示却能跑通——核心原因就是你猜的那样:AppRTCAudioManager做了专门的低版本音频兼容处理,而你用的官方WebRTC库默认没适配API21以下的设备。
先解释下你日志里的错误:AudioAttributes$Builder是Android 5.0(API21)才引入的,AudioRecord$Builder更是要到6.0(API23)才有,你的库版本org.webrtc:google-webrtc:1.0.19742在初始化音频组件时直接调用了这些高API类,4.4设备上找不到就会导致音频轨道初始化失败,自然没声音。
下面是亲测有效的解决步骤:
1. 手动复刻AppRTCAudioManager的兼容逻辑
AppRTC的音频管理器核心就是根据系统版本做策略降级,你可以自己封装一个类似的音频管理类,核心逻辑是:
- 当设备API < 21时,放弃
AudioAttributes.Builder,改用旧的AudioTrack构造函数,指定STREAM_VOICE_CALL流类型; - 当设备API < 23时,不用
AudioRecord.Builder,直接用传统的AudioRecord初始化方式。
举个简化的兼容初始化示例:
// 初始化AudioTrack的兼容代码 private AudioTrack createCompatibleAudioTrack(int sampleRate, int channelConfig, int audioFormat, int bufferSize) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { AudioAttributes attributes = new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION) .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) .build(); return new AudioTrack.Builder() .setAudioAttributes(attributes) .setAudioFormat(new AudioFormat.Builder().setSampleRate(sampleRate) .setEncoding(audioFormat) .setChannelMask(channelConfig) .build()) .setBufferSizeInBytes(bufferSize) .build(); } else { // Android 4.4及以下用旧构造方法 return new AudioTrack(AudioManager.STREAM_VOICE_CALL, sampleRate, channelConfig, audioFormat, bufferSize, AudioTrack.MODE_STREAM); } }
2. 调整WebRTC音频初始化参数
确保你在创建WebRTC的音频源时,用Android 4.4支持的参数:
- 采样率优先选44100Hz(大部分旧设备的标配);
- 声道数用单声道(减少兼容性问题);
- 初始化
PeerConnectionFactory时,显式配置音频选项,禁用高版本特性:
PeerConnectionFactory.InitializationOptions initOptions = PeerConnectionFactory.InitializationOptions.builder(context) .setEnableInternalTracer(true) .setFieldTrials("WebRTC-Audio-MinimizeResampling/Enabled/") .createInitializationOptions(); PeerConnectionFactory.initialize(initOptions);
3. 定制WebRTC音频引擎(进阶方案)
如果上面的方法还不行,可以考虑自己编译WebRTC源码,修改voiceengine目录下的WebRtcAudioTrack.java和WebRtcAudioRecord.java:
- 在调用高API Builder的方法里捕获
ClassNotFoundException,然后 fallback 到旧的初始化逻辑; - 比如在
WebRtcAudioTrack.createAudioTrackOnLollipopOrHigher方法中,添加异常捕获,触发旧版本初始化流程。
4. 最后检查权限
虽然高版本正常,但Android 4.4也要确保Manifest里声明了必要权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.INTERNET" />
核心就是一句话:AppRTC帮你做了版本兼容的脏活累活,单独用库时得自己补上这部分逻辑,只要适配了旧API的音频初始化方式,Android 4.4的音频就能正常工作了。
内容的提问来源于stack exchange,提问作者user2948965

