tp3.2 安装使用php ffmpeg_PHP做视频直播,效果如何?

如今的直播平台到处都是了,自己动手用PHP去做一个视频直播,那是可以的,你可以用到swoole。但是会花很长时间去开发与测试吧!也不知道开发出来的效果会不会不稳定,所以为了节省更多的时间,开发视频直播基本都会用到第三方稳定的API,今天要讲到的是用PHP与阿里云视频直播API开发视频直播

swoole做直播具体步骤如下:(带摄像头的笔记本)

1、Swoole创建 2个监听 一个WebSocket监听服务(用于视频流传输)。一个本地 【Unix Socket文件描述符】(用于ffmpeg转码后的视频流接受与转发给WebSocket客户端。)

2、浏览器使用 jsmpeg 这个项目连接 Swoole 提供的WebSocket 服务来获取视频流播放。

3、使用ffmpeg 把直播的视频流 转码 为 mpeg 视频流格式 发送到 本地的Swoole 监听的【Unix Socket】文件描述符

比如:$serv->addlistener("/var/run/myserv.sock", 0,SWOOLE_UNIX_STREAM); 文件描述符:/var/run/myserv.sock

4、Swoole 监听的文件描述符 的 onReceive 事件会收到 ffmpeg 转码的视频流。在通过 Swoole的WebSocket方法push 给连接到 WebSocket服务的 客户端发送视频流。

PHP与阿里云视频直播API开发视频直播

1.下载sdk放入项目文件夹中

63b8f6f73d99a5510fc7e4869430f893.png
748d0dbced49f229f02208b79e6d8256.png
63cef5e026cb360e01b90f580dda0251.png

核心就是aliyun-php-sdk-core,它的配置文件会自动加载相应的类

2.引入文件

include_once LIB_PATH . 'ORG/aliyun-openapi/aliyun-php-sdk-core/Config.php';

3.配置客户端对象,需要Access Key ID,Access Key Secret

$iClientProfile = DefaultProfile::getProfile("cn-hangzhou", "xxxx", "xxxx");  // Access Key ID,Access Key Secret$client = new DefaultAcsClient($iClientProfile);

4.调用请求类,并配置参数,就拿直播推流历史为例

$request = new liveRequestV20161101DescribeLiveStreamsPublishListRequest();$request ->setDomainName('live.yunlutong.com');$request ->setAppName('yunlutong');$request ->setStreamName('demo');$request ->setStartTime('2020-03-01T19:00:00Z');$request ->setEndTime('2020-03-29T19:00:00Z');

5.发起请求

//针对阿里云进行请求$response = $client->getAcsResponse($request);exit(json_encode($response));

完整代码如下

