Laravel视频上传到OSS后利用MPS转码

1、创建OSS存储空间

在这里插入图片描述
在这里插入图片描述

2、创建媒体处理MPS

在这里插入图片描述

3、安装阿里云oss的SDK和MPS的SDK

composer require aliyuncs/oss-sdk-php
composer require obacm/aliyun-openapi-mts

4、使用OSS上传+转码功能

	//OSS上传
    public function OssUploadFile(Request $request)
    {

        $accessKeyId = '';
        $accessKeySecret = '';
        // Endpoint以深圳为例,其它Region请按实际情况填写。
        $endpoint = "http://oss-cn-shenzhen.aliyuncs.com";
        // 存储空间名称
        $bucket = "rongyun-jxtest";

        //laravel 获取上传文件
        $tmpFile_A = $request->file('file');
        //生成上传OSS后的路径+文件名(注意:路径禁止以"/"开头)
        $object_A = 'aa/' . date("Y_M_D_H_M_S") . '.' . $tmpFile_A->getClientOriginalExtension();
        // 获取临时文件
        $filePath_A = $tmpFile_A->getPath() . '/' . $tmpFile_A->getFilename();
        //OssClient
        $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
        $info_A = $ossClient->uploadFile($bucket, $object_A, $filePath_A);//为了获取上传后的文件信息
        //判断是否上传成功
        if ($info_A['oss-request-url']) {
            #上传成功
            //dd('上传成功');
            //dd($object_A);
            #调用转码方法
            $this->OssMts($object_A);
        } else {
            #上传失败
            dd('上传失败');
        }
    }
// 转码
 /**
     * 阿里云媒体处理—转码
     * @param $oss_input_object_name :OSS中需要转码的文件名,如'Test/input_video001.mp4'
     */
    public function OssMts()
    {
    	//上传文件名称,拿oss上传的文件名
        $oss_input_object_name = 'aa/2023_Aug_Thu_03_Aug_th.mp4';
        #转码公共参数配置区域
        $access_key_id = '';
        $access_key_secret = '';
        //您需要操作的OSS存储空间的所在地,例如'cn-shenzhen'表示‘深圳’
        $mps_region_id = 'cn-shenzhen';

        $pipeline_id = '';//管道ID(//您的案例媒体处理控制台->全局设置->管道->管道ID)
        $template_id = '';//模板ID(官方文档Deom中默认,你自己在媒体处理->全局设置->转码模板中自己创建一个也可以,不会的创建就用官方Demo给的这个,或自行科普)

        $oss_location = 'oss-cn-shenzhen';//您需要操作的OSS存储空间的所在地就是OSS存储空间概览->外网访问EndPoint(地域节点)的前缀,(我的是北京,所以写'oss-cn-beijing')
        $oss_bucket = 'rongyun-jxtest';//你的Oss存储空间bucket名称


        //待转码文件(前面上传方法成功后,调用转码方法传进来的参数)
        $oss_input_object = $oss_input_object_name;
        //转码完毕后输出的文件名(你也可以自己加路径,切记文件路径开头不能使用‘/’或者‘\’开头,这个oss手动创建文件夹时会有提示,如果想要覆盖原先的路径就跟前面写一样的路径命名即可)
        $oss_output_object = 'test/test.mp4';

        $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 SubmitJobsRequest();
        $request->setAcceptFormat('JSON');
        # Input 输入待转码的OSS文件
        $input = [
            'Location' => $oss_location,
            'Bucket' => $oss_bucket,
            'Object' => urlencode($oss_input_object)
        ];
        $request->setInput(json_encode($input));
        # Output 输出转码完毕的OSS文件
        $output = [
            'OutputObject' => urlencode($oss_output_object)
        ];
        # Ouput->Container 转码完毕后的格式
        $output['Container'] = array('Format' => 'mp4');
        # Ouput->Video 输入视频配置
        //本数组中的参数value 根据你的实际需求自己定义
        $output['Video'] = [
            'Codec' => 'H.264',//编码格式
            'Bitrate' => 1500,//比特率/码率
            'Width' => 1280,//视频宽度
            'Fps' => 25//视频每秒帧数
        ];
        # Ouput->Audio 输入音频配置
        //本数组中的参数value 根据你的实际需求自己定义
        $output['Audio'] = [
            'Codec' => 'AAC',//解码器
            'Bitrate' => 128,//比特率
            'Channels' => 2,//频道
            'Samplerate' => 44100//抽样率
        ];

        # Ouput->TemplateId //输入模板化
        $output['TemplateId'] = $template_id;
        $outputs = array($output);
        #设置输出
//        dd(json_encode($outputs));

        $request->setOUtputs(json_encode($outputs));

        #设置输入OSS_Bucket名称
        $request->setOutputBucket($oss_bucket);
        #设置输入OSS_所在地
        $request->setOutputLocation($oss_location);

        # PipelineId 设置转码管道ID
        $request->setPipelineId($pipeline_id);

        # 发起请求并处理返回
        $response = $client->getAcsResponse($request);
        //判断转码是否成功
//        [{"OutputObject":"exampleOutput.mp4","TemplateId":"6181666213ab41b9bc21da8ff5ff****","WaterMarks":[{"InputFile":{"Bucket":"exampleBucket","Location":"oss-cn-hangzhou","Object":"image_01.png"},"WaterMarkTemplateId":"9b772ce2740d4d55876d8b542d47****"}],"UserData":"testid-001"}]

        if ($response->{'JobResultList'}->{'JobResult'}[0]->{'Success'}) {
            #转码成功
            dump($response);
            //删除未转码的源文件
            //拼接完成转码的文件路径并更新数据库
        } else {
            #转码失败
            'SubmitJobs Failed code:' .
            $response->{'JobResultList'}->{'JobResult'}[0]->{'Code'} .
            ' message:' .
            $response->{'JobResultList'}->{'JobResult'}[0]->{'Message'} . "\n";
        }


        # 发起请求并处理返回,下面这点捕获异常根据你的需求要不要都行,这个就是让你看报错和返回值的。
        try {
            $response = $client->getAcsResponse($request);
            print 'RequestId is:' . $response->{'RequestId'} . "\n";
            //RequestId is:9EF6A44A-7568-407F-B48C-A6A840C83ECE JobId is:5328efd028dc458da5c5fdb9bee7a245 这个是返回值
            if ($response->{'JobResultList'}->{'JobResult'}[0]->{'Success'}) {
                print 'JobId is:' .
                    $response->{'JobResultList'}->{'JobResult'}[0]->{'Job'}->{'JobId'} . "\n";
            } else {
                print 'SubmitJobs Failed code:' .
                    $response->{'JobResultList'}->{'JobResult'}[0]->{'Code'} .
                    ' message:' .
                    $response->{'JobResultList'}->{'JobResult'}[0]->{'Message'} . "\n";
            }
        } catch (\Exception $e) {
            print 'Error: ' . $e->getErrorCode() . ' Message: ' . $e->getMessage() . "\n";
        } catch (ClientException $e) {
            print 'Error: ' . $e->getErrorCode() . ' Message: ' . $e->getMessage() . "\n";
        }

    }

5、最终结果

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值