直播最主要的两端:推流直播 和 拉流观看。网易云关于推流,提供了不错的Demo 和 相应代码。
为了便于推流的管理和调用,我将推流功能放在了单独Fragment中。这样页面中不管推流直播显示窗口有多大,在哪个位置都不用担心。而且,会议页面同时会有推流 和 拉流功能,因此将推流 和 拉流分别放在Fragment中更有必要。
推流功能的,具体的集成步骤,还是建议参考官方步骤(官方有权威性和及时性,我说的是负责的官方)。Android网易云推流集成步骤
一、libs 文件夹jar包, .so等相应文件的导入;
二、assets/filter下的滤镜文件的导入(若使用sdk自带滤镜功能,必须导入);
三、AndroidManifest.xml 需要配置直播相关的权限,代码中动态申请权限;
权限处理相关代码:
/** 6.0权限处理 **/
private boolean bPermission = false;
private final int WRITE_PERMISSION_REQ_CODE = 100;
private boolean checkPublishPermission() {
if (Build.VERSION.SDK_INT >= 23) {
List<String> permissions = new ArrayList<>();
if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(ConfigActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(ConfigActivity.this, Manifest.permission.CAMERA)) {
permissions.add(Manifest.permission.CAMERA);
}
if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(ConfigActivity.this, Manifest.permission.RECORD_AUDIO)) {
permissions.add(Manifest.permission.RECORD_AUDIO);
}
if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(ConfigActivity.this, Manifest.permission.READ_PHONE_STATE)) {
permissions.add(Manifest.permission.READ_PHONE_STATE);
}
if (permissions.size() != 0) {
ActivityCompat.requestPermissions(ConfigActivity.this,
(String[]) permissions.toArray(new String[0]),
WRITE_PERMISSION_REQ_CODE);
return false;
}
}
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case WRITE_PERMISSION_REQ_CODE:
for (int ret : grantResults) {
if (ret != PackageManager.PERMISSION_GRANTED) {
return;
}
}
bPermission = true;
break;
default:
break;
}
}
四、在proguard-project.txt文件中 配置代码混淆;
五、代码编写:
1.首先new lsMediaCapture创建推流实例
lsMediaCapture.LsMediaCapturePara lsMediaCapturePara = new lsMediaCapture.LsMediaCapturePara();
lsMediaCapturePara.setContext(getApplicationContext()); //设置SDK上下文(建议使用ApplicationContext)
lsMediaCapturePara.setMessageHandler(this); //设置SDK消息回调
lsMediaCapturePara.setLogLevel(lsLogUtil.LogLevel.INFO); //日志级别
lsMediaCapturePara.setUploadLog(publishParam.uploadLog);//是否上传SDK日志
mLSMediaCapture = new lsMediaCapture(lsMediaCapturePara);
2.调用startVideoPreview打开预览界面
NeteaseView videoView = (NeteaseView) findViewById(R.id.videoview);
boolean frontCamera = publishParam.frontCamera; // 是否前置摄像头
boolean mScale_16x9 = publishParam.isScale_16x9; //是否强制16:9
lsMediaCapture.VideoQuality videoQuality = publishParam.videoQuality; //视频模板(SUPER_HIGH 1280*720、SUPER 960*540、HIGH 640*480、MEDIUM 480*360、LOW 352*288)
mLSMediaCapture.startVideoPreview(videoView,frontCamera,mUseFilter,videoQuality,mScale_16x9);
// SDK 默认提供 /** 标清 480*360 */MEDIUM, /** 高清 640*480 */HIGH,
// /** 超清 960*540 */SUPER,/** 超高清 (1280*720) */SUPER_HIGH 四个模板,
// 用户如果需要自定义分辨率可以调用startVideoPreviewEx 接口并参考以下参数
// 码率计算公式为 width * height * fps * 9 /100;
// lsMediaCapture.VideoPara para = new lsMediaCapture.VideoPara();
// para.setHeight(720);
// para.setWidth(1280);
// para.setFps(15);
// para.setBitrate(1200*1024);
// mLSMediaCapture.startVideoPreviewEx(videoView,frontCamera,mUseFilter,para);
注意:videoView 是NeteaseView ,如果画面仅占屏幕的局部,需要设置videoView .setFullScreen(false); 这里默认是true,也就是画面占满全屏。
3.initLiveStream初始化推流地址 及 推流参数说明LiveStreamingPara
mLiveStreamingPara = new lsMediaCapture.LiveStreamingPara();
mLiveStreamingPara.setStreamType(publishParam.streamType); // 推流类型 AV、AUDIO、VIDEO
mLiveStreamingPara.setFormatType(publishParam.formatType); // 推流格式 RTMP、MP4、RTMP_AND_MP4
mLiveStreamingPara.setRecordPath(publishParam.recordPath);//formatType 为 MP4 或 RTMP_AND_MP4 时有效
mLiveStreamingPara.setQosOn(publishParam.qosEnable);
//mLiveStreamingPara.setSyncTimestamp(true,false);//(直播答题使用)网易云透传时间戳,不依赖CDN方式,不需要额外开通(必须包含视频流)
//mLiveStreamingPara.setStreamTimestampPassthrough(true); //(直播答题使用)网易云透传时间戳,但完全透传功能需要联系网易云开通,支持纯音频
mLSMediaCapture.initLiveStream(mLiveStreamingPara,mliveStreamingURL);
4.startLiveStreaming开始推流,之后可以调用其他推流过程中的API
mLSMediaCapture.startLiveStreaming();
5.最后先stopLiveStreaming停止推流,再unInit反初始化推流实例释放资源
说明:init与unInit,start与stop都要保持匹配使用
mLSMediaCapture.stopLiveStreaming();
mLSMediaCapture.stopVideoPreview();
mLSMediaCapture.destroyVideoPreview();
//反初始化推流实例,当它与stopLiveStreaming连续调用时,参数为false
mLSMediaCapture.uninitLsMediaCapture(false);
以上五个大步骤,是网易云推流集成到项目的基本步骤。代码的5个步骤:实例创建、画面预览、参数初始化、推流、结束推流释放资源。这些步骤构成了,大体的直播过程。
推流全过程代码:
//以下为SDK调用主要步骤,请用户参考使用
//1、创建直播实例
lsMediaCapture.LsMediaCapturePara lsMediaCapturePara = new lsMediaCapture.LsMediaCapturePara();
lsMediaCapturePara.setContext(getApplicationContext()); //设置SDK上下文(建议使用ApplicationContext)
lsMediaCapturePara.setMessageHandler(this); //设置SDK消息回调
lsMediaCapturePara.setLogLevel(lsLogUtil.LogLevel.INFO); //日志级别
lsMediaCapturePara.setUploadLog(publishParam.uploadLog);//是否上传SDK日志
mLSMediaCapture = new lsMediaCapture(lsMediaCapturePara);
//2、设置直播参数
mLiveStreamingPara = new lsMediaCapture.LiveStreamingPara();
mLiveStreamingPara.setStreamType(publishParam.streamType); // 推流类型 AV、AUDIO、VIDEO
mLiveStreamingPara.setFormatType(publishParam.formatType); // 推流格式 RTMP、MP4、RTMP_AND_MP4
mLiveStreamingPara.setRecordPath(publishParam.recordPath);//formatType 为 MP4 或 RTMP_AND_MP4 时有效
mLiveStreamingPara.setQosOn(publishParam.qosEnable);
mLiveStreamingPara.setQosEncodeMode(publishParam.qosEncodeMode); //1:流畅优先, 2:清晰优先 默认流畅优先
//3、 预览参数设置
NeteaseView videoView = (NeteaseView) findViewById(R.id.videoview);
boolean frontCamera = publishParam.frontCamera; // 是否前置摄像头
boolean mScale_16x9 = publishParam.isScale_16x9; //是否强制16:9
if(publishParam.streamType != AUDIO){ //开启预览画面
lsMediaCapture.VideoQuality videoQuality = publishParam.videoQuality; //视频模板(SUPER_HIGH 1280*720、SUPER 960*540、HIGH 640*480、MEDIUM 480*360、LOW 352*288)
mLSMediaCapture.startVideoPreview(videoView,frontCamera,mUseFilter,videoQuality,mScale_16x9);
}
m_startVideoCamera = true;
if(mUseFilter){ //demo中默认设置为干净滤镜
mLSMediaCapture.setBeautyLevel(5); //磨皮强度为5,共5档,0为关闭
mLSMediaCapture.setFilterStrength(0.5f); //滤镜强度
mLSMediaCapture.setFilterType(publishParam.filterType);
}
private boolean startAV(){
//6、初始化直播
m_liveStreamingInitFinished = mLSMediaCapture.initLiveStream(mLiveStreamingPara,mliveStreamingURL);
if(mLSMediaCapture != null && m_liveStreamingInitFinished) {
//7、开始直播
mLSMediaCapture.startLiveStreaming();
m_liveStreamingOn = true;
if(mNeedWater){
//8、设置视频水印参数(可选)
addWaterMark();
//9、设置视频动态水印参数(可选)
addDynamicWaterMark();
}
if(mNeedGraffiti){
//10、设置视频涂鸦参数(可选)
addGraffiti();
}
return true;
}
return m_liveStreamingInitFinished;
}
//停止直播调用相关API接口
if(mLSMediaCapture != null && m_liveStreamingOn) {
//停止直播,释放资源
mLSMediaCapture.stopLiveStreaming();
//如果音视频或者单独视频直播,需要关闭视频预览
if(m_startVideoCamera)
{
mLSMediaCapture.stopVideoPreview();
//消耗第三方滤镜
releaseSenseEffect();
mLSMediaCapture.destroyVideoPreview();
}
//反初始化推流实例,当它与stopLiveStreaming连续调用时,参数为false
mLSMediaCapture.uninitLsMediaCapture(false);
mLSMediaCapture = null;
}
网易云推流还有其他很多细节:
1、推流的中断、恢复;(视频、音频);
2、伴音(视频推流过程中,添加伴音);
3、网速测试;
4、摄像头操作多种功能:闪光灯、变焦、对焦、前后摄像头切换、分辨率切换、曝光度设置
5、画面镜像操作;
6、滤镜相关操作;
7、水印相关操作;
具体详情,还是建议参考官方开发指南