阿里云oss内的视频使用媒体处理进行转码

PHP/Mysql/Nginx Alice 2个月前 (09-30) 134次浏览 2个评论

项目要求:在上传视频资源到阿里云 oss时,要求对视频进行压缩,一次性转为高清、标清、流畅视频

oss 内的视频可以使用媒体处理进行转码,媒体处理有 php 的sdk
参考:https://help.aliyun.com/document_detail/67663.html

项目框架:FastAdmin

安装 SDK:

1、下载源代码:

git clone https://github.com/aliyun/aliyun-openapi-php-sdk.git

我是直接下载的 ZIP 包,放到项目第三方库目录 vendor 下

2、添加引用

require_once '/aliyun-openapi-php-sdk/aliyun-php-sdk-core/Config.php';

3、自动加载媒体处理 SDK

编辑文件aliyun-openapi-php-sdk/aliyun-php-sdk-core/Config.php

找到内容//config sdk auto load path.,在后面添加

Autoloader::addAutoloadPath("aliyun-php-sdk-mts");

以下是具体代码:

<?php

namespace addons\alioss\controller;
include_once VENDOR_PATH . '/aliyun-openapi-php-sdk/aliyun-php-sdk-core/Config.php';

use DefaultAcsClient;
use DefaultProfile;
use GuzzleHttp\Exception\ClientException;
use ServerException;
use Mts\Request\V20140618 as Mts;


/**
 * 阿里 OSS 云储存
 *
 */
class Index
{
    public function params()
    {
        $url = $this->request->post('url'); //上传到阿里 oss 的视频地址,如:resource/62e13fd2f6ad3b7c66de0593ad17bbac.mp4
        $params['hd'] = $this->transfer($url, 'hd'); //高清;
        $params['sd'] = $this->transfer($url, 'sd'); //标清;
        $params['ld'] = $this->transfer($url, 'ld'); //流畅;
        
	//其他逻辑代码
	......
    }

    public function transfer($url, $type) {
        $access_key_id = 'xxxxxxxx';
        $access_key_secret = 'xxxxxxxx';
        $mps_region_id = 'cn-shenzhen';
        $pipeline_id = 'xxxxxxxx';      # 管道 ID
        if ($type == 'hd') {
            $template_id = 'S00000001-200030';    # 转码模板 ID - MP4-HD MP4-高清
        } elseif ($type == 'sd') {
            $template_id = 'S00000001-200020';    # 转码模板 ID - MP4-SD MP4-标清
        } elseif ($type == 'ld') {
            $template_id = 'S00000001-200010';    # 转码模板 ID - MP4-LD MP4-流畅
        }

        $oss_location 	= 'oss-cn-shenzhen';
        $oss_bucket 	= 'xxxxxxxx';
        # OSS 储存文件输入路径
        $oss_input_object 	= $url;
        # OSS 储存文件输出路径,如 resource/62e13fd2f6ad3b7c66de0593ad17bbac_hd.mp4
        $oss_output_object 	= substr($oss_input_object, 0, strlen($oss_input_object) - 4) . '_'. $type .'.mp4';
        # 创建 DefaultAcsClient 实例并初始化
        $clientProfile = DefaultProfile::getProfile(
            $mps_region_id,                   # Region ID
            $access_key_id,                   # AccessKey ID
            $access_key_secret                # AccessKey Secret
        );
        $client = new DefaultAcsClient($clientProfile);
        # 创建 API 请求并设置参数
        $request = new Mts\SubmitJobsRequest();
        $request->setAcceptFormat('JSON');
        # Input
        $input = array('Location' => $oss_location,
            'Bucket' => $oss_bucket,
            'Object' => urlencode($oss_input_object));
        $request->setInput(json_encode($input));
        # Output
        $output = array('OutputObject' => urlencode($oss_output_object));
        # Ouput->Container
        $output['Container'] = array('Format' => 'mp4');
        # Ouput->Video
        if ($type == 'hd') {
            $output['Video'] = array('Codec' =>'H.264',
                'Bitrate' => 1500,
                'Width' => 1280,
                'Fps' => 25);
        } elseif ($type == 'sd') {
            $output['Video'] = array('Codec' =>'H.264',
                'Bitrate' => 800,
                'Width' => 848,
                'Fps' => 20);
        } elseif ($type == 'ld') {
            $output['Video'] = array('Codec' =>'H.264',
                'Bitrate' => 400,
                'Width' => 640,
                'Fps' => 15);
        }

        # Ouput->TemplateId
        $output['TemplateId'] = $template_id;
        $outputs = array($output);
        $request->setOUtputs(json_encode($outputs));
        $request->setOutputBucket($oss_bucket);
        $request->setOutputLocation($oss_location);
        # PipelineId
        $request->setPipelineId($pipeline_id);

        # 发起请求并处理返回
        try {
            $response = $client->getAcsResponse($request);
            //转码 ID
            //print 'RequestId is:' . $response->{'RequestId'} . "\n";
            if ($response->{'JobResultList'}->{'JobResult'}[0]->{'Success'}) {
                return $oss_output_object;
                //print 'JobId is:' .
                    //$response->{'JobResultList'}->{'JobResult'}[0]->{'Job'}->{'JobId'} . "\n";
            } else {
                return 'SubmitJobs Failed code:' .
                    $response->{'JobResultList'}->{'JobResult'}[0]->{'Code'} .
                    ' message:' .
                    $response->{'JobResultList'}->{'JobResult'}[0]->{'Message'} . "\n";
            }
        } catch(ServerException $e) {
            return 'Error: ' . $e->getErrorCode() . ' Message: ' . $e->getMessage() . "\n";
        } catch(ClientException $e) {
            return 'Error: ' . $e->getErrorCode() . ' Message: ' . $e->getMessage() . "\n";
        }
    }
}

上述代码里的转码模板 ID,可以直接使用阿里的预置模板:https://help.aliyun.com/document_detail/29256.html

也可以按需求新增自定义转码模板:https://mps.console.aliyun.com/transcode/list,如下图:

阿里云 oss 内的视频使用媒体处理进行转码

转码处理是否成功,可以在控制台的“媒体处理 MPS/任务管理”查看,如下图:

阿里云 oss 内的视频使用媒体处理进行转码


女程序员博客 , 版权所有丨本站采用BY-NC-SA协议进行授权 , 转载请注明阿里云 oss 内的视频使用媒体处理进行转码

【声明】:本博客仅为分享信息,不参与任何交易,也非中介,所有内容仅代表个人观点,均不作直接、间接、法定、约定的保证,读者购买风险自担。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。

【关于安全】:任何 IDC 都有倒闭和跑路的可能,备份永远是最佳选择,服务器也是机器,不勤备份是对自己极不负责的表现,请保持良好的备份习惯。

喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(2)个小伙伴在吐槽
  1. 我是来想对你说,国庆节快乐! 玩的开心
    筑楼2021-09-30 17:45 回复
    • Alice
      哈哈,国庆都没出去玩 :razz:
      Alice2021-10-21 14:57 回复