WebRTC Android:本地高画质预览、远端低画质传输实现方案咨询
解决本地高清预览+远端低画质传输的方案
我来帮你搞定这个2G网络下的画质需求——核心是把本地预览的画面和发送给对方的视频流完全分离:本地直接渲染相机采集的原始高清帧,而给PeerConnection的则是经过降质处理的低画质流。具体步骤如下:
1. 让本地预览直接对接相机原始输出
AppRTC默认是把相机采集的流经过PeerConnection处理后再渲染,导致本地和远端画质绑定。我们要打破这个绑定:
- 初始化
CameraVideoCapturer后,不要用PeerConnection返回的MediaStream来渲染本地画面。 - 单独给本地预览准备一个
SurfaceView或TextureView,在调用CameraVideoCapturer.startCapture()时,把这个View的Surface传给相机作为预览输出。这样相机采集的原始高清帧会直接渲染到这个View上,本地看到的就是原生高清画质。
2. 为远端传输单独创建降质后的视频流
针对发送给对方的流,我们需要单独做降质处理:
- 用
PeerConnectionFactory创建一个独立的VideoSource(比如叫remoteSendSource),然后调用它的adaptOutputFormat()方法设置低参数:// 示例:设置为320x240分辨率、10帧/秒,适配2G网络 remoteSendSource.adaptOutputFormat(320, 240, 10); - 把
CameraVideoCapturer和这个remoteSendSource绑定,WebRTC会自动帮你把相机的原始帧降质成你设置的参数,再传给PeerConnection。
3. 将降质流发送给远端
从remoteSendSource创建对应的VideoTrack,把它加入到MediaStream里,再通过PeerConnection.addTrack()发送给对方。这样对方收到的就是低画质、适合2G网络的视频流,而你本地看的还是高清的相机原始画面。
关键提醒
- 绝对不要复用本地预览的
VideoSource给远端传输,必须分开两个独立的数据源,这样adaptOutputFormat只会影响发送给对方的流,不会干扰本地预览。 - 相机采集的初始分辨率要设成你想要的高清规格(比如1280x720),本地预览直接用这个原始分辨率,远端则靠
adaptOutputFormat自动降质。 - 如果需要更精细的帧处理(比如自定义缩放算法),可以实现
VideoSink接口接收相机原始帧,处理后再传给远端的VideoSource,但一般WebRTC内置的适配已经足够应付2G场景了。
内容的提问来源于stack exchange,提问作者Kristiyan Petrov
相关产品推荐
相关产品推荐

