直播
Android
产品介绍
简介
主要功能
产品优势
应用场景
使用限制
快速开始
推流端SDK
概述
更新日志
集成SDK
开发指南
实现流程
进阶功能
API 参考
错误码
播放器SDK
播放器产品简介
更新日志
下载 SDK 和示例代码
跑通示例项目
集成SDK
开发指南
实现播放功能
播放器相关回调
播放控制
时间戳校对方案
拉流地址预调度
音视频数据回调
API 参考
最佳实践
OBS推流使用指南
常见问题
服务协议

实现流程

更新时间: 2022/12/29 16:48:05

API 时序图

uml diagram

init与unInit,start与stop都要保持匹配使用。 如要断线重连,需先调用stopLiveStreaming,等待接受到SDK回调消息 MSG_STOP_LIVESTREAMING_FINISHED之后才能继续调用initLiveStream、startLiveStreaming重新开始推流。

实现方法

1 创建推流实例

SDK在初始化推流阶段,设置推流地址,配置推流参数,创建推流session,您可以根据是否需要定制直播参数而选择

API原型

  • 创建直播实例
/**
*  初始化推流实例
*  @param  lsMediaCapturePara  {@link LsMediaCapturePara }初始化参数类型
*/
public lsMediaCapture(LsMediaCapturePara lsMediaCapturePara)

LsMediaCapturePara参数说明

参数 类型 说明
setContext Context 设置SDK上下文,建议使用ApplicationContext
setMessageHandler lsMessageHandler 设置SDK消息回调接口
setLogLevel lsLogUtil.LogLevel 设置日志级别(info、warn、error)
setUploadLog boolean 设置是否上传日志

示例


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 打开预览画面

设置摄像头预览参数,并打开摄像头进行预览。提供两种方式:SDK模板预览,用户自定义预览

API原型

/**
 *  打开视频预览
 *  @param videoView {@link com.netease.vcloud.video.render.NeteaseView}
 *  @param frontCamera 是否前置摄像头
 *  @param filter 是否开启滤镜
 *  @param quality 视频能力
 *  @param scale_16x9 是否强制 16:9 模式
 *
 */
public void startVideoPreview(NeteaseView videoView,boolean frontCamera,boolean filter,VideoQuality quality,boolean scale_16x9)
/**
 *  打开视频预览
 *  @param videoView {@link com.netease.vcloud.video.render.NeteaseView}
 *  @param frontCamera 是否前置摄像头
 *  @param filter 是否开启滤镜
 *  @param para 视频采集以及编码的参数
 */
public void startVideoPreviewEx(NeteaseView videoView,boolean frontCamera,boolean filter,VideoPara para)

参数说明

参数 类型 说明
videoView NeteaseView SDK提供的预览显示View,用户可以布局到自己的APP中
frontCamera boolean 是否默认前置摄像头
filter boolean 是否使用SDK内置滤镜
quality VideoQuality
  • MEDIUM:标清 480360
  • HIGH:高清 640480
  • SUPER:超清 960540
  • SUPER_HIGH:超高清 1280720
scale_16x9 boolean 是否按16:9宽高比例

VideoPara参数说明

参数 类型 说明
setWidth int 设置编码宽
setHeight int 设置编码高
setFps int 设置编码帧率
setBitrate int 设置编码码率

示例

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);

特殊说明

调用startPreview之后,需要检查SDK回调信息,如果返回MSG_START_PREVIEW_ERROR,则说明打开摄像头失败,建议提示用户检查权限

3 开始推流

初始化推流参数,开始推流

API原型

/**
 *  初始化推流所需信息
 *
 *  @param  paraCtx 推流参数
 *  @param pushUrl 推流地址
 *  @return 初始化推流是否成功:true/false
 */
public boolean initLiveStream(LiveStreamingPara paraCtx,String pushUrl)
/**
*  开始直播
*  
*/
public void startLiveStreaming()

参数说明

初始化推流参数说明LiveStreamingPara

参数 类型 说明
setStreamType StreamType
  • AUDIO:单音频
  • VIDEO:单视频
  • AV:音视频双流
setFormatType FormatType
  • MP4:MP4纯录制
  • RTMP:RTMP 推流
  • RTMP_AND_MP4:边推RTMP 边录制MP4
setRecordPath String 设置本地录制地址,formatType为MP4或RTMP_AND_MP4有效
setQosOn boolean 默认开启Qos
  • true:开启
  • false:关闭
setAutoRecord boolean formatType为MP4或RTMP_AND_MP4时,配置推流时是否自动录制。
默认为推流时自动录制。如果您需要配置推流时不进行录制,您可以修改该配置
setSyncTimestamp(syncTimestamp,absoluteTime) boolean
  • syncTimestamp
    • true:发送同步时间戳
    • false:不发送,默认不发送。
  • absoluteTime
    • true:绝对时间(unix时间)
    • false:相对于推流的时间(从0开始)
