需求:教育企业,
1.针对每个教室都要有直播能给到家长在直播时间能看到
2.考虑到有些家长白天需要工作,可能会要求看录播功能
3.不需要人为去操作直播(比如开启,关闭)
开发语言:PHP 框架TP5.1
功能开始:
因为种种原因。最终选择了我目前使用的方法。
教室有监控摄像头===》RTSP(不懂自行百度)
我买了IPC ONVIF推流器(RTSP转RTMP)
然后每个学校安装一个,每个学校大概有10个教室以上,校区有8个。
又因为种种原因最终选择了阿里云的直播。
1.在访问控制(RAM)里面分配一个子账户,创建accesskey。在这里拿到AccessKeyID 和 AccessKeySecret,主账户的也行,但是阿里推荐子账户,听他的不会错。
2.管理控制台->产品与服务->视频直播->找到其开发文档->下载SDK
3.引入SDK,记住这里下载的是PHP的SDK,个人感觉,写的不是很好,因为全英文,东西很多,做直播直接找到Live的就行。
4.怎么控制开启和关闭。禁推和恢复,A教室到上课时间有开始上课时间,下课时间。根据上课时间从禁推里面找到此教室恢复推流,根据下课时间在在线流里面找到此教室禁推。
5.录制问题。录制文件管理->存储至OSS->里面有个回调地址,这个地址就是在阿里云录制完成,或者说你流开启到结束,包括禁推。就会把这个视频的名称和地址推送给你,这个地址建议是http的,不要是https。https我测试不稳定
6.服务器写一个定时脚本,按需求设置多少时间跑一次脚本触发代码。
A.PHP
<?php
/**
* 直播页面
* @author sky
* @date 2018.8.27
*/
namespace app\api\controller;
use app\api\common\controller\Base;
use think\Db;
use DefaultProfile;
use DefaultAcsClient;
use live\Request\V20161101\DescribeLiveStreamsBlockListRequest;
use live\Request\V20161101\DescribeLiveStreamsOnlineListRequest;
class A extends Base
{
/**
* [index description]
* @author Sky 2018-10-08
* @return [type] [description]
*/
private $streamName = array();
private $studentArr = array();
public function __construct()
{
require_once '../extend/aliyun-openapi-php-sdk/aliyun-php-sdk-core/Config.php';
require_once '../extend/aliyun-openapi-php-sdk/aliyun-php-sdk-core/Profile/DefaultProfile.php';
require_once '../extend/aliyun-openapi-php-sdk/aliyun-php-sdk-core/DefaultAcsClient.php';
}
public function a()
{
//2.查看禁推流
$BlockStreamUrl = get_object_vars($this->DescribeLiveStreamsBlockListRequest());
$url = aaaaaaa B.php;//这个是开启推流地址
$this->curl($url);
}
//查看在线流
public function b()
{
//2.查看在线直播流
$OnlineStreamUrl = get_object_vars($this->DescribeLiveStreamsOnlineListRequest());
$url = aaaaaaa B.php;//这个是禁止推流地址
$this->curl($url);
}
//推流黑名单列表
protected function DescribeLiveStreamsBlockListRequest()
{
$request = new DescribeLiveStreamsBlockListRequest ();
$request ->setDomainName('');
$clientProfile = DefaultProfile::getProfile(
"", # 您的 Region ID
"", # 您的 AccessKey ID
"" # 您的 AccessKey Secret
);
$client = new DefaultAcsClient($clientProfile);
$response = $client->getAcsResponse($request);
return $response;
}
// 获取在线推流
public function DescribeLiveStreamsOnlineListRequest() {
$request = new DescribeLiveStreamsOnlineListRequest();
$request ->setDomainName('');
$request ->setAppName('');
$clientProfile = DefaultProfile::getProfile(
"", # 您的 Region ID
"", # 您的 AccessKey ID
"" # 您的 AccessKey Secret
);
$client = new DefaultAcsClient($clientProfile);
//针对阿里云进行请求
$response = $client->getAcsResponse($request);
return $response;
}
public function curl($url)
{
$curl = curl_init();
//设置抓取的url
curl_setopt($curl, CURLOPT_URL, $url);
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 1);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//执行命令
// curl_setopt($curlp, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
$data = curl_exec($curl);
// var_dump( curl_error($curl));exit;
//关闭URL请求
curl_close($curl);
//显示获得的数据
//var_dump($data);
}
}
?>
B.PHP
<?php
/**
* 保存当天上课的学生信息和课程信息
* @author sky
* @date 2018.10.08
*/
namespace app\api\controller;
use app\api\common\controller\Base;
use think\facade\Request;
use DefaultProfile;
use DefaultAcsClient;
use live\Request\V20161101\ResumeLiveStreamRequest;
use live\Request\V20161101\ForbidLiveStreamRequest;
use app\admin\common\model\ClassData;
class B extends Base
{
/**
* [index description]
* @author Sky 2018-10-08
* @return [type] [description]
*/
private $StreamName;
private $studentArr;
public function __construct()
{
require_once '../extend/aliyun-openapi-php-sdk/aliyun-php-sdk-core/Config.php';
require_once '../extend/aliyun-openapi-php-sdk/aliyun-php-sdk-core/Profile/DefaultProfile.php';
require_once '../extend/aliyun-openapi-php-sdk/aliyun-php-sdk-core/DefaultAcsClient.php';
}
public function a()
{ //1.引入SDK
$this->StreamName = Request::param('');
$this->studentArr = Request::param('');
$this->ResumeLiveStreamRequest();//恢复推流
}
public function b()
{
$this->StreamName = Request::param('');
$this->ForbidLiveStreamRequest();//禁止推流
}
//恢复直播推流
protected function ResumeLiveStreamRequest()
{
//$streamName = $this->streamName;
$request = new ResumeLiveStreamRequest ();
$request ->setAppName('');
$request ->setDomainName('');
$request ->setliveStreamType('publisher');
$request ->setStreamName($this->StreamName);
$clientProfile = DefaultProfile::getProfile(
"", # 您的 Region ID
"", # 您的 AccessKey ID
"" # 您的 AccessKey Secret
);
$client = new DefaultAcsClient($clientProfile);
//针对阿里云进行请求
$response = $client->getAcsResponse($request);
return $response;
}
//禁止直播推流
protected function ForbidLiveStreamRequest()
{
$request = new ForbidLiveStreamRequest ();
$request ->setAppName('');
$request ->setDomainName('');
$request ->setliveStreamType('publisher');
$request ->setStreamName($this->StreamName);
$clientProfile = DefaultProfile::getProfile(
"", # 您的 Region ID
"", # 您的 AccessKey ID
"" # 您的 AccessKey Secret
);
$client = new DefaultAcsClient($clientProfile);
//针对阿里云进行请求
$response = $client->getAcsResponse($request);
return $response;
}
}
?>