当前位置: 首页 > news >正文

从零开始: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照明产品最大的生产制造国&#xff0c;如今&#xff0c;我国初步形成了包括LED外延片的生产、LED芯片的制备、LED芯片的封装以及LED产品应用在内的较为完超为产业链&#xff0c;随着LED照明市场渗诱率的快速警升&#xff0c;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‘“

记录在本地环境通过&#xff0c;然后在云环境&#xff0c;解决问题的过程&#xff1b; 最近两天遇到一个bug&#xff0c;具体就是在本地Pyhon环境运行成功&#xff0c;但是当放在云服务跑的时候&#xff0c;去屡屡报错&#xff0c;具体报错信息如下&#xff1a; pymysql.err.I…...

SQL 错误 [1476] [22012]: ORA-01476: 除数为 0

Oracle sql 语句 添加判断&#xff0c;如果分母为0&#xff0c;则查询结果为0&#xff0c;如果分母不为0&#xff0c;则返回查询结果 你可以使用条件表达式来实现这个要求。以下是一个示例的Oracle SQL查询语句&#xff0c;其中添加了判断条件来处理分母为0的情况&#xff1a;…...

go语言项目的目录结构

Golang 的项目目录结构并没有一个强制的标准&#xff0c;但社区中形成了一些共识和最佳实践&#xff0c;以便更好地组织和管理代码。以下是一个典型的 Golang 项目目录结构示例&#xff1a; /myproject ├── /cmd | ├── /app | | └── main.go | …...

Android : DataBinding 简化开发 简单应用

1.导包 ViewModel 用于观察数据 // 使用androidx版本库 ViewModelProviders implementation androidx.lifecycle:lifecycle-extensions:2.1.0-alpha032.在build.gradle 添加 在android 代码块中添加 复制后点更新&#xff08;Sync Now&#xff09; android{...// 步骤1.开启…...

计算机网络:应用层(下篇)

文章目录 前言一 、电子邮件&#xff08;Email&#xff09;1.邮件服务器2.SMTP[RFC 2821]3.邮件报文格式4.邮件访问协议 二、DNS&#xff08;域名系统&#xff09;1.DNS的历史2.DNS总体思路和目标&#xff08;1&#xff09;问题1&#xff1a;DNS名字空间&#xff08;2&#xff…...

干货分享 | TSMaster小程序启动和停止的自动化控制流程

在实际应用场景中&#xff0c;用户常常需要按一定逻辑和时序来控制TSMaster内置功能模块的启动和停止&#xff0c;TSMaster软件内置有C/Python小程序和图形程序&#xff0c;开发者可以通过编程对这些模块的运行进行精确控制。本文将重点和大家分享一下如何通过C代码来控制TSMas…...

AI视频智能分析识别技术的发展与EasyCVR智慧安防视频监控方案

随着科技的不断进步&#xff0c;基于AI神经网络的视频智能分析技术已经成为了当今社会的一个重要组成部分。这项技术通过利用计算机视觉和深度学习等技术&#xff0c;实现对视频数据的智能分析和处理&#xff0c;从而为各个领域提供了广泛的应用。今天我们就来介绍下视频智能分…...

外包干了2个月,技术倒退2年。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;20年通过校招进入深圳某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

书-用数组存储高于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)

说明&#xff1a;当前调试仅仅用来测试和熟悉部分摄像头寄存器模式 一、图片成像方向控制&#xff0c;基本每个摄像头都会有上下左右翻转寄存器 正向图片 反向图片 二、设置成像数据成各种颜色&#xff0c;&#xff08;黑白/原彩/黄色等等&#xff09; 在寄存器书册描述中…...

Linux--程序地址空间

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 [TOC](文章目录) 一、程序地址空间回顾 我们在讲C语言的时候&#xff0c;老师给大家画过这样的空间布局…...

【超全】React学习笔记 下:路由与Redux状态管理

React学习笔记 React系列笔记学习 上篇笔记地址&#xff1a;【超全】React学习笔记 上&#xff1a;基础使用与脚手架 中篇笔记地址&#xff1a;【超全】React学习笔记 中&#xff1a;进阶语法与原理机制 React路由概念与理解使用 1. 引入 React路由是构建单页面应用(SPA, Sin…...

matplotlib学习

显示两个figure 坐标上刻度修改 plt.xlim() 下标范围 plt.xticks() 替换新的下标 图例显示 散点图 subplot多合一显示...

