android直播功能实现,Android视频直播功能实现流程

视频直播场景的主要结构及流程如下图所示:

140722251_1_20180808105042139

请注意:

除了上述基本功能,开发者如果想使用 ZegoLiveRoom SDK 实现更高级的功能,例如混音、音频录制、外部滤镜等,请直接参考 互动视频-高级功能指南,本文不再赘述。

为了便于开发者更快理解 LiveDemo5 中的逻辑,下述每节会将功能核心源码片段挑出来并加以讲解。开发者亦可直接阅读 LiveDemo5 源码,两者是一致的。

1 单主播直播

单主播直播时,一个房间内仅有一个主播,不支持主播与观众的连麦互动。单主播模式下,发布直播时,需要声明 mPublishFlag 为 ZegoConstants.PublishFlag.SingleAnchor。

1.1 主播推流

主播向观众推送自己的画面,需先推流(即发布直播)。如何使用 SDK 实现推流请参考:初级功能指南-推流

LiveDemo5 中推流相关源码片段演示如下,仅供参考:

// SingleAnchorPublishActivity.java

@Override

protected void doBusiness(Bundle savedInstanceState) {

super.doBusiness(savedInstanceState);

mRoomID = ZegoRoomUtil.getRoomID(ZegoRoomUtil.ROOM_TYPE_SINGLE);

// 登录房间

mZegoLiveRoom.loginRoom(mRoomID, mPublishTitle, ZegoConstants.RoomRole.Anchor, new IZegoLoginCompletionCallback() {

@Override

public void onLoginCompletion(int errorCode, ZegoStreamInfo[] zegoStreamInfos) {

if(errorCode == 0){

handleAnchorLoginRoomSuccess(zegoStreamInfos);

}else {

handleAnchorLoginRoomFail(errorCode);

}

}

});

// 设置推流相关回调

mZegoLiveRoom.setZegoLivePublisherCallback(new IZegoLivePublisherCallback() {

@Override

public void onPublishStateUpdate(int stateCode, String streamID, HashMap streamInfo) {

//推流状态更新

if (stateCode == 0) {

handlePublishSucc(streamID, streamInfo);

} else {

handlePublishStop(stateCode, streamID);

}

}

@Override

public void onJoinLiveRequest(final int seq, String fromUserID, String fromUserName, String roomID) {

}

@Override

public void onPublishQualityUpdate(String streamID, ZegoStreamQuality streamQuality) {

// 推流质量回调

handlePublishQualityUpdate(streamID, streamQuality.quality, streamQuality.videoFPS, streamQuality.videoBitrate);

}

@Override

public AuxData onAuxCallback(int dataLen) {

return handleAuxCallback(dataLen);

}

@Override

public void onCaptureVideoSizeChangedTo(int width, int height) {

}

@Override

public void onMixStreamConfigUpdate(int errorCode, String streamID, HashMap streamInfo) {

}

});

// 设置房间回调

mZegoLiveRoom.setZegoRoomCallback(new IZegoRoomCallback() {

@Override

public void onKickOut(int reason, String roomID) {

}

@Override

public void onDisconnect(int errorCode, String roomID) {

handleDisconnect(errorCode, roomID);

}

@Override

public void onStreamUpdated(final int type, final ZegoStreamInfo[] listStream, final String roomID) {

if (listStream != null && listStream.length > 0) {

switch (type) {

case ZegoConstants.StreamUpdateType.Added:

handleStreamAdded(listStream, roomID);

break;

case ZegoConstants.StreamUpdateType.Deleted:

handleStreamDeleted(listStream, roomID);

break;

}

}

}

@Override

public void onStreamExtraInfoUpdated(ZegoStreamInfo[] zegoStreamInfos, String s) {

}

@Override

public void onRecvCustomCommand(String userID, String userName, String content, String roomID) { </

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一: 使用javacv来实现,最终也是用过ffmpeg来进行编码和推流,javacv实现到可以直接接收摄像头的帧数据 需要自己实现的代码只是打开摄像头,写一个SurfaceView进行预览,然后实现PreviewCallback将摄像头每一帧的数据交给javacv即可 javacv地址:https://github.com/bytedeco/javacv demo地址:https://github.com/beautifulSoup/RtmpRecoder/tree/master 二: 使用Android自带的编码工具,可实现硬编码,这里有一个国内大神开源的封装很完善的的库yasea,第一种方法需要实现的Camera采集部分也一起封装好了,进行一些简单配置就可以实现编码推流,并且yasea目前已经直接支持摄像头的热切换,和各种滤镜效果 yasea地址(内置demo):https://github.com/begeekmyfriend/yasea 服务器 流媒体服务器我用的是srs,项目地址:https://github.com/ossrs/srs 关于srs的编译、配置、部署、在官方wiki中已经写的很详细了,并且srs同样是国内开发人员开源的项目,有全中文的文档,看起来很方便 这里有最基本的简单编译部署过程 Android直播实现(二)srs流媒体服务器部署 播放器 android端的播放使用vitamio,还是国内的开源播放器,是不是感觉国内的前辈们越来越屌了^~^! vitamio支持几乎所有常见的的视频格式和流媒体协议 vitamio地址(内置demo):https://github.com/yixia/VitamioBundle 这里使用的是yaesa库,先介绍一下直播实现流程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值