实现流程

更新时间: 2023/10/16 07:01:17

API 时序图

uml diagram

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

实现方法

1 创建推流实例

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

API原型

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

LsMediaCapturePara参数说明

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

示例

objc
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原型

objc/**
 *  打开视频预览
 *  @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)
objc/**
 *  打开视频预览
 *  @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 设置编码码率

示例

objcNeteaseView 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原型

objc/**
 *  初始化推流所需信息
 *
 *  @param  paraCtx 推流参数
 *  @param pushUrl 推流地址
 *  @return 初始化推流是否成功:true/false
 */
public boolean initLiveStream(LiveStreamingPara paraCtx,String pushUrl)
objc/**
*  开始直播
*  
*/
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:关闭

示例

objcmLiveStreamingPara = 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原型

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

参数说明

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

示例

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

代码示例

  • 必须 SDK涉及到麦克风,摄像头的采集,需要事先打开使用权限,申请权限代码如下。
objc/**   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;
    }
}
	
  • 必须 一次推流过程
objc//以下为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;
}

  • 非必须 断线重连
objc//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原型
  • 参数说明
  • 示例
  • 代码示例