• 从零开始:PHP实现阿里云直播的简单方法!


    在这里插入图片描述

    1. 配置阿里云直播的推流地址和播放地址

    使用阿里云直播功能前,首先需要在阿里云控制台中创建直播应用,然后获取推流地址和播放地址。

    推流地址一般格式为:

    rtmp://{Domain}/{AppName}/{StreamName}?auth_key={AuthKey}-{Timestamp}-{RandomNum}
    
    • 1

    其中,

    {Domain}代表阿里云直播的推流域名;

    {AppName}代表应用名称,一般为“live”,也可以自定义;

    {StreamName}代表流名称,可以自定义;

    {AuthKey}代表授权密钥;

    {Timestamp}代表当前时间戳

    {RandomNum}代表随机数

    播放地址一般格式为:

    http://{Domain}/{AppName}/{StreamName}.m3u8
    
    • 1

    {Domain}代表阿里云直播的播放域名;

    {AppName}代表应用名称,一般为“live”,也可以自定义;

    {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';
    
        // 应用名称
        private $appName = 'live';
    
        // 流名称
        private $streamName = 'test';
    
        // 授权密钥
        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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    LiveAction中定义了一系列变量,包括推流地址和播放地址的格式和一些基本的配置信息,同时定义了两个私有方法,分别用于获取推流地址和播放地址。

    getPushUrl方法中,先生成一个六位的随机数和当前时间戳,然后计算出授权密钥,最后将这些参数替换到推流地址的相应位置。最终返回一个完整的推流地址。

    getPlayUrl方法中,直接将播放地址的相应位置替换即可。最终返回一个完整的播放地址。

    在这里插入图片描述

    2. 在ThinkPHP中集成阿里云直播的推流功能

    在ThinkPHP框架中,可以使用Fmpeg库来实现推流的功能。Fmpeg是一个非常强大的音视频处理工具,它不仅可以播放、转码音视频,还可以进行音视频的编辑、剪辑等等。

    在使用Fmpeg之前,需要先安装Fmpeg库,并把它的路径配置到环境变量中。

    代码如下:

    class LiveAction extends Action {
        // 推流地址
        private $pushUrl = 'rtmp://{Domain}/{AppName}/{StreamName}?auth_key={AuthKey}-{Timestamp}-{RandomNum}';
    
        // 阿里云直播的推流域名
        private $pushDomain = 'xxx.xxx.com';
    
        // 应用名称
        private $appName = 'live';
    
        // 流名称
        private $streamName = 'test';
    
        // 授权密钥
        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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    LiveAction中添加了一个push方法,该方法利用Fmpeg库将本地的test.flv文件推流到阿里云直播中。
    在这里插入图片描述

    3. 在ThinkPHP中集成阿里云直播的播放功能

    在ThinkPHP框架中,可以使用Hls.js库来实现直播的播放功能。Hls.js是一个基于HTML5的JavaScript库,它能够将M3U8格式的直播流实时转换成模拟的FLV格式并播放。

    代码如下:

    class LiveAction extends Action {
        // 播放地址
        private $playUrl = 'http://{Domain}/{AppName}/{StreamName}.m3u8';
    
        // 阿里云直播的播放域名
        private $playDomain = 'xxx.xxx.com';
    
        // 应用名称
        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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    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';
    
    
        // 应用名称
        private $appName = 'live';
    
    
        // 流名称
        private $streamName = 'test';
    
    
        // 授权密钥
        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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    项目附件:​​点此下载​​

  • 相关阅读:
    工业RFID设备如何实现抗干扰功能?
    Java+SSM+JSP实现医院预约挂号系统
    常见的js手写题【总结】
    【kubernetes】带你了解k8s中PV和PVC的由来
    如何使用 STARTTLS 加密 OpenLDAP 连接
    go操作Kafka
    算法通关村第三关|白银|双指针妙用【持续更新】
    golang 面试
    【LeetCode】1154.一年中的第几天
    SQLZOO——SELECT within SELECT Tutorial
  • 原文地址:https://blog.csdn.net/CRMEB/article/details/134689231