直播平台强大的变现能力是大家有目共睹的,很多开发商在搭建直播平台时为了增加用户黏性,纷纷将直播中加入连麦功能。

目前市场上通用的有两种连麦方案:本地混流和云端混流。本地混流即主播和连麦观众分别推一路流,其他观众将这两路流拉过来之后,使用两个播放器播放。云端混流即主播的流在CDN上完成混流,是画面和音频进行叠加,其他观众只拉混流后的这一路,而且可以同时看到主播的画面。云端混流具有即时性强、音画同步性好、质量稳定且节省流量等优点,所以今天来跟大家简单介绍一下,Android端直播APP源码的实现方式。

本地混流

首先初始推流器:

@Override
public void init() {
mStreamer = new KSYStreamer(mContext);
mStreamer.setPreviewFps(LiveConfig.PUSH_FRAME_RATE);//预览采集帧率
mStreamer.setTargetFps(LiveConfig.PUSH_FRAME_RATE);//推流采集帧率
mStreamer.setVideoKBitrate(LiveConfig.PUSH_VIDEO_BITRATE * 3 / 4, LiveConfig.PUSH_VIDEO_BITRATE, LiveConfig.PUSH_VIDEO_BITRATE / 4);//视频码率
mStreamer.setAudioKBitrate(LiveConfig.PUSH_AUDIO_BITRATE);//音频码率
mStreamer.setCameraCaptureResolution(LiveConfig.PUSH_CAP_RESOLUTION);//采集分辨率
mStreamer.setPreviewResolution(LiveConfig.LINK_MIC_PUSH_PREVIEW_RESOLUTION);//预览分辨率
mStreamer.setTargetResolution(LiveConfig.PUSH_VIDEO_RESOLUTION);//推流分辨率
mStreamer.setVideoCodecId(LiveConfig.PUSH_ENCODE_TYPE);//H264
mStreamer.setEncodeMethod(LiveConfig.PUSH_ENCODE_METHOD);//软编
mStreamer.setVideoEncodeScene(LiveConfig.PUSH_ENCODE_SCENE);//秀场模式
mStreamer.setVideoEncodeProfile(LiveConfig.PUSH_ENCODE_PROFILE);
mStreamer.setAudioChannels(2);//双声道推流
mStreamer.setVoiceVolume(2f);
mStreamer.setEnableRepeatLastFrame(false); // 切后台的时候不使用最后一帧
mStreamer.setEnableAutoRestart(true, 3000); // 自动重启推流
mStreamer.setCameraFacing(CameraCapture.FACING_FRONT);
mStreamer.setFrontCameraMirror(true);
mStreamer.setOnInfoListener(this);
mStreamer.setOnErrorListener(this);
mStreamer.setOnLogEventListener(this);
mStreamer.setDisplayPreview((GLSurfaceView) findViewById(R.id.camera_preview));
}
然后使用IM工具向主播发起连麦申请,
private void audienceApplyLinkMic() {
long curTime = System.currentTimeMillis();
if (curTime - mLastApplyLinkMicTime < 11000) {//时间间隔11秒
ToastUtil.show(R.string.link_mic_apply_waiting);
} else {
mLastApplyLinkMicTime = curTime;
//请求权限
ProcessResultUtil processResultUtil = ((LiveActivity) mContext).getProcessImageUtil();
if (processResultUtil == null) {
return;
}
processResultUtil.requestPermissions(new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO
}, new Runnable() {
@Override
public void run() {
SocketLinkMicUtil.audienceApplyLinkMic(mSocketClient);
ToastUtil.show(R.string.link_mic_apply);
}
});
}
}

当主播同意申请之后,申请连麦的观众启动推流器进行推流,使用IM工具通知主播推流成功,并且将自己的播放地址发送给主播,主播开启播放器进行播放。

云端混流通常使用比较成熟的CDN,如腾讯云、声网等。以下部分代码是控制画面中两位主播的相对位置,进而实现画中画效果。

private String createMixParams() {
JSONObject obj = new JSONObject();
try {
long timestamp = System.currentTimeMillis() / 1000;
obj.put("timestamp", timestamp);
obj.put("eventId", timestamp);
JSONObject interFace = new JSONObject();
interFace.put("interfaceName", LINK_MIC_INTERFACE_NAME);
JSONObject para = new JSONObject();
para.put("app_id", LINK_MIC_APPID);
para.put("interface", LINK_MIC_INTERFACE);
para.put("mix_stream_session_id", mMainStreamId);
para.put("output_stream_id", mMainStreamId);
JSONArray array = new JSONArray();
JSONObject main = new JSONObject();
main.put("input_stream_id", mMainStreamId);
JSONObject mainLayoutParams = new JSONObject();
mainLayoutParams.put("image_layer", 1);
main.put("layout_params", mainLayoutParams);
array.put(main);
for (int i = 0; i < mList.size(); i++) {
JSONObject item = new JSONObject();
item.put("input_stream_id", getStreamIDByStreamUrl(mList.get(i).getPlayurl()));
item.put("layout_params", calculateLayoutParams(mList.size() - 1 - i));
array.put(item);
}
para.put("input_stream_list", array);
interFace.put("para", para);
obj.put("interface", interFace);
} catch (JSONException e) {
e.printStackTrace();
}
return obj.toString();
}

以上就是两种方案在Android端直播APP源码的实现方式。在搭建直播平台的过程中要想打造出优质的直播平台,并且具备高互动性、趣味性的特点,连麦功能已经成为了必不可少的功能之一。而在连麦功能的基础上开发连麦PK功能,已经成为了一线直播平台的吸金利器。只有这样才能最大限度的吸引用户。