阿里云视频点播转码 Composer 版

阿里云视频点播#

阿里云视频点播集是音视频采集、编辑、上传、自动化转码处理、媒体资源管理、高效云剪辑处理、分发加速、视频播放于一体的一站式音视频点播解决方案。

安装 SDK#

composer require alibabacloud/sdk

版本要求#

  • 您必须使用 PHP 5.5.0 或更高版本

    可通过 php -v 命令查看当前的 PHP 版本;若未安装,请到 PHP 官网下载合适的版本。

  • 使用 Composer 并优化自动加载 composer dump-autoload --optimize

详情使用可参考#

阿里云视频点播转码 Composer 版

DEMO#

<?php
/**
 * Notes: 视频点播
 * User : zzy
 * Date : 2020/1/15
 * Time : 10:23
 */

namespace App\Library;


use OSS\OssClient;
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
use AlibabaCloud\Vod\Vod;


class AliyunOnDemand
{

    private $accessKeyId = '';
    private $accessKeySecret = '';
    private $callback = '';
    private $client;


    public function __construct()
    {
        $this->accessKeyId = config('aliyun.oss.accessKeyId');
        $this->accessKeySecret = config('aliyun.oss.accessKeySecret');
        $this->callback = config('aliyun.onDemand.callback');
        $this->initVodClient();
    }

    /**
     * Notes: 初始化
     * User: zzy
     * Date: 2020/1/15
     * Time: 10:28
     * Version:
     */
    private function initVodClient()
    {
        $regionId = 'cn-shanghai';  // 点播服务接入区域
        $this->client = AlibabaCloud::accessKeyClient($this->accessKeyId, $this->accessKeySecret)
            ->regionId($regionId)
            ->connectTimeout(1)
            ->timeout(3)
            ->asDefaultClient();
    }

    /**
     * Notes: 初始化点播
     * User: zzy
     * Date: 2020/1/15
     * Time: 10:34
     * Version:
     * @param $uploadAuth
     * @param $uploadAddress
     */
    public function initOssClient($uploadAuth, $uploadAddress)
    {
        $ossClient = new OssClient($uploadAuth['AccessKeyId'], $uploadAuth['AccessKeySecret'], $uploadAddress['Endpoint'],
            false, $uploadAuth['SecurityToken']);
        $ossClient->setTimeout(86400 * 7);    // 设置请求超时时间,单位秒,默认是5184000秒, 建议不要设置太小,如果上传文件很大,消耗的时间会比较长
        $ossClient->setConnectTimeout(10);  // 设置连接超时时间,单位秒,默认是10秒
        return $ossClient;
    }


    /**
     * Notes: 获取播放地址
     * User: zzy
     * Date: 2020/1/15
     * Time: 10:45
     * Version:
     * @param $videoId
     * @return \AlibabaCloud\Client\Result\Result
     * @throws ClientException
     * @throws ServerException
     */
    public  function getPlayInfo($videoId)
    {
        try
        {
            $request = Vod::v20170321()->getPlayInfo()
                ->withVideoId($videoId)
                ->format('JSON')
                ->request();
            return array("status" => 1, "data" => $request);
        }
        catch (Exception $e)
        {
            return array("status" => 0, "data" => $e->getMessage());
        }
    }


