1. 配置阿里云直播的推流地址和播放地址
使用阿里云直播功能前,首先需要在阿里云控制臺中創(chuàng)建直播應(yīng)用,然后獲取推流地址和播放地址。
推流地址一般格式為:
rtmp://{Domain}/{AppName}/{StreamName}?auth_key={AuthKey}-{Timestamp}-{RandomNum}
其中,
{Domain}
代表阿里云直播的推流域名;
{AppName}
代表應(yīng)用名稱,一般為“l(fā)ive”,也可以自定義;
{StreamName}
代表流名稱,可以自定義;
{AuthKey}
代表授權(quán)密鑰;
{Timestamp}
代表當前時間戳;
{RandomNum}
代表隨機數(shù)。
播放地址一般格式為:
http://{Domain}/{AppName}/{StreamName}.m3u8
{Domain}
代表阿里云直播的播放域名;
{AppName}
代表應(yīng)用名稱,一般為“l(fā)ive”,也可以自定義;
{StreamName}
代表流名稱,可以自定義。
把獲取到的推流地址和播放地址配置到代碼中,代碼如下:
class LiveAction extends Action {
// 推流地址
private $pushUrl = 'rtmp://{Domain}/{AppName}/{StreamName}?auth_key={AuthKey}-{Timestamp}-{RandomNum}';
// 播放地址
private $playUrl = 'http://{Domain}/{AppName}/{StreamName}.m3u8';
// 阿里云直播的推流域名
private $pushDomain = 'xxx.xxx.com';
// 阿里云直播的播放域名
private $playDomain = 'xxx.xxx.com';
// 應(yīng)用名稱
private $appName = 'live';
// 流名稱
private $streamName = 'test';
// 授權(quán)密鑰
private $authKey = '1234567890';
// 獲取推流地址
private function getPushUrl() {
$randomNum = rand(100000, 999999);
$timestamp = time();
$authKey = md5($this->authKey . $this->appName . $this->streamName . $timestamp . $randomNum);
$pushUrl = str_replace(array('{Domain}', '{AppName}', '{StreamName}', '{AuthKey}', '{Timestamp}', '{RandomNum}'), array($this->pushDomain, $this->appName, $this->streamName, $authKey, $timestamp, $randomNum), $this->pushUrl);
return $pushUrl;
}
// 獲取播放地址
private function getPlayUrl() {
$playUrl = str_replace(array('{Domain}', '{AppName}', '{StreamName}'), array($this->playDomain, $this->appName, $this->streamName), $this->playUrl);
return $playUrl;
}
}
在LiveAction
中定義了一系列變量,包括推流地址和播放地址的格式和一些基本的配置信息,同時定義了兩個私有方法,分別用于獲取推流地址和播放地址。
在getPushUrl
方法中,先生成一個六位的隨機數(shù)和當前時間戳,然后計算出授權(quán)密鑰,最后將這些參數(shù)替換到推流地址的相應(yīng)位置。最終返回一個完整的推流地址。
在getPlayUrl
方法中,直接將播放地址的相應(yīng)位置替換即可。最終返回一個完整的播放地址。
2. 在ThinkPHP中集成阿里云直播的推流功能
在ThinkPHP框架中,可以使用Fmpeg庫來實現(xiàn)推流的功能。Fmpeg是一個非常強大的音視頻處理工具,它不僅可以播放、轉(zhuǎn)碼音視頻,還可以進行音視頻的編輯、剪輯等等。
在使用Fmpeg之前,需要先安裝Fmpeg庫,并把它的路徑配置到環(huán)境變量中。
代碼如下:
class LiveAction extends Action {
// 推流地址
private $pushUrl = 'rtmp://{Domain}/{AppName}/{StreamName}?auth_key={AuthKey}-{Timestamp}-{RandomNum}';
// 阿里云直播的推流域名
private $pushDomain = 'xxx.xxx.com';
// 應(yīng)用名稱
private $appName = 'live';
// 流名稱
private $streamName = 'test';
// 授權(quán)密鑰
private $authKey = '1234567890';
// 獲取推流地址
private function getPushUrl() {
$randomNum = rand(100000, 999999);
$timestamp = time();
$authKey = md5($this->authKey . $this->appName . $this->streamName . $timestamp . $randomNum);
$pushUrl = str_replace(array('{Domain}', '{AppName}', '{StreamName}', '{AuthKey}', '{Timestamp}', '{RandomNum}'), array($this->pushDomain, $this->appName, $this->streamName, $authKey, $timestamp, $randomNum), $this->pushUrl);
return $pushUrl;
}
// 推流
public function push() {
$pushUrl = $this->getPushUrl();
$command = 'ffmpeg -re -i test.flv -vcodec copy -acodec aac -f flv ' . $pushUrl;
exec($command);
}
}
在LiveAction
中添加了一個push
方法,該方法利用Fmpeg庫將本地的test.flv文件推流到阿里云直播中。
3. 在ThinkPHP中集成阿里云直播的播放功能
在ThinkPHP框架中,可以使用Hls.js庫來實現(xiàn)直播的播放功能。Hls.js是一個基于HTML5的JavaScript庫,它能夠?qū)3U8格式的直播流實時轉(zhuǎn)換成模擬的FLV格式并播放。
代碼如下:
class LiveAction extends Action {
// 播放地址
private $playUrl = 'http://{Domain}/{AppName}/{StreamName}.m3u8';
// 阿里云直播的播放域名
private $playDomain = 'xxx.xxx.com';
// 應(yīng)用名稱
private $appName = 'live';
// 流名稱
private $streamName = 'test';
// 獲取播放地址
private function getPlayUrl() {
$playUrl = str_replace(array('{Domain}', '{AppName}', '{StreamName}'), array($this->playDomain, $this->appName, $this->streamName), $this->playUrl);
return $playUrl;
}
// 播放
public function play() {
$playUrl = $this->getPlayUrl();
$this->assign('playUrl', $playUrl);
$this->display();
}
}
在LiveAction
中添加了一個play
方法,該方法獲取播放地址并分配給模板,然后通過模板display
方法展示到頁面上。
在頁面上可以使用Hls.js庫來播放直播流。
完整代碼如下:
class LiveAction extends Action {
// 推流地址
private $pushUrl = 'rtmp://{Domain}/{AppName}/{StreamName}?auth_key={AuthKey}-{Timestamp}-{RandomNum}';
// 阿里云直播的推流域名
private $pushDomain = 'xxx.xxx.com';
// 播放地址
private $playUrl = 'http://{Domain}/{AppName}/{StreamName}.m3u8';
// 阿里云直播的播放域名
private $playDomain = 'xxx.xxx.com';
// 應(yīng)用名稱
private $appName = 'live';
// 流名稱
private $streamName = 'test';
// 授權(quán)密鑰
private $authKey = '1234567890';
// 獲取推流地址
private function getPushUrl() {
$randomNum = rand(100000, 999999);
$timestamp = time();
$authKey = md5($this->authKey . $this->appName . $this->streamName . $timestamp . $randomNum);
$pushUrl = str_replace(array('{Domain}', '{AppName}', '{StreamName}', '{AuthKey}', '{Timestamp}', '{RandomNum}'), array($this->pushDomain, $this->appName, $this->streamName, $authKey, $timestamp, $randomNum), $this->pushUrl);
return $pushUrl;
}
// 獲取播放地址
private function getPlayUrl() {
$playUrl = str_replace(array('{Domain}', '{AppName}', '{StreamName}'), array($this->playDomain, $this->appName, $this->streamName), $this->playUrl);
return $playUrl;
}
// 推流
public function push() {
$pushUrl = $this->getPushUrl();
$command = 'ffmpeg -re -i test.flv -vcodec copy -acodec aac -f flv ' . $pushUrl;
exec($command);
}
// 播放
public function play() {
$playUrl = $this->getPlayUrl();
$this->assign('playUrl', $playUrl);
$this->display();
}
}
如果你想擁有自己的私域流量和私域直播電商系統(tǒng),可以選擇CRMEB Pro版高性能私域電商系統(tǒng),CRMEB Pro版是一款高性能、高并發(fā)、高可用的私域客戶關(guān)系管理(CRM)+營銷電商(EB)系統(tǒng);助力品牌商家實現(xiàn)公域引流轉(zhuǎn)化私域沉淀,全渠道智能化經(jīng)營。