1. SDK概述

GotyeLiveSDK是一套完整的视频直播SDK产品,含有以下五个模块:

  1. GotyeLiveCore
    • 亲加视频直播SDK的基础模块,包含了各个模块所必需的接口实现,在集成其它模块之前都需要先把GoteLiveCore集成到项目中
  2. GotyeLiveChat
    • 聊天室模块实现了用户在聊天室内收发消息的功能
  3. GotyeLivePlayer
    • 播放器模块实现了在手机端观看视频直播的功能
  4. GotyeLivePublisher
    • 直播模块实现了在手机端进行视频直播的功能
  5. GotyeLivePeerConnection
    • 连麦模块实现了主播与用户实时视频聊天直播功能

除了GotyeLiveCore模块是必须的之外,其余模块开发者可以根据实际需求进行选择。文档接下来的部分将会对各个模块的进行详细说明。

除了GotyeLiveCore模块是必须的之外,其余模块开发者可以根据实际需求进行选择。文档接下来的部分将会对各个模块的进行详细说明。

目前SDK最低只支持Android 4.0

2. 集成步骤

  1. 集成GotyeLiveCore
  2. 集成相应模块
    集成步骤

3. GotyeLiveCore 集成

亲加视频直播SDK的基础模块,包含了各个模块所必需的接口实现,在集成其它模块之前都需要先把GoteLiveCore SDK集成到项目中。

3.1 集成步骤

  1. 在项目中引入gotyelive-core.jar以及libGotyeLiveCore.so
  2. 添加权限:

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
    

3.2 初始化SDK

在Application的onCreate中添加SDK初始化方法:

  GLCore.registerApp(this, "后台账号appkey", "后台账号accessSecret", "后台账号公司唯一标示");

初始化只需要在程序启动时初始化一次即可。

3.3 创建session

在调用其它功能接口之前,需要先验证roomId以及密码 注:如无特别说明,回调的block都是在主线程中运行的。

GLRoomSession roomSession = GLCore.createSession(this, roomId, pwd, nickname, RoomIdType.GOTYE); 

//也可以使用下面这种方式创建
/*
GLRoomSession roomSession = new GLRoomSession(); 
roomSession.setRoomId(roomId);
roomSession.setPwd(password);
roomSession.setNickName(nickaname);
roomSession.setRoomIdType(type);
*/

//创建后需要调用session的验证接口进行验证
roomSession.auth(new GLRoomSession.Callback<AuthToken>() {
    @Override
    public void onFinish(int code, AuthToken object) {
        if (code == Code.SUCCESS) {
            //验证成功
        } else {
            //验证失败
        }
    }
});

注:如无特别说明,回调的block都是在主线程中运行的。

3.4 销毁session

当用户退出房间时,不再需要session的时候,应该调用销毁session的接口清除验证信息。

GLCore.destroySession(roomSession);

3.5 查询直播详情

在SDK中,一个session是对应一个直播房间的,当验证通过后,可以通过session获取到直播房间的信息。

roomSession.getLiveContext(new GLRoomSession.Callback<LiveContext>() {
    @Override
    public void onFinish(int code, LiveContext object) {
        if (code == Code.SUCCESS) {
            //查询成功
        } else {
            //查询失败
        }
    }
});

返回的直播详情中一共有三个信息,1.当前直播间的观看人数,2.当前直播间的直播状态,3.当前直播停止状态;

/**
 * 获取当前直播状态
 * @return  当前直播状态。1-直播中 0-直播停止
 */
public int getRecordingStatus();

/**
 * 获取当前直播停止状态
 * @return  当前直播状态。0-异常停止, 1-正常停止, 2-重连时停止,3-来电停止 4-用户自定义停止状态
 */
public int getStopType();

/**
 * 获取当前播放视频人数
 * @return  当前播放视频人数
 */
public int getPlayUserCount();

3.6 查询H5地址

每个直播间中还配备了对应的H5地址,包括直播观看地址以及课件地址。

/**
 * 获取课件观看地址
 * @return  课件观看地址。可嵌入webview中观看课件
 */
public String getModVisitorShareUrl();
/**
 * 获取直播观看地址
 * @return  直播观看地址。可用于分享
 */
public String getEducVisitorUrl();