setStreamTimestampPassthrough boolean
  • true:网易云信透传时间戳
  • false:不透传,默认不透传
setAudioSource int 设置AudioRecord的AudioSource。
默认不需要设置。当用户音视频采集出现兼容性问题时,可通过该参数进行适配
setEnableNs boolean 开启或关闭音频降噪模块。
默认不需要设置,当用户音视频采集出现兼容性问题时,可通过该参数进行适配
  • true: 开启
  • false:关闭
setEnableAgc boolean 开启或关闭音频自动增益模块。
默认不需要设置,当用户音视频采集出现兼容性问题时,可通过该参数进行适配
  • true:开启
  • false:关闭

示例

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); //(直播答题使用)网易云信透传时间戳,但完全透传功能需要联系网易云信开通,
//mLiveStreamingPara.setAudioSource(MediaRecorder.AudioSource.DEFAULT); //默认不需要设置,当用户音视频采集出现兼容性问题时,可自行通过该接口进行适配
//mLiveStreamingPara.setEnableNs(false); //默认不需要设置,当用户音视频采集出现兼容性问题时,可自行通过该接口进行适配
//mLiveStreamingPara.setEnableAgc(false);//默认不需要设置,当用户音视频采集出现兼容性问题时,可自行通过该接口进行适配

支持纯音频

mLSMediaCapture.initLiveStream(mLiveStreamingPara,mliveStreamingURL);
mLSMediaCapture.startLiveStreaming();

调用initLiveStreamstartLiveStream之后,需要检查SDK回调信息:

  • 如果返回MSG_START_LIVESTREAMING_FINISHED,则说明成功开始推流。
  • 如果返回MSG_INIT_LIVESTREAMING_OUTFILE_ERRORMSG_INIT_LIVESTREAMING_VIDEO_ERRORMSG_INIT_LIVESTREAMING_AUDIO_ERROR则说明推流失败,您需要检查推流地址是否有效或者被禁用。

4 结束推流

结束推流,释放相机等资源

API原型

/**
*  结束推流
*  
*/
public void stopLiveStreaming()
/**
 *  销毁视频预览实例
 */
public void destroyVideoPreview()
/**
*  关闭视频预览
*/
public void stopVideoPreview()
/**
 *  反初始化推流实例
 *  @param  uninitNow 立即反初始化实例的标记
 */
public void uninitLsMediaCapture(boolean uninitNow)

参数说明

参数 类型 说明
uninitNow boolean true:马上释放,false:等待推流结束后释放。(如推流已开始必须设置为false)

示例

mLSMediaCapture.stopLiveStreaming();
mLSMediaCapture.stopVideoPreview();
mLSMediaCapture.destroyVideoPreview();
//反初始化推流实例,当它与stopLiveStreaming连续调用时,参数为false
mLSMediaCapture.uninitLsMediaCapture(false);
  • 如果连续调用 uninitLsMediaCapturestopLiveStreaming,参数必须为false,用于SDK异步结束推流释放资源。
  • 如果先调用stopLiveStreaming,并且收到MSG_STOP_LIVESTREAMING_FINISHED消息,那可以直接设置为true。

代码示例

  • 必须 SDK涉及到麦克风,摄像头的采集,需要事先打开使用权限,申请权限代码如下。
/**   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;
    }
}
	
  • 必须 一次推流过程
//以下为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、调用停止直播接口
if(mLSMediaCapture != null){
	mLSMediaCapture.stopLiveStreaming();
}

//2、等待SDK消息回调中的停止直接结束消息
case MSG_STOP_LIVESTREAMING_FINISHED://停止直播完成
{
  Log.i(TAG, "test: MSG_STOP_LIVESTREAMING_FINISHED");
  showToast("停止直播已完成");
  m_liveStreamingOn = false;
  startPauseResumeBtn.setClickable(true);
  break;
}

//3、重新初始化推流地址并直播
 mLSMediaCapture.initLiveStream(mLiveStreamingPara,mliveStreamingURL);
 mLSMediaCapture.startLiveStreaming();
此文档是否对你有帮助?
有帮助
我要吐槽
  • API 时序图
  • 实现方法
  • 1 创建推流实例
  • API原型
  • LsMediaCapturePara参数说明
  • 示例
  • 2 打开预览画面
  • API原型
  • 参数说明
  • 示例
  • 特殊说明
  • 3 开始推流
  • API原型
  • 参数说明
  • 示例
  • 4 结束推流
  • API原型
  • 参数说明
  • 示例
  • 代码示例