Page History

Stream demo

Last edited by 王琳

简单推流示例

1. 设置参数

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
//设置appID和appkey(请登录[http://open.cnlive.com/]注册)
        Config.init(this, "60_irn9gh9d49", 
                "f7b6db55616d207fd5c07e2b580b5650c690aff58fb36d");
    }
}

2. 在布局文件中加入预览View, 当前支持GLSurfaceView

<android.opengl.GLSurfaceView
android:id="@+id/camera_preview"
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_alignParentBottom="true"
android:layout_alignParentTop="true" />

3. 初始化预览view

GLSurfaceView glSurfaceView=(GLSurfaceView)findViewById(R.id.camera_preview);

4. 创建 Streamer 实例并配置推流相关参数

//初始化推流 SDK
mStreamer = new Streamer(this);

//设置预览编码帧率
mStreamer.setPreviewFps(15);

//设置推流编码帧率
mStreamer.setTargetFps(15);

//设置初始、最大、最小视频码率
mStreamer.setVideoKBitrate(800 * 3 / 4, 800, 800 / 4);

//设置音频编码码率
mStreamer.setAudioBitrate(48);

//分别设置预览和推流分辨率
mStreamer.setPreviewResolution(VIDEO_RESOLUTION_360P);
mStreamer.setTargetResolution(VIDEO_RESOLUTION_360P);

//设置编码模式(硬编/软编/软编兼容)
mStreamer.setEncodeMethod(ENCODE_METHOD_HARDWARE);

//设置预览 View
mStreamer.setDisplayPreview(surfaceView);

//设置自动重连(是否重连,重连次数,重连间隔时间)
setEnableAutoRestart(boolean restart, int count, int time)

//设置 Info 回调,可以收到相关通知信息
mStreamer.setOnInfoListener(mOnInfoListener);

//设置错误回调,收到该回调后,一般是发生了严重错误,比如网络断开等
mStreamer.setOnErrorListener(mOnErrorListener);

5.创建推流事件监听

private IStreamer.OnInfoListener mOnInfoListener = 
new IStreamer.OnInfoListener() { 
    @Override 
    public void onInfo(int what, int msg1, int msg2) { 
        //...设置 Info 回调 
        } 
    };
private IStreamer.OnErrorListener mOnErrorListener = 
new IStreamer.
    OnErrorListener() { 
    @Override 
    public void onError(int what, int msg1, int msg2) { 
        //...设置错误回调 
    }
};

6.主要方法

//推流地址
mStreamer. setUrl(String url);

//音频采样率
mStreamer. setAudioSampleRate(int bitrate);

//音频ChannelNumber
void setAudioChannels(int num);

//旋转角度
void setRotateDegrees(int degrees);

//相机查看器
mStreamer. setDisplayPreview(GLSurfaceView surfaceView);

//设置滤镜
mStreamer. setFilter(int beautyFilter);

//静音
mStreamer. setMuteAudio(boolean isChecked);


//耳返
mStreamer. setEnableAudioPreview(boolean isChecked);

//最大关键帧间隔
mStreamer. setIFrameInterval(float videoFPS);

//开始背景音乐播放
mStreamer. startBgm(String path, boolean loop);

//停止背景音乐播放
mStreamer. stopBgm();

//开始摄像头预览
mStreamer. startCameraPreview();

//停止摄像头预览
mStreamer. stopCameraPreview();

//是否录制中
mStreamer. isRecording();

//开启推流统计功能
mStreamer. setEnableStreamStatModule(boolean var1);

//离屏推流 不设置预览view
mStreamer.setOffscreenPreview(int width, int height);

//开始视频录制
mStreamer.startRecord(String recordUrl);

//结束视频录制
mStreamer.stopRecord();

//设置编码场景模式
mStreamer.setVideoEncodeScene(int encodeScene);

// 设置编码性能档次
mStreamer.setVideoEncodeProfile(int encodeProfile);

//若设置为true,则使用MediaPlayer播放背景音乐,可以播放本地音频和流媒体文件;
//若设置为false,则使用KSYBgmPlayer播放背景音乐,只能播放本地音频
mStreamer.setEnableMediaPlayer(boolean isEnabled);


//若使用MediaPlayer,设置音量接口,两个参数分别代表左右声道,需要设置为相同的值
//取值范围:0.0f~2.0f
mStreamer.setVolume(float vol1, float vol2);