//查询H5地址
roomSession.getClientUrl(new GLRoomSession.Callback<ClientUrl>() {
    @Override
    public void onFinish(int code, ClientUrl object) {
        if (code != Code.SUCCESS)
            //获取失败
            return;

        //获取成功
    }
});

3.7 释放资源

roomSessoin.release();

当不再需要当前实例时,需要调用上述接口,才能被正确释放内存。需要注意的是,释放之后就不能再调用其它该对象的方法了,否则会导致异常

3.8 错误码说明

错误码描述详见

com.gotye.live.core.Code

错误码 | 描述
----- | -----
200 | 成功
401 | 验证失败,或者是没有验证成功的情况下调用了别的接口
-101 | 被取消
-102 | 网络错误
-103 | 获取服务器地址失败

4. 聊天室集成

GotyeLiveChat为聊天模块;实现了用户在聊天室内收发消息的功能。

4.1 集成步骤

  1. 集成GotyeLiveCore(如已集成略过这一步)。
  2. 在项目中引入gotyelivechat.jar

4.2 初始化SDK

聊天室是与直播间绑定的,因此创建聊天室session对象时需要一个GLRoomSession

chatSession = new GLChatSession(roomSession);
//添加回调监听
chatSession.addObserver(this);

4.3 登录聊天室

chatSession.login(new Ack<LoginAck>() {
    @Override
    public void ack(LoginAck loginAck) {
        if (loginAck.getCode() == Code.SUCCESS) {
            //登录聊天服务器成功
            //这个消息发送是为了兼容亲加自己的H5观看页面,表示进入聊天室的通知。
            chatSession.sendNotify("enter", null);
        } else {
            //登录聊天服务器失败
        }
    }
});

如果登录失败的话,SDK不会自动重连。但是如果在登录成功的情况下因为网络的问题或者其它问题导致的掉线,SDK底层会自动进行重连,直到登录成功或者开发者主动调用了 chatSession.logout()退出聊天室。

4.4 接收/发送消息

SDK目前只支持纯文本内容的发送,但是消息的格式是可以自定义的,换句话说,只要使用合适的格式,开发者是很容易就能够实现红包、点赞诸如此类的功能的。

/**
 * 获取消息状态
 * @return  消息状态
 */
public int getStatus();
/**
 * 获取具体的消息类型
 * @return  具体的消息类型
 */
public MessageType getMessageType();
/**
 * 获取接收者账号
 * @return  接收者账号。当接收者为当前聊天室时,返回null
 */
public String getRecvId();
/**
 * 获取接收者昵称
 * @return  接收者昵称。当接收者为当前聊天室时,返回null
 */
public String getRecvNickname() {
    return recvNickname;
    }
/**
 * 获取消息具体内容
 * @return  消息具体内容
 */
public String getText();
/**
 * 获取消息额外附加字段
 * @return  消息额外附加字段
 */
public String getExtra();
/**
 * 获取发送者账号
 * @return  发送者账号
 */
public String getSenderId();
/**
 * 获取发送者昵称
 * @return  发送者昵称
 */
public String getSenderNickname() {
    return senderNickname;
}

Message message = new TextMessage();
message.setStatus(0);
message.setText(text);

chatSession.sendMessage(message, new Ack<SendMsgAck>() {
    @Override
    public void ack(SendMsgAck data) {
        if (data.getCode() == Code.SUCCESS) {
            //发送成功
            message.setStatus(1);
        } else {
            //发送失败
            message.setStatus(2);
        }

    }
});


如果只是简单的发送文本消息,可以调用以下接口:


chatSession.sendText("text", new Ack<SendMsgAck>() {
    @Override
    public void ack(SendMsgAck data) {
        if (data.getCode() == Code.SUCCESS) {
            //发送成功
        } else {
            //发送失败
        }
    }
});

    });

4.5 退出聊天室

需要退出登录时,可调用

 只需要简单调用

chatSession.logout();

4.6 获取聊天室人数

需要登录成功才能获取当前聊天室人数

chatSession.getRoomMemberCount(new Ack<GetMemberCountAck>() {
    @Override
    public void ack(GetMemberCountAck data) {
        if (data.getCode() == Code.SUCCESS) {
            //查询成功
        } else {
            //查询失败
        }
    }
});