    /**
     * Notes: 上传本地视频-点播转码
     * User: zzy
     * Date: 2020/1/15
     * Time: 10:51
     * Version:
     * @param $data
     */
    public  function localUploadLocalVideo($data, $isCallback = 1, $localFile)
    {

        $request = Vod::v20170321()->createUploadVideo();
        $request->withTitle($data['title']);//标题,UTF8,128大小
        $request->withFileName($data['fileName']);//视频源文件名
        $request->withDescription(isset($data['description']) ? $data['description'] : '');//描述,utf-8
        $request->withCoverURL(isset($data['coverURL']) ? $data['coverURL'] : '');//封面url
        $request->withCateId(isset($data['cateId']) ? $data['cateId'] : ''); //分类id
        $request->withTags(isset($data['tags']) ? $data['tags'] : '');      //标签,隔开
        $request->withTemplateGroupId(isset($data['templateGroupId']) ? $data['templateGroupId'] : ''); //转码模板组ID
        $request->withStorageLocation(isset($data['storageLocation']) ? $data['storageLocation'] : ''); //存储地址
        if($isCallback == 1)
        {
            $userData = array(
                "MessageCallback" => array("CallbackURL" => $this->callback),
                "Extend" => array("title" => $data['title']),
                'EventType' => 'TranscodeComplete',
            );
            $request->withUserData(json_encode($userData));
        }
        $result = $request->request();

        $videoId = $result->VideoId;

        $uploadAddress = json_decode(base64_decode($result->UploadAddress), true);
        $uploadAuth = json_decode(base64_decode($result->UploadAuth), true);
        $ossClient = $this->initOssClient($uploadAuth, $uploadAddress);
        $this->multipartUploadFile($ossClient, $uploadAddress, $localFile);
        return array("status" => 1, "data" => $videoId);
    }


    /**
     * Notes: 分片上传
     * User: zzy
     * Date: 2020/1/15
     * Time: 10:36
     * Version:
     * @param $ossClient
     * @param $uploadAddress
     * @param $localFile
     * @return mixed
     */
    public static function multipartUploadFile($ossClient, $uploadAddress, $localFile)
    {
        return $ossClient->multiuploadFile($uploadAddress['Bucket'], $uploadAddress['FileName'], $localFile);
    }


    /**
     * Notes: 刷新播放凭证
     * User: zzy
     * Date: 2020/1/15
     * Time: 14:45
     * Version:
     * @param $videoId
     */
    public function refreshUploadVideo($videoId)
    {
        $result = Vod::v20170321()
            ->refreshUploadVideo()
            ->withVideoId($videoId)
            ->request();

        return $result['VideoId'];
    }


    /**
     * URL批量拉取上传
     *
     *
     * @param $url
     * @param $title
     * @param $templateGroupId
     * @return array
     * @throws ClientException
     * @throws ServerException
     */
    public static function uploadMediaByURL($url, $title, $templateGroupId)
    {
        $uploadMetadataList          = [];
        $uploadMetadata              = [];
        $uploadMetadata['SourceUrl'] = $url;
        $uploadMetadata['Title']     = $title;
        $uploadMetadata['TemplateGroupId'] = $templateGroupId;
        $uploadMetadataList[]        = $uploadMetadata;
        $result = Vod::v20170321()
            ->uploadMediaByURL()
            ->withUploadURLs($url)
            ->withUploadMetadatas(json_encode($uploadMetadataList))
            ->connectTimeout(0)
            ->timeout(0)
            ->request()->toArray();
        return $result;
    }

    /**
     * 获取URL上传信息
     *
     * @return array
     * @throws ServerException
     * @throws ClientException
     */
    public  function getURLUploadInfos()
    {
        $result = Vod::v20170321()
            ->getURLUploadInfos()
            ->withUploadURLs('url1,url2')
            ->connectTimeout(60)
            ->timeout(65)
            ->request()->toArray();
        return $result['URLUploadInfoList'];

        /*     或
        $result = Vod::v20170321()
            ->getURLUploadInfos()
            ->withJobIds('jobId1,jobId2')
            ->connectTimeout(60)
            ->timeout(65)
            ->request()->toArray();*/
    }

}
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 6

要写就介绍一下。不然堆一堆代码放这的意义是什么?

4年前 评论
最闲的码农 (楼主) 4年前

提示 Class 'OSS\OssClient' not found

4年前 评论
最闲的码农 (楼主) 4年前
最闲的码农 (楼主) 4年前
yunat2018 (作者) 4年前
pszhao 4年前

主楼大哥哥 上传 转码 直接都在嘛

4年前 评论
最闲的码农 (楼主) 4年前
 $request->withTemplateGroupId(isset($data['templateGroupId']) ? $data['templateGroupId'] : ''); //转码模板组ID

@pszhao

4年前 评论

请教主楼 laravel 框架 有咨询插件吗? 就是装上了就是一个咨询系统

4年前 评论
最闲的码农 (楼主) 4年前
pszhao (作者) 4年前
最闲的码农 (楼主) 4年前