概述

一直好奇直播软件源码这个东东是如何实现的,譬如音视频流是如何采集的? 音视频流是如何推送到订阅方 ? 如何支撑上万级、百万级用户同时观看直播 ?

功能设计

如上图所示为直播软件源码 Demo 实现的基本功能展示,包括:

主播端:

  • 创建直播间
  • 发布、取消发布视频
  • 下播
  • 浏览发送弹幕

访客端:

  • 浏览直播间
  • 观看直播
  • 退出直播间
  • 浏览发送弹幕

下面看下本次实现的简易架构图:

实现

在实现之前我们需要创建 Agora 账号并获取 App ID(参见声网的开发者中心)。

主播端

创建直播间

本次实现对于直播间的创建只是简单记录下直播间的名称

存储直播间名称

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取直播间名称String room = req.getParameter("room");// 新增直播间RoomListHolder.addRoom(room);resp.setCharacterEncoding("UTF-8");resp.setContentType("application/json");resp.getWriter().write("true");}

Agora SDK 集成

    // 创建 Agora Clientvar client = AgoraRTC.createClient({mode: 'interop'});// 初始化 client,并在初始化成功后执行加入直播间频道client.init('APP ID', function () {// 加入直播间频道client.join(null, room, null, function (uid) {console.log("用户 " + uid + "创建了直播间 " + room);// 执行本地视频发布});});

发布视频

主播在完成直播间的创建之后,基于 Agora SDK 实现本地视频的发布,这样当有订阅该直播间频道的用户将会获取视频流。

直播软件源码获取本地音频设备

在发布视频前,需要获取本地的音频设备,也即是麦克风,摄像头。

