sora2国内API接口,使用PHP制作生成视频工具
·
最近sora2已火爆全球,一句话一张图就能生成一个惊艳的视频,它不仅仅是生成图像序列,而是在一个“物理引擎”般的隐式模型中,理解并模拟现实世界中的一些基本规律,如物体运动、光影变化、材质互动等
既然那么火爆,我们使用PHP来做一个视频生成工具,首先我们先理清逻辑
第一步:调用接口生成视频
对接基础信息
API基础URL:https://api.6lala.com/
请求方法:所有接口均使用POST
| 参数名 | 类型 | 示例值 | 说明 |
| Content-Type | string |
application/json | 请求体格式 |
| Authorization | string | KEY |
牛啦啦的APIKEY |
视频生成接口
sora-2接口地址: api/sora/Ordinary/video (可生成10秒15秒的横竖屏视频)
sora-2-pro接口地址: api/sora/Advanced/video (可生成25秒的高清视频)
| 参数名 | 类型 | 示例值 | 必填 | 说明 |
| images | string | 否 | 参考图片URL | |
| prompt | string | 给我做一个创意广告视频 | 是 |
生成视频的提示词 |
| orientation | string | portrait | 是 |
portrait 竖屏 landscape 横屏 |
| duration | string | 15 | 否 | 视频时长/秒 10秒 15秒 |
| size | string | small | 否 |
视频质量 small 720p large 1080p 默认为small |
任务查询接口
查询接口地址:api/sora/Query/query
| 参数名 | 类型 | 示例值 | 必填 | 说明 |
| task_id | string |
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');
}
}
大概思路是这样,但是每个程序想实现的业务逻辑是不一样的,我只是给了一个思路例子,喜欢的请点赞收藏,感谢支持!
更多推荐


所有评论(0)