//若使用KSYBgmPlayer播放背景音乐,设置音量接口
//取值范围:0.0f~1.0f,>1.0f后增大音量,但是会有噪音,经过测试最大最好不要超//过4.0f,否则效果不佳
mStreamer.setVolume(float vol);

//mute背景音乐
mStreamer.setMute(boolean bool);

//是否前置摄像头
mStreamer.isFrontCamera();


//设置美颜滤镜出错时的监听
setFilterOnErrorListener(ImgFilterBase.OnErrorListener listener);
`2.1.2版本之后,此方法修改为`
setFilterOnErrorListener(ICNImgFilterBase.OnErrorListener listener);

7.开始推流

mStreamer.startStream(activityConfig);
//在此之前需要调用setUrl(url)设置推流地址
mStreamer.startStream();
//如果服务器已经创建完成直播活动,则可以直接调用此方法,传入活动ID以及推流地址,即可开始直播活动。
mStreamer.startActivity(String activityId, String url)

8.推流开始前及推流过程中可动态设置的常用方法

// 切换前后摄像头
mStreamer.switchCamera();
// 开关闪光灯
mStreamer.toggleTorch(true);

// 设置美颜滤镜,关于美颜滤镜的具体说明请参见专题说明
mStreamer.getImgTexFilterMgt().setFilter(mStreamer.getGLRender(),ImgTexFilterMgt.BEAUTY_DENOISE);
`2.1.2版本后,此方法改为`
mStreamer.getImgTexFilterMgt().setFilter(mStreamer.getGLRender(), CN_FILTER_BEAUTY_DENOISE.getFilter());

9.停止推流

mStreamer.stopStream();

10.Activity 的生命周期回调处理

采集的状态依赖于 Activity 的生命周期,所以必须在 Activity 的生命周期中也调用 SDK 相应的接口。
public class StreamActivity extends AppCompatActivity {
    // ... 
    @Override
    public void onResume() {
        super.onResume();
        // 一般可以在 onResume 中开启摄像头预览
        mStreamer.startCameraPreview();
        // 调用 Streamer 的 onResume 接口
        mStreamer.onResume();
        }
    @Override
    public void onPause() {
        super.onPause();
        mStreamer.onPause();
        // 一般在这里停止摄像头采集
        mStreamer.stopCameraPreview();
        }
    @Override
    public void onDestroy() {
        super.onDestroy();
        // 清理相关资源
        mStreamer.release();
        }
}

11 .设置推流参数(注意:必传参数为 activityId、channelId)

ActivityConfig activityConfig = new ActivityConfig() {
    @Override
    public String getActivityID() {
    //活动 ID,确保 SP 下的唯一性(即 appId 唯一) ,不能含下划线,
    //不支持转义字符和rlencode   会处理的特殊字符,
    //如下# $ % & ‘( )* + , . / : ; = ? @ [ / ]
    return activityId;
    }
    @Override
    public String getActivityName() {
        //活动名称
        return "";
    }
    @Override
    public int getActivityStatus() {
        //活动状态,0:未开始 /1:已开始 /2:已结束
        // /3 已下线,默认为 0
        return 0;
    }
    @Override
    public int getIsHorizontalScreen() {
        //屏幕方向,0:垂直即竖屏 /1:水平即横屏 ,默认为 1
        return isHorizontalScreen;
    }
    @Override
    public String getChannelID() {
    //播放通道;PGC 业务:平台分配/UGC 业务:主播 ID 生成,
    //确保 SP 下的唯一性,不能含下划线,
    //不支持转义字符和 urlencode 会处理的特殊字符,
    //如下! # $ % & ‘ ( )* + , . / : ; = ? @ [ / ]
    return channelId;
    }
    @Override
    public String getCoverImgUrl() {
        //活动封面
        return "";
    }
    @Override
    public String getActivityCategory() {
        //活动分类 ID
        return "";
    }
    @Override
    public String getExtensions() {
        //扩展字段,
        //参数格式为 Map 对象的 Json 字符串(主播昵称、头像)
        return "";
    }
    @Override
    public String getUuid() {
        //设备 ID
        return "";
    }
    @Override
    public String getCallbackAcitvityStatushttpPostUrl() {
        //回调通知活动状态(错误,结束、心跳异常等状态)
    return "";
    }
};