4.7 回调通知

登录成功后,聊天室相关的状态通知都是通过com.gotye.live.chat.ChatObserver以回调的方式通知调用者的。

public interface ChatObserver {
    /**
     * 聊天服务器断开
     * @param chatSession    对应的会话
     */
    void onDisconnected(GLChatSession chatSession);

    /**
     * 聊天服务器重新登录成功
     * @param chatSession    对应的会话
     */
    void onReloginSuccess(GLChatSession chatSession);

    /**
     * 正在重新登录聊天服务器
     * @param chatSession    对应的会话
     */
    void onRelogining(GLChatSession chatSession);

    /**
     * 聊天服务器重新登录失败
     * @param chatSession    对应的会话
     */
    void onReloginFailed(GLChatSession chatSession);

    /**
     * 账号在别的地方登录,被强制踢出
     * @param chatSession    对应的会话
     */
    void onForceLogout(GLChatSession chatSession);

    /**
     * 收到聊天室中的消息
     * @param chatSession   对应的会话
     * @param message       消息的具体内容
     *                      @see Message
     */
    void onReceiveMessage(GLChatSession chatSession, Message message);
    }

4.8 释放资源

chatSession.release();

当不再需要当前实例时,需要调用上述接口,才能被正确释放内存。需要注意的是,释放之后就不能再调用其它该对象的方法了,否则会导致异常。

4.9 错误码说明

错误码描述详见 com.gotye.live.chat.Code

错误码 | 描述
----- | -----
200 | 失败
300 | 失败
401 | 验证失败
403 | 无效角色,只有聊天室role可以登录
500 | 系统异常
1001 | 无操作权限
1003 | 已被禁言
1005 | 消息内容和附加字段都为空
1007 | 无效TARGET_ID
1009 | 已经被禁止登陆
-102 | 网络错误
-103 | 当前没有登录
-105 | 获取服务器地址失败

5. 播放器模块

GotyeLivePlayer为播放器模块。实现了在聊天室内观看当前直播视频的功能。

5.1 集成步骤

  1. 集成基础模块(如已集成略过这一步)。
  2. 在项目中引入gotyelive-player.jarlibGotyeLivePlayer.so

5.2 初始化SDK

与直播间绑定:

player = new GLRoomPlayer(roomSession);
//设置回调
player.setListener(this);

5.3 设置视频画面的显示模式

默认情况下,视频画面中,视频会按照分辨率比例自动撑满屏幕的某一边,如果需要改变其显示方式,SDK提供了以下接口

/**
 * 视频会按照原有比例自动撑满屏幕的某一边
 */
public static final int SCREEN_FIT = 0; // 自适应
/**
 * 视频会铺满整个屏幕,但比例有可能被拉伸
 */
public static final int SCREEN_STRETCH = 1; // 铺满屏幕
/**
 * 视频在保持比例的情况下铺满整个屏幕,视频有可能被裁切调一部分
 */
public static final int SCREEN_FILL = 2; // 放大裁切
/**
 * 视频会按照原始大小显示
 */
public static final int SCREEN_CENTER = 3; // 原始大小

//设置显示模式
surfaceView.setDisplayMode(GLSurfaceView.SCREEN_FILL);

5.4 播放视频

/**
 * 设置视频渲染视图
 *
 * @param surfaceView 需要设置的视频渲染视图。视频画面将会撑满这个视图
 */
player.setSurfaceView(surfaceView);
//开始播
player.play();

SDK会验证当前roomSession的有效性,如果没有验证成功,播放会失败;如果当前直播间没有直播,播放也会失败,但是SDK会去定时获取直播状态,当检测到直播开始后,会自动开始播放。

5.5 重连

如果播放失败了或者播放过程中出现了什么问题导致播放中断,SDK都会自动进行重连(直播间结束直播了除外),直到重新播放成功或者调用了player.stop()为止。

目前SDK的设定是如果当前正在播放,app切换到后台时视频播放会自动停止,但是音频播放还会继续。切换回前台后自动开始播放视频。

如果需要在app切到后台停止播放,可以调用

player.onStop();

在app切换回前台时

player.onResume();

这样播放器会自动尝试重连。

5.6 选择视频清晰度