避开这些坑!ISCE2数据下载实战:Earthdata账号、.netrc配置与DEM自动拼接

ISCE2数据下载实战&#xff1a;Earthdata账号配置与DEM自动拼接避坑指南 当你第一次尝试用ISCE2处理哨兵数据时&#xff0c;可能会被各种数据下载问题搞得焦头烂额。Earthdata认证失败、DEM下载报错、脚本运行异常——这些看似简单的问题往往会让整个项目停滞数天。本文将分享…...

从逻辑门到加法器:Verilog实现半加器与全加器的三种抽象层级

1. 项目概述&#xff1a;从逻辑门到加法器的数字世界基石在数字电路和芯片设计的入门路上&#xff0c;加法器是一个绕不开的经典课题。它不仅是算术逻辑单元&#xff08;ALU&#xff09;的核心组件&#xff0c;更是理解数字系统如何执行基本运算的关键。今天&#xff0c;我们不…...

前端入门必学:CSS盒子模型与图片样式全解析前言

在学习前端开发的过程中&#xff0c;掌握 CSS 的基础知识是至关重要的一步。本文将详细介绍 CSS 盒子模型、标签宽高、边框、边距 以及 图片与背景图片 的使用方法&#xff0c;适合刚入门的同学系统学习和复习。一、CSS 盒子模型——页面布局的基石1. 什么是盒子模型&#xff1…...

087、机器人运动学:雅可比矩阵

087、机器人运动学:雅可比矩阵 一、一个让我熬夜三天的调试故事 去年做六轴协作机器人末端力控的时候,遇到一个诡异的问题:机器人末端在某个位姿下,明明关节速度指令给得很平滑,末端速度却突然跳变,导致力控震荡。当时我盯着示波器上的速度曲线,百思不得其解——运动学…...

STM32单片机如何用IRIG-B解码模块实现10ns级高精度授时(附完整驱动代码)

STM32单片机如何用IRIG-B解码模块实现10ns级高精度授时&#xff08;附完整驱动代码&#xff09; 在工业自动化、电力系统同步、通信基站等对时间精度要求苛刻的领域&#xff0c;微秒级甚至毫秒级的时钟同步已经无法满足需求。IRIG-B作为一种标准时间码格式&#xff0c;通过解码…...

免费LLM API资源全解析:从选型接入到避坑实战指南

1. 项目概述&#xff1a;一个免费LLM API的“藏宝图”如果你最近在捣鼓一些AI小应用&#xff0c;或者想低成本地体验一下大语言模型的能力&#xff0c;大概率会和我一样&#xff0c;被一个问题卡住&#xff1a;去哪里找免费、稳定、还能用的LLM API&#xff1f;市面上各种模型服…...

5分钟快速掌握FlicFlac:Windows免费音频格式转换终极指南

5分钟快速掌握FlicFlac&#xff1a;Windows免费音频格式转换终极指南 【免费下载链接】FlicFlac Tiny portable audio converter for Windows (WAV FLAC MP3 OGG APE M4A AAC) 项目地址: https://gitcode.com/gh_mirrors/fl/FlicFlac 还在为不同设备间的音频格式不兼容…...

怎样快速恢复损坏视频:3步实用MP4修复方案

怎样快速恢复损坏视频&#xff1a;3步实用MP4修复方案 【免费下载链接】untrunc Restore a truncated mp4/mov. Improved version of ponchio/untrunc 项目地址: https://gitcode.com/gh_mirrors/un/untrunc 你是否经历过相机突然断电导致视频文件损坏&#xff1f;或者传…...

终极MifareOneTool使用指南:如何零基础玩转MIFARE经典卡的Windows图形化神器

终极MifareOneTool使用指南&#xff1a;如何零基础玩转MIFARE经典卡的Windows图形化神器 【免费下载链接】MifareOneTool A GUI Mifare Classic tool on Windows&#xff08;停工/最新版v1.7.0&#xff09; 项目地址: https://gitcode.com/gh_mirrors/mi/MifareOneTool …...

5分钟快速上手:用Tinke免费工具轻松解包修改NDS游戏资源

5分钟快速上手&#xff1a;用Tinke免费工具轻松解包修改NDS游戏资源 【免费下载链接】tinke Viewer and editor for files of NDS games 项目地址: https://gitcode.com/gh_mirrors/ti/tinke 你是否曾经想过深入探索任天堂DS游戏的神秘世界&#xff1f;想要提取那些精美…...