PHP视频转码

不同设备(例如智能手机、平板电脑、智能电视等)和播放器支持的视频格式存在差异。如果您希望将源视频文件转换为能够在目标设备或应用中正常播放的格式,确保视频内容可以在多平台上进行传播和分享,您可以使用视频转码功能。转码过程中可以调整视频的分辨率、帧率等参数,从而缩小视频文件体积,便于视频快速传输,同时节省存储空间。

前提条件

已绑定IMM。具体步骤,请参见绑定IMM

注意事项

  • 使用视频转码之前,确保您已了解该功能。详情请参见视频转码

  • 仅PHP SDK 2.7.0及以上版本支持视频转码。

  • 本文以华东1(杭州)外网Endpoint为例。如果您希望通过与OSS同地域的其他阿里云产品访问OSS,请使用内网Endpoint。关于OSS支持的Region与Endpoint的对应关系,请参见OSS访问域名、数据中心、开放端口

  • 本文以从环境变量读取访问凭证为例。如何配置访问凭证,请参见配置访问凭证

  • 本文以OSS域名新建OSSClient为例。如果您希望通过自定义域名、STS等方式新建OSSClient,请参见初始化

  • 要执行视频转码任务,您必须拥有OSS以及IMM相关权限。更多信息,请参见权限说明

示例代码

以下代码用于使用异步方式进行视频转码。

<?php
if (is_file(__DIR__ . '/../autoload.php')) {
    require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
    require_once __DIR__ . '/../vendor/autoload.php';
}

use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
use OSS\Core\OssException;

try {
    // 从环境变量中获取访问凭证,并保存在provider中。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
    $provider = new EnvironmentVariableCredentialsProvider();
    // 填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
    $endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
    // 指定Bucket名称。
    $bucket = "examplebucket";
    $config = array(
        "provider" => $provider,
        "endpoint" => $endpoint,
        "bucket" => $bucket
        "signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
        "region"=> "cn-hangzhou"
    );
    $ossClient = new OssClient($config);
    // 指定原视频文件名称。
    $source_object = 'src.mp4';
    // 指定处理后的视频文件名称。
    $target_object = 'dest.avi';
    // 对原视频文件进行视频转码。转码输出媒体文件容器为avi,视频流格式为H.265,分辨率为1920x1080,帧率为30 fps,视频码率为2 Mbps;音频编码格式为aac,音频码率为100 Kbps,并禁用字幕流。
    $process = 'video/convert,f_avi,vcodec_h265,s_1920x1080,vb_2000000,fps_30,acodec_aac,ab_100000,sn_1' .
        '|sys/saveas' .
        ',o_' . base64url_encode($target_object) .
        ',b_' . base64url_encode($bucket);
    $result = $ossClient->asyncProcessObject($bucket, $source_object, $process);
    var_dump($result);
} catch (OssException $e) {
    printf($e->getMessage() . "\n");
    return;
}

function base64url_encode($data)
{
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}