最近sora2已火爆全球,一句话一张图就能生成一个惊艳的视频,它不仅仅是生成图像序列,而是在一个“物理引擎”般的隐式模型中,理解并模拟现实世界中的一些基本规律,如物体运动、光影变化、材质互动等

既然那么火爆,我们使用PHP来做一个视频生成工具,首先我们先理清逻辑
第一步:调用接口生成视频

对接基础信息
API基础URL:https://api.6lala.com/
请求方法:所有接口均使用POST

参数名类型示例值说明
Content-Typestring 

application/json

请求体格式
Authorizationstring KEY

牛啦啦的APIKEY

视频生成接口
sora-2接口地址: api/sora/Ordinary/video (可生成10秒15秒的横竖屏视频)
sora-2-pro接口地址: api/sora/Advanced/video (可生成25秒的高清视频)

参数名类型示例值必填说明
imagesstring 

否参考图片URL
promptstring 给我做一个创意广告视频是

生成视频的提示词

orientationstringportrait是

portrait 竖屏 landscape 横屏

durationstring15否视频时长/秒 10秒 15秒
sizestringsmall否

视频质量 small 720p large 1080p 默认为small

任务查询接口
查询接口地址:api/sora/Query/query

参数名类型示例值必填说明
task_idstring 

k3cvave9w3pvnrng3lpjme7ndf

是

任务ID

下面贴出PHP请求接口的示例

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
   CURLOPT_URL => 'https://api.6lala.com/api/sora/Advanced/video',
   CURLOPT_RETURNTRANSFER => true,
   CURLOPT_ENCODING => '',
   CURLOPT_MAXREDIRS => 10,
   CURLOPT_TIMEOUT => 0,
   CURLOPT_FOLLOWLOCATION => true,
   CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
   CURLOPT_CUSTOMREQUEST => 'POST',
   CURLOPT_POSTFIELDS =>'{
    "images": "string",
    "prompt": "string",
    "orientation": "string",
    "duration": "string",
    "size": "string"
}',
   CURLOPT_HTTPHEADER => array(
      'Authorization: key',
      'Content-Type: application/json'
   ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;


第二步:使用宝塔的“守护进程”自动查询接口返回的信息,如果成功则把视频链接加入数据库,失败反之

public function Generate(){
        try {

            // 1. 检查队列是否有剩余任务,没有则从数据库补充
            $models = DcsoraWorkModel::withoutGlobalScope()->where('status',1)->order('id','asc')->limit(self::LIMIT)->select();
            if ($models->isEmpty()) {
                return;
            }
            $count = count($models);
            writeLog("开始处理视频:数量{$count}", 'sora视频生成', 'tasks');
            foreach ($models as $model) {
                $api_key = dc_config('api','apikey');
                if(empty($api_key)){
                    writeLog("saasid:{$model['saasid']} 没有配置API KEY",'sora视频生成','tasks');
                    continue;
                }
                $request = new Http($api_key);
                $postData = [
                    'task_id' => $model['task_id'],
                ];
                $_request = $request->post('api/sora/Query/query',$postData);
                if(!empty($_request['data']['status'])){
                    DcsoraUserModel::beginTrans();
                    $res2 = true;
                    $res3 = true;
                    if($_request['data']['status'] == 1){   //执行中
                        $updata['status'] = 1;
                        $updata['url'] = '';
                        $updata['img'] = '';
                    }elseif($_request['data']['status'] == 2){  //成功
                        $updata['status'] = 2;
                        $updata['url'] = $_request['data']['url'];
                        $updata['img'] = $_request['data']['img'];
                    }elseif($_request['data']['status'] == 3){  //失败
                        $updata['status'] = 3;
                        $updata['url'] = '';
                        $updata['img'] = '';
                        $user = DcsoraUserModel::where('id',$model['uid'])->find();
                        $res2 = DcsoraUserModel::where('id',$model['uid'])->setInc('integral',$model['points']);
                        $res3 = DcsoraUserBillModel::income($model['uid'],$model['id'],'生成失败退回积分','integral','user',$model['points'],$user['integral'] + $model['points']);
                    }
                    $updata['reqnum'] = $model['reqnum'] + 1;
                    $res1 = DcsoraWorkModel::update($updata,['id'=>$model['id']]);
                    $res = $res1 && $res2 && $res3;
                    DcsoraUserModel::checkTrans($res);
                }else{
                    $updata['reqnum'] = $model['reqnum'] + 1;
                    $updata['req_msg'] = serialize($_request);
                    DcsoraWorkModel::update($updata,['id'=>$model['id']]);
                    writeLog("接口调用失败:{$_request['msg']}",'sora视频生成','tasks');
                }
            }
        } catch (\Exception $th) {
            writeLog("sora视频生成出错:{$th->getMessage()},Line:{$th->getLine()},File:{$th->getFile()}",'sora视频生成','tasks');
        }
    }


第三步:由于接口生成视频的链接有时限性,所以我们还必须把视频下载到本地

public function DownVideo(){
        try {
            $models = DcsoraWorkModel::withoutGlobalScope()->where('status',2)->where('down',0)->order('id','asc')->limit(self::DOWN_LIMIT)->select();
            if ($models->isEmpty()) {
                return;
            }
            $count = count($models);
            writeLog("开始下载视频:数量{$count}", 'sora视频生成', 'tasks');
            foreach ($models as $model) {
                $kg = dc_config('api','cuenchu_kg');
                $oss = dc_config('up','xuanze');

                if($oss == 'qiniu'){
                    $key = dc_config('up','qiniuoss_access_key');
                }elseif($oss == 'aliyun'){
                    $key = dc_config('up','alioss_access_id');
                }elseif($oss == 'qcloud'){
                    $key = dc_config('up','txoss_appid');
                }else{
                    $key = '';
                }
                //writeLog("saasid:{$model['saasid']}kg:{$kg} OOS:{$oss}",'sora视频生成','tasks');
                if(empty($kg) && $oss == 'local'){
                    continue;
                }
                if(empty($key)){
                    writeLog("saasid:{$model['saasid']} {$oss}没有配置OSS存储",'sora视频生成','tasks');
                    continue;
                }
                if(empty($model['url'])){
                    continue;
                }
                $upload     = new UploadService();
                try {
                    $result = $upload->uploadFromUrl(
                        $model['url'],
                        0, // 分类ID
                        'dcsora'
                    );
                    $resultData = $result->getData();
                    if(!empty($resultData['src'])){
                        DcsoraWorkModel::update(['down' => 1,'loacl_url' => $resultData['src']],['id'=>$model['id']]);
                    }
                } catch (\Exception $e) {
                    DcsoraWorkModel::update(['down' => 1],['id'=>$model['id']]);
                    writeLog("地址:{$model['url']}错误:{$e->getMessage()}",'sora视频下载','tasks');
                }

                sleep(1);


            }

        } catch (\Exception $th) {
            writeLog("sora视频下载出错:{$th->getMessage()},Line:{$th->getLine()},File:{$th->getFile()}",'sora视频下载','tasks');
        }
    }

大概思路是这样,但是每个程序想实现的业务逻辑是不一样的,我只是给了一个思路例子,喜欢的请点赞收藏,感谢支持!

更多推荐