从零开始: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();}
}
项目附件:点此下载
相关文章:
从零开始:PHP实现阿里云直播的简单方法!
1. 配置阿里云直播的推流地址和播放地址 使用阿里云直播功能前,首先需要在阿里云控制台中创建直播应用,然后获取推流地址和播放地址。 推流地址一般格式为: rtmp://{Domain}/{AppName}/{StreamName}?auth_key{AuthKey}-{Timestamp}-{Rand…...
【数据结构】——二叉树特点
前言:我们前面已经了解了二叉树的一些概念,那么我们今天就来了解下二叉树的遍历实现和一些性质。 二叉树的遍历方式有三种:前序,中序,后序。 前序:先根节点,再左子树,最后右子树。 中…...
C++的类和对象(一)
目录 1、面向过程和面向对象初认识 2、为什么要有类 3、类的定义 类的两种定义方式 4、类的访问限定符 5、类的作用域 5.1 为什么要有作用域? 5.2类作用域 6、类的实例化 6.1类的实例化的定义 6.2类的实例化的实现 6.3经典面试题 7、类对象 7.1类对…...
基于单片机自动饮料混合机控制系统设计
**单片机设计介绍,基于单片机自动饮料混合机控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机自动饮料混合机控制系统设计是一个涉及多个领域的复杂项目,包括单片机技术、传感器技术…...
react-route-dom 实现简单的嵌套路由
最终效果 点击 to test1 点击to test2 > to test21 点击to test2 > to test22 代码如下 path: "page",element: <父组件 />,children: [{ path: "test1", element: <Test1 /> },{path: "test2",element: <Test2 />…...
万界星空科技灯具行业MES介绍
中国是LED照明产品最大的生产制造国,如今,我国初步形成了包括LED外延片的生产、LED芯片的制备、LED芯片的封装以及LED产品应用在内的较为完超为产业链,随着LED照明市场渗诱率的快速警升,LED下游应用市场将会越来越广阔。这也将推动…...
16进制字符串转字符串
一、浏览器上 function hexToUtf8(hexString) {const hexArray hexString.match(/.{1,2}/g) || [];const uint8Array new Uint8Array(hexArray.map(hex > parseInt(hex, 16)));const textDecoder new TextDecoder(GB2312); //可以切换字符编码return textDecoder.decode…...
pymysql.err.InternalError: (1054, “Unknown column ‘nan‘ in ‘field list‘“
记录在本地环境通过,然后在云环境,解决问题的过程; 最近两天遇到一个bug,具体就是在本地Pyhon环境运行成功,但是当放在云服务跑的时候,去屡屡报错,具体报错信息如下: pymysql.err.I…...
SQL 错误 [1476] [22012]: ORA-01476: 除数为 0
Oracle sql 语句 添加判断,如果分母为0,则查询结果为0,如果分母不为0,则返回查询结果 你可以使用条件表达式来实现这个要求。以下是一个示例的Oracle SQL查询语句,其中添加了判断条件来处理分母为0的情况:…...
go语言项目的目录结构
Golang 的项目目录结构并没有一个强制的标准,但社区中形成了一些共识和最佳实践,以便更好地组织和管理代码。以下是一个典型的 Golang 项目目录结构示例: /myproject ├── /cmd | ├── /app | | └── main.go | …...
Android : DataBinding 简化开发 简单应用
1.导包 ViewModel 用于观察数据 // 使用androidx版本库 ViewModelProviders implementation androidx.lifecycle:lifecycle-extensions:2.1.0-alpha032.在build.gradle 添加 在android 代码块中添加 复制后点更新(Sync Now) android{...// 步骤1.开启…...
计算机网络:应用层(下篇)
文章目录 前言一 、电子邮件(Email)1.邮件服务器2.SMTP[RFC 2821]3.邮件报文格式4.邮件访问协议 二、DNS(域名系统)1.DNS的历史2.DNS总体思路和目标(1)问题1:DNS名字空间(2ÿ…...
干货分享 | TSMaster小程序启动和停止的自动化控制流程
在实际应用场景中,用户常常需要按一定逻辑和时序来控制TSMaster内置功能模块的启动和停止,TSMaster软件内置有C/Python小程序和图形程序,开发者可以通过编程对这些模块的运行进行精确控制。本文将重点和大家分享一下如何通过C代码来控制TSMas…...
AI视频智能分析识别技术的发展与EasyCVR智慧安防视频监控方案
随着科技的不断进步,基于AI神经网络的视频智能分析技术已经成为了当今社会的一个重要组成部分。这项技术通过利用计算机视觉和深度学习等技术,实现对视频数据的智能分析和处理,从而为各个领域提供了广泛的应用。今天我们就来介绍下视频智能分…...
外包干了2个月,技术倒退2年。。。
先说一下自己的情况,本科生,20年通过校招进入深圳某软件公司,干了接近4年的功能测试,今年国庆,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...
书-用数组存储高于60低于70的人单独存起来
#include<stdio.h> # define N 10 //书-用数组存储高于60低于70的人单独存起来 int main(){float s[N]{68.2,62.3,63.4,34.5,45.6,56.7,67.8,78.9,89.0,100};int i;float diyu[100];int j0;for(i0;i<N;i){if(s[i]>60 && s[i]<70)diyu[j]s[i];//这里的范…...
三、DVP摄像头调试笔记(图片成像质量微调整,非ISP)
说明:当前调试仅仅用来测试和熟悉部分摄像头寄存器模式 一、图片成像方向控制,基本每个摄像头都会有上下左右翻转寄存器 正向图片 反向图片 二、设置成像数据成各种颜色,(黑白/原彩/黄色等等) 在寄存器书册描述中…...
Linux--程序地址空间
📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 [TOC](文章目录) 一、程序地址空间回顾 我们在讲C语言的时候,老师给大家画过这样的空间布局…...
【超全】React学习笔记 下:路由与Redux状态管理
React学习笔记 React系列笔记学习 上篇笔记地址:【超全】React学习笔记 上:基础使用与脚手架 中篇笔记地址:【超全】React学习笔记 中:进阶语法与原理机制 React路由概念与理解使用 1. 引入 React路由是构建单页面应用(SPA, Sin…...
matplotlib学习
显示两个figure 坐标上刻度修改 plt.xlim() 下标范围 plt.xticks() 替换新的下标 图例显示 散点图 subplot多合一显示...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
