实现流程
更新时间: 2024/08/23 14:52:55
API 时序图
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 |
|
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 |
|
setFormatType | FormatType |
|
setRecordPath | String | 设置本地录制地址,formatType 为MP4或RTMP_AND_MP4有效 |
setQosOn | boolean | 默认开启Qos
|
setAutoRecord | boolean | 当formatType 为MP4或RTMP_AND_MP4时,配置推流时是否自动录制。默认为推流时自动录制。如果您需要配置推流时不进行录制,您可以修改该配置 |
setSyncTimestamp(syncTimestamp,absoluteTime) | boolean |
|
setStreamTimestampPassthrough | boolean |
|
setAudioSource | int | 设置AudioRecord的AudioSource。 默认不需要设置。当用户音视频采集出现兼容性问题时,可通过该参数进行适配 |
setEnableNs | boolean | 开启或关闭音频降噪模块。 默认不需要设置,当用户音视频采集出现兼容性问题时,可通过该参数进行适配
|
setEnableAgc | boolean | 开启或关闭音频自动增益模块。 默认不需要设置,当用户音视频采集出现兼容性问题时,可通过该参数进行适配
|
示例
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();
调用initLiveStream
、startLiveStream
之后,需要检查SDK回调信息:
- 如果返回
MSG_START_LIVESTREAMING_FINISHED
,则说明成功开始推流。 - 如果返回
MSG_INIT_LIVESTREAMING_OUTFILE_ERROR
、MSG_INIT_LIVESTREAMING_VIDEO_ERROR
、MSG_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);
- 如果连续调用
uninitLsMediaCapture
与stopLiveStreaming
,参数必须为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();
此文档是否对你有帮助?