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

在这里插入图片描述

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

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

推流地址一般格式为:

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

其中,

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

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

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

{AuthKey}代表授权密钥;

{Timestamp}代表当前时间戳;

{RandomNum}代表随机数。

播放地址一般格式为:

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

{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;}
}

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);}
}

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();}
}

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();}
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/231749.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“rhdf5filters.so’ not found when install ‘glmGamPoi‘ package

在R中安装glmGamPoi包的时候,出现了如下报错: install.packages(glmGamPoi) 尝试方案一: sudo apt install pkg-config libhdf5-dev安装lighdf5-dev,并将安装路径链接至usr/lib/文件。 locate rhdf5filters.so sudo ln -s /hom…

Spring boot命令执行 (CVE-2022-22947)漏洞复现和相关利用工具

Spring boot命令执行 (CVE-2022-22947)漏洞复现和相关利用工具 名称: spring 命令执行 (CVE-2022-22947) 描述: Spring Cloud Gateway是Spring中的一个API网关。其3.1.0及3.0.6版本(包含)以前存在一处SpEL表达式注入漏洞,当攻击者可以访问A…

数据结构---树

树概念及结构 1.树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的 有一个特殊的结点&#xff0c…

纹理烘焙:原理及实现

纹理烘焙是计算机图形学中常见的技术,用于将着色器的细节传输到纹理中。 如果你的着色器计算量很大,但会产生静态结果,例如,这非常有用。 复杂的噪音。 NSDT在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器…

msyql迁移到mongodb

关系型数据库迁移到mongodb的理由 高并发需求,关系型数据库不容易扩展 快速迭代 灵活的json模式 大数据量需求 应用迁移难度: 关系型到关系 oracle-》mysql oracle -》 postgresql 关系到文档- oracle -》 mongodb 需要考虑: 总体架构&#…

傅里叶变换及其在机器学习中的应用

​​​​​​​一、介绍 傅立叶变换是一种数学技术,在各个科学和工程领域发挥着关键作用,其应用范围从信号处理到量子力学。近年来,它在机器学习领域发现了新的意义。本文探讨了傅里叶变换的基础知识及其在机器学习应用中日益增长的重要性。 …

同旺科技 分布式数字温度传感器

内附链接 1、数字温度传感器 主要特性有: ● 支持PT100 / PT1000 两种铂电阻; ● 支持 2线 / 3线 / 4线 制接线方式; ● 支持5V~17V DC电源供电; ● 支持电源反接保护; ● 支持通讯波特率1200bps、2…

一套后台管理系统的入门级的增删改查(vue3组合式api+elemment-plus)

一、页面示意: 图一 图二 二、组件结构 列表组件 :index.vue,对应图一添加组件:add.vue,对应图二,用抽屉效果编辑组件:edit.vue,和添加组件的效果一个。 三、代码 1、列表组件: index.vue …

代码随想录算法训练营第五十九天| 503.下一个更大元素II 42. 接雨水

文档讲解:代码随想录 视频讲解:代码随想录B站账号 状态:看了视频题解和文章解析后做出来了 503.下一个更大元素II class Solution:def nextGreaterElements(self, nums: List[int]) -> List[int]:res [-1] * len(nums)stack []for i in…

06 # 枚举类型

一个角色判断例子 function initByRole(role) {if (role 1 || role 2) {// do sth} else if (role 3 || role 4) {// do sth} else if (role 5) {// do sth} else {// do sth} }上面的代码存在的问题: 可读性差:很难记住数字的含义可维护性差&…

基于单片机智能液位水位监测控制系统

**单片机设计介绍, 基于单片机智能液位水位监测控制系统 文章目录 一 概要特点应用场景工作原理实现方式 系统功能实时监测控制调节报警功能数据记录与分析 总结 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 ## 系统介绍 基于单片机…

私域数字化建设:解锁企业融资新引擎

私域数字化建设对于增加企业融资能力的机遇是十分重要的,随着数字化经济的快速发展和数据技术的不断进步,企业需要正确认识到数据资产的重要性和私域数字化建设在提升融资能力等方面所带来的机遇。 近期,财政部发布了《企业数据资源相关会计…