AgoraRTC.getDevices(function (devices) {for (var i = 0; i !== devices.length; ++i) {var device = devices[i];if (device.kind === 'audioinput') {// 获取麦克风设备media.audio = device.deviceId;} else if (device.kind === 'videoinput') {// 获取摄像头设备media.video = device.deviceId;}}
});

发布视频

    // 创建本地音视频流var localStream = AgoraRTC.createStream({streamID: uid, // Agora 分配的 uidaudio: true,cameraId: camera, microphoneId: microphone,video: true,screen: false});// 初始化音视频流localStream.init(function () {// 指定元素 ID 播放音视频流localStream.play('video');// 发布音视频流client.publish(localStream, function (err) {console.log("音视频发布失败: " + err);});// 监听音视频发布事件client.on('stream-published', function (evt) {console.log("音视频发布成功!");});}, function (err) {console.log("", err);});

下播

下播对于 Agora SDK 来说即是离开频道,同时从直播间列表中移除当前直播间。

client.leave(function () {// 主播执行时 会触发访客端事件 peer-leave// 访客执行时 不会触发console.log("下播成功");// 将 room 从直播间列表中移除$.post("/removeRoom?room=" + room, {}, function(data, textStatus, jqXHR) {// do nothing}, 'json');
}, function (err) {console.log("下播失败");
});
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取待移除的直播间String room = req.getParameter("room");// 移除直播间RoomListHolder.removeRoom(room);
}

访客端

访客通过浏览直播间列表,选择自己感兴趣的主播观看。

浏览直播间

// 获取直播间列表数据
$.get("/getRooms", function (data, status) {var roomHtml = '';if (data == null) {roomHtml = '当前没有直播间';} else {$.each(data, function (i, room) {roomHtml += '<div class="layui-col-md6">\n' +'            <div class="layui-card">\n' +'                <div class="layui-card-header">'+ room +'</div>\n' +'                <div class="layui-card-body">\n' +'                    <button channel="'+ room +'" class="layui-btn layui-btn-radius layui-btn-warm view">\n' +'                        <i class="layui-icon"></i> 观看\n' +'                    </button>\n' +'                </div>\n' +'            </div>\n' +'        </div>\n' +'        ';});}// 渲染$('#roomList').html(roomHtml);
});

观看直播

访客观看直播,对于 Agora SDK 来说也就是加入直播间频道,并订阅频道视频流。

client.join(null, room, null, function (uid) {console.log("用户 " + uid + " 来到直播间 " + room);
}, function (err) {console.log("加入直播间失败")
});client.on('stream-added', function (evt) {// 主播发布视频时会触发 stream-added 事件var stream = evt.stream;// 访客订阅 stream 流client.subscribe(stream, function (err) {console.log("视频流订阅失败", err);});
});client.on('stream-subscribed', function (evt) {// 主播端视频流订阅成功后触发 stram-subscribed 事件var stream = evt.stream;// 按指定元素 ID 播放视频流stream.play('video_remote');
});client.on('stream-removed', function (evt) {// 主播端执行 unpublish 时会触发该事件var stream = evt.stream;// 停止视频播放stream.stop();
});client.on('peer-leave', function (evt) {// 主播端执行 leave 下播操作时会触发该事件var stream = evt.stream;if (stream) {// 停止视频流播放stream.stop();}
});

弹幕

本次只是对直播软件源码的简单实现,弹幕的功能暂时忽略吧,o(╯□╰)o

效果

直播

小结

这样我们就实现了一个简单的直播软件源码功能。

声明:本文由云豹科技转发自断风雨博客,如有侵权请联系作者删除

直播软件源码,实现一个简单的直播功能相关推荐

  1. 直播系统源码python 一个简单的网站采集

    #!/usr/local/bin/python #coding=utf8 #网站定向简易采集 #QQ:29295842 import get_post import re import re, sys ...

  2. 视频交友直播软件源码开发的必备功能讲解

    相信通过这两年行业的发展我们不难看出.视频交友直播源码拥有简单直接的变现方式,深受平台和用户的喜爱,越来越多的年轻人也热衷于视频直播. 视频交友直播软件开发,支持用户在视频过程中用文字沟通,可以互相发 ...

  3. 仿比心一对一直播软件源码开发,消息通知功能的实现

    在仿比心一对一直播软件源码中,消息功能起着非常重要的作用,非实时性的社交都可以通过消息功能来实现,在即时消息模块有两个基本功能就是发送消息和接收消息.我们定义如下通信指令来实现这两个功能: Push ...

  4. 实现简单的直播互动功能,直播软件源码是如何做的

    近两年,很多电商平台开始关注起直播互动电商,希望在直播中,也可以增加互动,例如在直播过程中,抛出限量优惠商品,实时发送抢购的消息给观众.于是我们做了一个简单的直播软件源码Demo. Demo大致的整体 ...

  5. 直播软件源码如何在Android端实现多人视频通话

    本篇主要讨论直播软件源码如何在Android端实现多人视频通话.主要需要实现以下功能: 随着加入人数和他们的手机摄像头分辨率的变化,显示不同的UI,即所谓的"分屏" 点击分屏中的小 ...

  6. 一对一直播软件源码开发,iOS视频采集的实现过程

    在一对一直播软件源码日益火热的发展形势下,音视频开发(采集.编解码.传输.播放.美颜)等技术也随之成为开发者们关注的重点,本系列文章就音视频开发过程中所运用到的技术和原理进行梳理和总结. 认识 AVC ...

  7. 直播软件源码如何实现直播flash插件

    直播软件源码如何实现直播flash插件 项目搭建 原有的项目是用的layui+jq搭建.现在将大屏部分独立出来: 开心到飞起,哈哈哈 现在大屏单独出来做,我采用了react + react-mobx; ...

  8. 直播软件源码开发,直播间内消息系统的实现

    在直播软件源码开发过程中,消息系统是非常关键的,无论是直播间内的消息还是平台内的消息,都关系着用户的使用体验,所以今天我们先用一个简单的"拉"模型搭建一个简单的直播间消息系统. 基 ...

  9. Android分屏直播方案,直播软件源码如何在Android端实现多人视频通话

    本篇主要讨论直播软件源码如何在Android端实现多人视频通话.主要需要实现以下功能: 随着加入人数和他们的手机摄像头分辨率的变化,显示不同的UI,即所谓的"分屏" 点击分屏中的小 ...

最新文章

  1. [JavaScript] JavaScript 运算符与流程控制
  2. 浅谈Generator和Promise原理及实现
  3. 将webstorm设置为eclipse风格
  4. 文巾解题 477. 汉明距离总和
  5. Leetcode70场双周赛-第一题2144. 打折购买糖果的最小开销
  6. ROS: Ubuntu16.04安装ROS-kinetic
  7. php如何编写通信协议,定制通讯协议
  8. python列表用来有序存放一组_python入门第二课------列表
  9. GitLab使用教程(详细)(转载)
  10. element table实现前端分页
  11. 最伟大的IT人物10强
  12. 中国股票市场化整为零,然后聚沙成塔
  13. android iphone 记事本,苹果手机上有简单实用的便签记事本app吗?
  14. 微信小程序也许会用到上传视频,针对视频转码转为m3U8格式即web端可以使用的解决办法
  15. 0315-HttpURLConnection和JASON结合使用(以天气预报为例)
  16. 【钉钉-场景化能力包】企业做培训直播
  17. 基于Python的OCR图像识别
  18. MySQL:网络连接框架简析
  19. 关于U盘变成RAW格式 windows无法格式化的解决方法
  20. Yarn主导资源公平性调度算法

热门文章

  1. Restormer: Efficient Transformer for High-Resolution Image Restoration
  2. 算法-数塔问题-c语言
  3. 工控安全:攻防演示案例分享
  4. NeRF论文解析 - Neural Radiance Field
  5. 做一次完美的数据迁移
  6. 科技论文写作投稿相关
  7. MW7299/PD+HUB2.0集成芯片上行支持PD3.0协议下行HUB支持BC1.2协议QFN32封装
  8. “龙”腾智跃,“万”象更新 | 达索系统专精特新企业SIMULIA解决方案云峰会邀君共探未来
  9. SIMULIA仿真技术研讨会浙江专场
  10. 智能客服,还有多少AI泡沫?