默认情况下视频播放的清晰度是VideoQuality.Original,也就是推流端发布的是什么清晰度的视频,观看端看到的就是什么清晰度。如果当前直播间的配置没有接口希望选择的清晰度,那么会由高到底选择一个最高的清晰度进行播放。具体播放的清晰度可以通过判断 player.getVideoQuality() 的值得到。

//如果希望切换的清晰度与当前清晰度相等,那么这个接口不会做任何事情
player.setVideoQuality(videoQuality)

5.7 切换cdn播放地址

如果直播间配置了多cdn地址,那么在当前地址播放失败时,SDK默认情况下会在重连的时候尝试使用另一个播放地址进行播放,一直循环选择地址列表中的配置直到播放成功或者调用了player.stop()为止。如果希望手动进行切换,可以通过设置

player.setAutoSwitchPlayUrl(false);

来禁用自动切换。并手动调用

//如果当前播放器是停止状态或者当前房间没有配置多cdn地址,那么返回NO。切换成功返回YES
player.switchToNextPlayUrl();

来切换播放地址。

5.8 结束播放

当不需要继续监听直播间状态或者不需要播放的时候,记得调用停止播放的接口

player.stop();

5.9 获取播放器状态

SDK提供了获取当前播放器的连接时间、播放码率、视频缓冲队列的大小、音频缓冲队列的大小以及播放延时的接口

/**
 * 获取播放器当前的码率,单位为kbps
 * @return 播放器当前的码率
 */
public int getBps();

/**
 * 获取最新一次连接所花费的时间,单位为毫秒
 * @return  如果连接成功,返回连接服务器所花费的时间;如果连接失败或者还未连接成功返    回0
 */
public int getConnectionTime();

/**
 * 获取本地已经缓存的视频帧队列大小
 * @return 视频帧的队列大小。0表示当前没有视频可以进行播放
 */
public int getNumOfVideoBuffer();

/**
 * 获取本地已经缓存的音频帧队列大小
 * @return 音频帧的队列大小。0表示没有音频可以进行播放
 */
public int getNumOfAudioBuffer();

/**
 * 获取当前视频延时,单位为毫秒。
 * 该延时的计算方法为,视频开始播放时记录一个本地时间,然后根据本地时钟得到的时长减去    视频播放的时长,即为该延时。
 * 有可能为负值。
 * @return 当前视频延时
 */
public int getDelay();

以上的信息是1秒钟更新一次,当有更新时回调onPlayerStatusUpdate会被调用。

5.10 设置静音

//true表示静音,false表示不静音
player.setMute(true);

设置静音后本地将听不到直播的声音。

5.11 接受连麦互动邀请

    player.acceptInvitation();

5.12 拒绝连麦互动邀请

    player.denyInvitation();

5.13 结束连麦互动

    player.endPeerConnection();

5.14 回调通知

public interface Listener {
    /**
     * 播放器断开
     * @param player    对应的player实例
     */
    void onPlayerDisconnected(GLPlayer player);

    /**
     * 播放器正在重新连接
     * @param player    对应的player实例
     */
    void onPlayerReconnecting(GLPlayer player);

    /**
     * 播放器成功开始播放视频
     * @param player    对应的player实例
     */
    void onPlayerConnected(GLPlayer player);

    /**
     * 播放器发生错误
     * @param player    对应的player实例
     * @param errorCode 错误的类型
     *                  @see Code
     */
    void onPlayerError(GLPlayer player, int errorCode);
    /**
     * 播放器状态更新的回调,1秒钟回调1次。包括bps、numOfVideoBuffer、   numOfAudioBuffer和delay属性的更新
     * @param player    对应的player实例
     */
    void onPlayerStatusUpdate(GLPlayer player);
}

除了上面所列的回调之外,还有关于直播状态和互动连线的回调

/**
 * 在原有播放器状态回调的基础上增加了直播状态更改和互动连线的回调
 * @see GLPlayer.Listener
 */