<?php /** * 直播相关接口 */class LiveAction extends ApiAction{    protected function _initialize()    {        parent::_initialize();    }    // 获取推流历史    public function DescribeLiveStreamsPublishList() {        include_once LIB_PATH . 'ORG/aliyun-openapi/aliyun-php-sdk-core/Config.php';        $iClientProfile = DefaultProfile::getProfile("cn-hangzhou", "xxxx", "xxxx");  // Access Key ID,Access Key Secret        $client = new DefaultAcsClient($iClientProfile);        $request = new liveRequestV20161101DescribeLiveStreamsPublishListRequest();        $request ->setDomainName('live.yunlutong.com');        $request ->setAppName('yunlutong');        $request ->setStreamName('demo');        $request ->setStartTime('2020-03-01T19:00:00Z');        $request ->setEndTime('2020-03-29T19:00:00Z');        //针对阿里云进行请求        $response = $client->getAcsResponse($request);        exit(json_encode($response));    }}

返回的数据

f960e1019ef15dc66bc85ff7c4713cb9.png

其他的接口请求也都类似这样,就不在这里一一列举,更多会用到的API,你是要查看API文档的,地址:https://help.aliyun.com/document_detail/48207.html

视频直播生成推流地址和播放地址的程序示例

直播推流地址和播放地址本身没有API接口,需要在客户端自行拼接地址,然后使用推流工具或者播放器对其推流或播放。

示例代码

<?phpfunction  push_url($push_domain,$push_key,$expireTime,$appName,$streamName){        $push_url = '';        //未开启鉴权Key的情况下        if($push_key==''){                $push_url = 'rtmp://'.$push_domain.'/'.$appName.'/'.$streamName;                echo $push_url;                return;        }        $timeStamp = time() + $expireTime;        $sstring = '/'.$appName.'/'.$streamName.'-'.$timeStamp.'-0-0-'.$push_key;        $md5hash = md5($sstring);        $push_url = 'rtmp://'.$push_domain.'/'.$appName.'/'.$streamName.'?auth_key='.$timeStamp.'-0-0-'.$md5hash;        echo $push_url;        echo PHP_EOL;        return;}function play_url($play_domain,$play_key,$expireTime,$appName,$streamName){        //未开启鉴权Key的情况下        if($play_key==''){                $rtmp_play_url = 'rtmp://'.$play_domain.'/'.$appName.'/'.$streamName;                $flv_play_url = 'http://'.$play_domain.'/'.$appName.'/'.$streamName.'.flv';                $hls_play_url = 'http://'.$play_domain.'/'.$appName.'/'.$streamName.'.m3u8';        }else{                $timeStamp = time() + $expireTime;                $rtmp_sstring = '/'.$appName.'/'.$streamName.'-'.$timeStamp.'-0-0-'.$play_key;                $rtmp_md5hash = md5($rtmp_sstring);                $rtmp_play_url = 'rtmp://'.$play_domain.'/'.$appName.'/'.$streamName.'?auth_key='.$timeStamp.'-0-0-'.$rtmp_md5hash;                $flv_sstring = '/'.$appName.'/'.$streamName.'.flv-'.$timeStamp.'-0-0-'.$play_key;                $flv_md5hash = md5($flv_sstring);                $flv_play_url = 'http://'.$play_domain.'/'.$appName.'/'.$streamName.'.flv?auth_key='.$timeStamp.'-0-0-'.$flv_md5hash;                $hls_sstring = '/'.$appName.'/'.$streamName.'.m3u8-'.$timeStamp.'-0-0-'.$play_key;                $hls_md5hash = md5($hls_sstring);                $hls_play_url = 'http://'.$play_domain.'/'.$appName.'/'.$streamName.'.m3u8?auth_key='.$timeStamp.'-0-0-'.$hls_md5hash;        }        echo 'rtmp播放地址: '.$rtmp_play_url;        echo PHP_EOL;        echo 'flv播放地址: '.$flv_play_url;        echo PHP_EOL;        echo 'hls播放地址: '.$hls_play_url;        echo PHP_EOL;        return;}//推流域名$push_domain = 'testpush.cn';//推流域名配置的鉴权Key$push_key = 'test_Push_key';//生成随机的AppName$appName = md5(uniqid(microtime(true),true));//生成随机的StreamNmae$streamName = md5(uniqid(microtime(true),true));//配置过期时间为1小时$expireTime = 3600;//播放域名$play_domain = 'testPlay.cn';//播放域名配置的鉴权Key$play_key = 'test_play_key';push_url($push_domain,$push_key,$expireTime,$appName,$streamName);play_url($play_domain,$play_key,$expireTime,$appName,$streamName);?>

啥?swoole你还不会,小编这里准备swoole全套视频,免费分享!!

非常抱歉由于头条规则无法发放资料外链,领取方式:点赞关注小编后私信【资料】获取资料领取方式!

部分资料展示:

0be021b60b2df8f08b3c0e0edb9f431f.gif
fc5d2916a341d47253e5c22423560a10.gif
fff4d1be809f9651729e288a1739bc3a.png
02de08f715b25a54ee003bdbc144d539.png
43e2aaa6e4ffbbd7232dda819816aa0b.png

领取方式:点赞关注小编后私信【资料】获取资料领取方式!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHP 仿陌陌直播,此项目利用 TP+Redis+Nginx+nginx-rtmp-module+ffmpeg+HLS +Swoole 的架构方案。开源RTMP server red5 java java用的较多,性能还是不错的! crtmpserver c++ 支持多种rtmp协议,移动设备以及IPTV相关网络协议 http://www.rtmpd.com/ Erlyvideo erlong 有开源和商业版本 https//github.com/erlyvideo/erlyvideo h aXeVideo haXe 一个实验性的,轻量级的服务器 http://code.google.com/p/haxevideo/ FluorineFx .Net To be defined http://www/fluorinefx.com nginx-rtmp c nginx模块 支持rtmp和HLS https://github.com/arut/nginx-rtmp-module 本人采用的则为第5个 Nginx-rtmp ,接下来讲解 安装过程。 安装 Nginx-rtmp 1、下载nginx-rtmp-module: nginx-rtmp-module的官方github地址:https://github.com/arut/nginx-rtmp-module 使用命令: git clone https://github.com/arut/nginx-rtmp-module.git 将nginx-rtmp-module下载到linux中。 2、安装nginx: nginx的官方网站为:http://nginx.org/en/download.html wget http://nginx.org/download/nginx-1.8.1.tar.gz tar -zxvf nginx-1.8.1.tar.gz cd nginx-1.8.1 ./configure --prefix=/usr/local/nginx --add-module=../nginx-rtmp-module --with-http_ssl_module make && make install 本次默认安装目录为:/root, add-module为下载的nginx-rtmp-module文件路径。 安装时候可能会报错没有安装openssl,需要执行命令: yum -y install openssl openssl-devel 3、修改nginx配置文件: vi /usr/local/nginx/conf/nginx.conf 加入以下内容: rtmp { server { listen 1935; #监听的端口 chunk_size 4000; application hls { #rtmp推流请求路径 live on; hls on; hls_path /usr/share/nginx/html/hls; hls_fragment 5s; } } } hls_path需要可读可写的权限。 修改http中的server模块: #server { #listen 81; #server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } 当然了,root可以跟据自己的需求来改的。 然后启动nginx: /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf 4、开始推流 好以上的配置后,就可以开始推流了,我们可以使用obs来推流。 在设置->串流 中填写信息:URL为 rtmp://xxx:1935/hls,xxx为你的服务器的IP地址,hls是用来存放流媒体的。 秘钥可以随便填写一个,用来播放的时候识别播放哪个流媒体的,例如填写test等。 填写完毕后,点击开始串流,就说明我们的流媒体服务器搭建成功了。 5、观看直播(拉流) 观看直播就比较简单了,可以简单的使用h5的vedio标签就可以观看了。 可以访问http://xxx:81/hls/mystream.m3u8来观看直播,其中xxx为你的服务器IP地址, 或者使用 Your browser does not support HTML5 video. 同上, xxx写的是你服务器IP地址。 然后使用手机访问这个网站就能够观看直播了。延迟大概在20S左右。 (在iOS的safari浏览器中可以正常观看) 写在最后 为什么延迟 那么高呢?这是因为服务器将视频流切断成一个个小的以.ts结尾的文件。 "截图" 而我们访问的是.m3u8文件,这个文件内容是将一个个ts文件串联起来的,这就达到了一个播放的效果,所以看起来会有很大的延迟。 "截图" 如果降低延迟也不是没有方法,可以设置切片生成的大小以及访问的速度,但是这样大大增加了服务器的压力。 当然,我们也可以用rtmp拉流工具(VLC等)来看该直播,延迟大概在2-5S左右,拉流地址与推流地址一致。 后台一键安装 直接访问入口即可 初始admin admin 采用Bootstrap3精确定制的lyui除了拥有100%bootstrap体验外,融合了更多适合国人使用的前端组建。并且一套代码适应多种屏幕大小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值