public interface Listener extends GLPlayer.Listener {
    /**
     * 直播状态改变的回调
     * @param player    对应的player实例
     * @param state     改变之后的直播状态
     *                  @see LiveState
     */
    void onLiveStateChanged(GLRoomPlayer player, LiveState state);
/**
 * 对方发起连麦邀请的回调
 * @param player   对应的player实例
 * @param sendId   对方用户ID
 * @param sendName 对方用户昵称
 */
void onPConnectEventInviteCallback(GLPlayer player, String sendId, String sendName);

/**
 * 发送完接受事件的回调
 * @param code   对应的发送是否成功的code
 */
void onPConnectSentAcceptEventCallback(int code);

/**
 * 对方发起结束连麦消息的回调
 */
void onPConnectEventEndCallback();

} @end

5.15 释放资源

player.release();

当不再需要当前实例时,需要调用上述接口,才能被正确释放内存。需要注意的是,释放之后就不能再调用其它该对象的方法了,否则会导致异常

5.16 错误码说明

错误码描述详见com.gotye.live.player.Code

错误码 | 描述
----- | -----
200 | 成功
300 | 失败
401 | 验证失败
-101 | 获取直播状态失败
-102 | 网络错误
-103 | 获取直播url失败
-104 | 直播未开始

6. 发布端集成

GotyeLivePublisher为视频发布模块。实现了主播账号在聊天室内直播视频的功能。

6.1 集成步骤

  1. 集成【基础模块(gotyelivecore)】(如已集成略过这一步)
  2. 在项目中引入gotyelive-publisher.jarlibGotyeLivePublisher.so
  3. 添加权限

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    

6.2 初始化SDK

添加SDK初始化方法

 publisher = new GLRoomPublisher(roomSession);
 //设置回调
 publisher.setListener(this);

6.3 开启预览

在开启直播之前,需要先打开摄像头,开启预览

publisher.startPreview(videoView, isFront, new  GLRoomPublisher.PreviewCallback() {
    @Override
    public void onCameraOpen(boolean success, boolean isFront) {
        Log.d(TAG, "onCameraOpen " + success + " isFront " + isFront);
    }
});

注:摄像头的方向是与Activity的方向一致的。

6.4 开始直播

直播之前需要先登录直播间

publisher.login(force, new GLRoomPublisher.Callback() {
    @Override
    public void onCallback(int status) {
        if (status == Code.OCCUPIED) {
            //当前账号已经有人登陆
        } else if (status == Code.SUCCESS) {
            //登录成功
        } else {
            //其它错误
        }
    }
});

其中force参数代表如果当前已经有主播登录了该直播间,是否强制踢出当前登录的主播。
如果force的值是NO,并且当前直播间已经有主播登录了,那么登录会失败并返回相应的状态码。
如果强制踢出当前登录的主播,被踢的那一端会收到通知onPublisherForcelogout

如果登录成功,那么直接调用下面的接口就可以开始直播了

publisher.publish();

推流过程中如果出现了中断的情况,那么SDK底层会自动进行重连,直到重连成功或者手动调用了 publisher.unpublish()或者publisher.stop()为止。

默认情况下,直播出去的视频分辨率为640x360,码率为200kbps,滤镜效果为正常模式,也就是没有使用滤镜。

6.5 结束直播

publisher.unpublish();

调用这个接口只会断开推流端与服务器的连接,并不会停止本地的预览。如果需要停止预览并释放资源,请调用

publisher.stop();

调用这个接口还会退出直播间的登录。

6.6 设置视频参数

SDK中内置了几种默认的配置

public enum VideoPreset {
    /**
     * 自定义类型,可以任意设置分辨率、码率以及帧率
     */
     VideoPresetCustom(),
//16:9
/**
 * 分辨率为480*272,码率480kbps,帧率20fps。
 * 该类型不可修改具体参数。如需修改请使用{@link #VideoPresetCustom}
 */
VideoPreset480x272(480, 272, 480, 20),
/**
 * 分辨率为640*360,码率640kbps,帧率20fps。
 * 该类型不可修改具体参数。如需修改请使用{@link #VideoPresetCustom}
 */
VideoPreset640x360(640, 360, 640, 20),
/**
 * 分辨率为854*480,码率720kbps,帧率20fps。
 * 该类型不可修改具体参数。如需修改请使用{@link #VideoPresetCustom}
 */
VideoPreset854x480(854, 480, 720, 20),

//4:3
/**
 * 分辨率为320*240,码率480kbps,帧率20fps。
 * 该类型不可修改具体参数。如需修改请使用{@link #VideoPresetCustom}
 */
VideoPreset320x240(320, 240, 480, 20),
/**
 * 分辨率为640*480,码率640kbps,帧率20fps。
 * 该类型不可修改具体参数。如需修改请使用{@link #VideoPresetCustom}
 */
VideoPreset640x480(640, 480, 640, 20),
/**
 * 分辨率为768*576,码率720kbps,帧率20fps。
 * 该类型不可修改具体参数。如需修改请使用{@link #VideoPresetCustom}
 */
VideoPreset768x576(768, 576, 720, 20);

}
开发者可以选择当中的一种作为视频的参数设置

publisher.videoPreset = VideoPreset.VideoPreset640x360;

也可以自己定义

VideoPreset preset = VideoPreset.VideoPresetCustom;
preset.setBps(600);
preset.setFps(20);
preset.setVideoWidth(320);
preset.setVideoHeight(640);
publisher.setVideoPreset(preset);

有几点需要注意:

  • 这个参数实际上改变的是视频的预览参数。由于摄像头支持的预览分辨率有限,有可能不支持设置中的分辨率比例,这时候会尽可能的找出比例相近的并且与设置的高度之差最小的分辨率。如果比例都相差很大,那SDK会选取相机中与设置的高度之差最小的分辨率。
  • 视频的预览分辨率就是最终往服务器发送的视频数据的分辨率
  • 码率的设置是最大值的设置,码率过低容易导致画面模糊,特别是当画面抖动的时候。
  • 需要在直播开始前就设置,如果当前正在直播,那么设置会在下次直播才生效。
  • 预设值中,除了Custom类型可以自由设置分辨率、码率以及帧率之外,其它几个类型的只能改变默认的码率与帧率

6.7 设置预览画面的显示模式

默认情况下,预览画面中,视频会按照摄像头的分辨率比例自动撑满屏幕的某一边,如果需要改变其显示方式,SDK提供了以下接口

//GLVideoView.java
/**
 * 视频会按照原有比例自动撑满屏幕的某一边
 */
public static final int SCREEN_FIT = 0;
/**
 * 视频会铺满整个屏幕,但比例有可能被拉伸
 */
public static final int SCREEN_STRETCH = 1;
/**
 * 视频在保持比例的情况下铺满整个屏幕,视频有可能被裁切调一部分
 */
public static final int SCREEN_FILL = 2;
/**
 * 视频会按照原始大小显示
 */
public static final int SCREEN_CENTER = 3;

//设置显示模式
videoView.setDisplayMode(GLVideoView.SCREEN_FILL);

6.8 设置滤镜

SDK目前提供了两种模式的美颜滤镜。普通模式下只是简单的做了磨皮处理; 增强模式除了磨皮之外,还有美白、高光、边缘检测等功能,效果比较自然,但对机器性能要求也比较高。开发者可以根据实际需求自行选择;

  /**
    * 打开/关闭美颜滤镜(普通模式,带磨皮功能)
    * @param enabled   {@code true}表示打开滤镜,{@code false}表示关闭
    * @param highQuality   {@code true}表示使用高质量美颜算法(系统开销大),{@code false}表示使用普通美颜算法模式
   */
      public void enableBeautify(boolean enabled, boolean highQuality)

     //设置滤镜
     publisher.enableBeautify(true, true);
    //关闭滤镜
     publisher.enableBeautify(false, true);

如果需要调整效果的强弱,可以通过以下接口

//最小值是0,最大值是1。数值越大滤镜的效果越强。默认值为0.3
publisher.setBeautifyValue(0.3);

对滤镜的设置是实时生效的。

6.9 设置水印

SDK支持图片水印以及文字水印的设置,但两者只能选其一,不能同时设置。

    /**
     * 设置图片水印
     * @param bitmap 水印位图文件
     * @param left 水印距离编码图像左侧偏移像素
     * @param top 水印距离编码图像顶部偏移像素
     * @param width 水印宽度(单位 像素)
     * @param height 水印高度(单位 像素)
     *
     */
    public void setWatermark(Bitmap bitmap, int left, int top, int width, int height);
    /**
     * 设置文字水印
     * @param text 文字内容
     * @param textsize 文字字体大小
     * @param left 文字区块距离编码图像左侧偏移像素
     * @param top 文字区块距离编码图像顶部偏移像素
     * @param width 文字区块宽度(单位 像素)
     * @param height 文字区块高度(单位 像素)
     *
     */
    public void setText(String text, int textsize, int left, int top, int width, int height);

补充说明:

  • 文字水印暂不支持设置文字颜色,当前默认为白色
  • 参数中的left、top、width以及height都是相对值,相对于实际分辨率的大小
  • 水印设置只支持Android 4.3以上,4.3以下设置水印没有任何效果

6.10 切换摄像头

publisher.switchCamera();

当前使用的是前置摄像头时,会切换到后置摄像头。是后置摄像头则切换到前置摄像头。切换摄像头不会改变视频的输出分辨率。

6.11 闪光灯控制

开启摄像头后,可通过调用以下接口来尝试打开/关闭闪光灯。摄像头开启之前设置闪光灯的状态是不起任何作用的。

//打开闪光灯
publisher.enableTorch(true);
//关闭闪光灯
publisher.enableTorch(false);

当摄像头为前置摄像头时,打开闪光灯会失败,isTorchOn()的值将不会改变。所以当尝试打开闪光灯时,应该通过isTorchOn()的值来判断闪光灯是否打开成功。

6.12 设置静音

//关闭麦克风
publisher.setMute(true);
//打开麦克风
publisher.setMute(false);

设置静音后,所有收看当前直播的观众将听不到主播的声音。

6.13 获取推流端状态

SDK提供了获取当前推流端的连接时间、推流码率以及当前网络队列缓存大小的接口

/**
 * 获取当前的推流码率
 * @return  当前的推流码率,单位kbps
 */
public int getBps();

/**
 * 获取当前队列缓冲数据大小
 * @return 当前队列缓冲数据大小,单位byte
 */
public int getBufferingSize();

/**
 * 获取当前推流端的服务器连接时间
 * @return  当前推流端的服务器连接时间,单位毫秒
 */
public int getConnectionTime();

以上的信息是1秒钟更新一次,当有更新时回调onPublihserStatusUpdate会被调用。

6.14 设置直播房间状态

设置房间停止状态信息接口

    /**
     * 设置直播状态
     * @param status    设置的直播状态。1-直播中 0-直播停止
     *                  
     * @param stopType  直播中设置的停止状态。0-异常停止, 1-正常停止, 2-重连时停止,3-来电停止 4-用户自定义停止状态
     *                  
     * @param callback  收到服务器回应之后的回调。
     */
    public void setLiveStatus(LiveStatus status, LiveStopType stopType, final Callback<Void> callback);

6.15 保存直播录像

SDK还提供了保存直播录像的功能。

//将当时时间设为录像的起点。如果重复调用,那么会忽略上一次的时间点,将起点重置为当前时间。
publisher.beginRecording();

//将当前时间设置为保存直播录像的终点,并向服务器请求保存从起点到终点时间段的视频。
//如果时长小于两分钟,直接返回失败。
//如果没有调用过beginRecording,那么直接返回成功.
publisher.endRecording();

可用通过回调判断录像是否保存成功,保存成功的录像可以在亲加管理后台中找到。

6.16 邀请连麦互动

邀请音视频互动聊天

    /*
     * 邀请互动聊天
     * @param userId   被邀请者的用户id
    */
    public void inviteUser(String userId);

6.17 结束连麦互动

结束音视频互动聊天 publisher.endPeerConnection();

6.18 回调通知

public interface Listener {
    /**
     * 推流端断开
     * @param publisher 对应的推流端
     */
    void onPublisherDisconnected(GLPublisher publisher);
    /**
     * 推流端正在重连
     * @param publisher 对应的推流端
     */
    void onPublisherReconnecting(GLPublisher publisher);
    /**
     * 推流端连接成功
     * @param publisher 对应的推流端
     */
    void onPublisherConnected(GLPublisher publisher);
    /**
     * 推流端出错
     * @param publisher 对应的推流端
     */
    void onPublisherError(GLPublisher publisher, int errorCode);
    /**
     * 推流端状态更新的回调,1秒钟回调1次。包括bps、bufferingSize属性的更新
     * @param publisher 对应的推流端
     */
    void onPublihserStatusUpdate(GLPublisher publisher);
}

除了上面所列的回调之外,还有关于直播间登录状态和连麦互动的回调

public interface Listener extends GLPublisher.Listener {
    /**
     * 当前主播账号在另一设备登录,当前用户被踢出。这时候会中断当前设备的推流。
     * @param publisher
     */
    void onPublisherForcelogout(GLPublisher publisher);
/**
 * 对方响应接受连麦的回调
 */
void onPConnectEventAcceptCallback(String sendName);

/**
 * 对方响应拒绝连麦的回调
 */
void onPConnectEventDenyCallback(String sendName);

/**
 * 对方结束连麦的回调
 */
void onPConnectEventEndCallback();

}

6.19 释放资源

publisher.release();

当不再需要当前实例时,需要调用上述接口,才能被正确释放内存。需要注意的是,释放之后就不能再调用其它该对象的方法了,否则会导致异常

6.20 错误码说明

错误码描述详见

com.gotye.live.publisher.Code

错误码 | 描述
----- | -----
200 | 成功
401 | 验证失败,或者是没有验证成功的情况下调用了别的接口
1011 | 当前账号已经有人登录了
-101 | 当前已经有人在直播了
-102 | 网络断开
-103 | 获取当前直播状态出错
-104 | 无法获取摄像头,请检查权限
-105 | 获取直播Url出错
-106 | 当前状态无效
-107 | 用户未登录
-108 | 获取登录url失败
-109 | 录制时长过短(少于两分钟)
-999 | 异常情况

7. 连麦功能集成

GotyeLivePeerConnection为视频连麦通话模块功能。该模块主要实现场景为主播与用户的音视频互动,观看者可以实时观看交互的内容;连线的双方为主播和普通观看者,集成时需要绑定直播模块和播放器模块;

7.1 集成步骤

  1. 依赖所有直播的模块(包括基础模块,聊天室模块,播放器模块,直播模块);
  2. 在项目中引入gotyelive-peerconnection.jarlibGotyeLivePeerConnection.so
  3. 添加权限

          <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
          <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    

7.2 SDK初始化

当前视频通话模块绑定于其他直播模块一起使用,无法单独抽离出来使用; 对于主播端初始化,GLPeerClient传入当前的GLPublisher实例,播放端则为null;

    /**
      *  GLPeerClient构造函数
      *  @param publisher 当前的GLPublisher实例,播放端时为null;
      * @param hasVideo {@code true}表示打开video+audio;{@code false}表示只打开audio
      */
    PeerClient = new GLPeerClient(this, publisher, true);

    /**
      * 设置相应的监听回调。         
  */
    PeerClient.setListener(mListener);

对于播放端初始化,setView(mP2PView, false)需要显示本地视频渲染视图;主播端默认已经开启,所以设置为false;

     /**
       * 设置视频渲染视图
       *
       * @param surfaceView 需要设置的视频渲染视图。
       * @param initLocalRenderer {@code true}表示显示本地视频渲染视图;{@code false}表示不显示本地视频渲染视图。
       */
    public void setView(GLSurfaceView surfaceView, boolean initLocalRenderer)

7.3 连接视频通话房间

    /*
      * 连接视频通话房间
      * @param roomId 需要连接的房间ID;
      * @param userId 当前连接的用户ID
      */
    PeerClient.connectToRoom(roomId, userId);

7.4 断开视频通话房间

    PeerClient.disconnect();

7.5 释放资源

    PeerClient.release();

7.6 回调通知

    public interface OnPConnectionStateListener {
/*
 * 加入房间成功回调
 */
void onSuccessJoinedPConnectionRoom();

/*
 * 加入房间失败回调
 */
void onFailedJoinedPConnectionRoom(String errorMsg);

/*
 * 发生错误时的回调
 */
void onPConnectionError(String errorMsg);

/*
* 跟远端用户连接成功回调
* @param establish_time_msec   建立连接的时间
*/
void onP2PConnected(int establish_time_msec);

/*
 * 跟远端用户结束当前视频通话的回调
 */
void onP2PDisconnected();

}

8. 接口文档

相应的具体接口可以参考相应JavaDoc

返回顶部