免费处理视频素材的网站:https://www.piaoquantv.com/clip/

腾讯云代码都很详细,可以在调试代码都有生成
https://cloud.tencent.com/document/product/266/35286
代码封装
引入文件

use TencentCloud\Common\Credential;
use TencentCloud\Common\Profile\ClientProfile;
use TencentCloud\Common\Profile\HttpProfile;
use TencentCloud\Common\Exception\TencentCloudSDKException;
use TencentCloud\Vod\V20180717\VodClient;

常量

    private $SECRET_ID          = ''; //密钥的 secretIdprivate $SECRET_KEY         = ''; //密钥的 secretKeyprivate $INTRODUCE_PREFIX   = 'TencentCloud\Vod\V20180717\Models\\';//引入腾讯云文件前缀private $HOST               = ['vod.tencentcloudapi.com'];//腾讯云请求 域名目前只需要 vod.tencentcloudapi.com 有需要往里面加private $METHOD_NAME        = ['ComposeMedia','DescribeMediaInfos','DescribeTaskDetail','DeleteMedia','ManageTask','ProcessMedia'];//接口方法名

封装方法

    /*** 腾讯云相关接口访问* @param array $param 请求参数* @param int $type 请求接口类型 1视频合成 2获取媒体详情 3任务详情 4删除视频 5终止任务 6视频转码处理* @param int $host 请求域名选择值* @throws* @return array*/function Interface(array $param, int $type, int $host=0){try {$cred = new Credential($this->SECRET_ID, $this->SECRET_KEY);$httpProfile = new HttpProfile();$httpProfile->setEndpoint($this->HOST[$host]);$clientProfile = new ClientProfile();$clientProfile->setHttpProfile($httpProfile);$client = new VodClient($cred, "", $clientProfile);$method_name = $this->METHOD_NAME[$type-1];//获取方法名$class = $this->INTRODUCE_PREFIX.$method_name.'Request';//获取类路径$req = new $class();$req->fromJsonString(json_encode($param));$resp = $client->$method_name($req);return json_decode($resp->toJsonString(),true);}catch(TencentCloudSDKException $e) {return ['code'=>400,'msg'=>$e];}}

参数在调试中生成的代码有 根据你需要的参数会生成对应的代码

完整的代码:(我这个是处理上传到抖音的视频的)

<?php
namespace app\service;
use app\BaseController;
use TencentCloud\Common\Credential;
use TencentCloud\Common\Profile\ClientProfile;
use TencentCloud\Common\Profile\HttpProfile;
use TencentCloud\Common\Exception\TencentCloudSDKException;
use TencentCloud\Vod\V20180717\VodClient;
use think\facade\Db;class TencentService extends BaseController{private $SECRET_ID          = ''; //密钥的 secretIdprivate $SECRET_KEY         = ''; //密钥的 secretKeyprivate $INTRODUCE_PREFIX   = 'TencentCloud\Vod\V20180717\Models\\';//引入腾讯云文件前缀private $HOST               = ['vod.tencentcloudapi.com'];//腾讯云请求 域名目前只需要 vod.tencentcloudapi.com 有需要往里面加private $METHOD_NAME        = ['ComposeMedia','DescribeMediaInfos','DescribeTaskDetail','DeleteMedia','ManageTask','ProcessMedia'];//接口方法名private $CLASS_ID           = [815251,814659,814710,824533];//分类id 分别是 一级分类id:音频、商户视频  二级分类id:商户宣传视频、商户合成视频(根据自己的需要创建 放到这里就可以)private $VIDEO_STENCIL_ID   = [880999,885999,885998,885997,885996,885995];//视频模版id(码率按顺序是 1000-6000)  需要让腾讯云技术将模版id改成 ABR模式(默认是CRF模式 文件大小只能往下压缩不能往上加  ABR模式可以往上加 极限是原视频的两倍)(根据自己的需要创建 放到这里就可以)private $AUDIO_BASIS        = [['id'=>'3701925919555099999','duration'=>78],['id'=>'3701925919553499999','duration'=>74],['id'=>'3701925919552199999','duration'=>85]];//音频信息(上传三个音频将 音频的id以及时长记录)private $VIDEO_DATA         = ['Type'=>'Video', 'VideoItem'=>['SourceMedia'=>'']];//视频数据private $AUDIO_DATA         = ['Type'=>'Audio', 'AudioItem'=>['SourceMedia'=>'','SourceMediaStartTime'=>1]];//音频数据 SourceMedia 是音频idprivate $TRANSITION         = ['Type'=>'Transition', 'TransitionItem'=>['Duration'=>0.1, 'Transitions'=>['Type'=>'']]];//视频过度数据 Duration 过度动画时间 单位秒 时间会根据这个减少 Transitions内的type是过度效果 对应 $GRADIENT_TYPE 里面的值private $EMPTY              = ['Type'=>'Empty', 'EmptyItem'=>['Duration'=>1]];//音乐过度数据 Duration 代表过度时间 单位秒 时长会根据这个增加public  $GRADIENT_TYPE      = ['ImageFadeInFadeOut', 'BowTieHorizontal', 'BowTieVertical', 'ButterflyWaveScrawler', 'Cannabisleaf', 'Circle', 'CircleCrop', 'Circleopen', 'Crosswarp', 'Cube', 'DoomScreenTransition', 'Doorway', 'Dreamy', 'DreamyZoom', 'FilmBurn', 'GlitchMemories', 'Heart', 'InvertedPageCurl', 'Luma', 'Mosaic', 'Pinwheel', 'PolarFunction', 'PolkaDotsCurtain', 'Radial', 'RotateScaleFade', 'Squeeze', 'Swap', 'Swirl', 'UndulatingBurnOutSwirl', 'Windowblinds', 'WipeDown', 'WipeLeft', 'WipeRight', 'WipeUp', 'ZoomInCircles'];//合并视频的渐变方式private $SIGN_TIME          = 60*10;//客戶端 签名有效时长 单位秒private $VIDEO_RAND_VAL     = 25;//视频截取时间随机取值范围 单位/100毫秒public  $QUANTITY           = ['trigger_num'=>10,'synthesis_num'=>20,'limit_num'=>4,'video_time'=>60,'give_up_time'=>5];//数 分别是 trigger_num:触发数(剩余多少宣传视频触发) synthesis_num:合成视频数量 limit_num:合成视频最少需要多少个宣传视频 video_time:合成视频最长视频时间 give_up_time:放弃时长(距离一分钟还剩多少秒时不在拼接新视频)public  $VIDEO_SIZE_LIMIT   = [5,40];//合成视频文件触发转码的文件大小限制private $VIDEO_RAND_AREA    = [3,5];//合成视频随机视频数/*** 腾讯云 签名 客户端* @throws* @return string*/function TencentSign(){$current = time();//确定签名的当前时间$expired = $current + $this->SIGN_TIME;  // 签名有效期$arg_list = ['secretId'          =>  $this->SECRET_ID,'currentTimeStamp'  =>  $current,'expireTime'        =>  $expired,'random'            =>  mt_rand()];// 向参数列表填入参数$original = http_build_query($arg_list);// 计算签名return base64_encode(hash_hmac('SHA1', $original, $this->SECRET_KEY, true).$original);}/*** 腾讯云相关接口访问* @param array $param 请求参数* @param int $type 请求接口类型 1视频合成 2获取媒体详情 3任务详情 4删除视频 5终止任务 6视频压缩* @param int $host 请求域名选择值* @throws* @return array*/function Interface(array $param, int $type, int $host=0){try {$cred = new Credential($this->SECRET_ID, $this->SECRET_KEY);$httpProfile = new HttpProfile();$httpProfile->setEndpoint($this->HOST[$host]);$clientProfile = new ClientProfile();$clientProfile->setHttpProfile($httpProfile);$client = new VodClient($cred, "", $clientProfile);$method_name = $this->METHOD_NAME[$type-1];//获取方法名$class = $this->INTRODUCE_PREFIX.$method_name.'Request';//获取类路径if($type==1)$param['Output'] = ['FileName'=>date('Ymd').rand(),'ClassId'=>$this->CLASS_ID[3],'Container'=>'mp4','AudioStream' => ['SampleRate' => 48000]];//拼接输出视频信息$req = new $class();$req->fromJsonString(json_encode($param));$resp = $client->$method_name($req);return json_decode($resp->toJsonString(),true);}catch(TencentCloudSDKException $e) {return ['code'=>400,'msg'=>$e];}}/*** 获取视频详情* @param int $merchant_id 商户id* @throws* @return array*/function GetVideoDetail(int $merchant_id){$FileId = Db::name('merchant_video')->where([['merchant_id','=',$merchant_id],['type','=',2],['is_use','=',1]])->whereNotBetween('size',$this->VIDEO_SIZE_LIMIT)->column('fieldId');if(count($FileId)==0)return ['code'=>200,'msg'=>'暂无需视频详情'];$return = $this->Interface(['FileIds'=>$FileId,'Filters'=>['transcodeInfo']],2);if(empty($return['MediaInfoSet'][0]['FileId']))return ['code'=>400,'msg'=>'获取视频详情失败'];foreach($return['MediaInfoSet'] as $v){if(empty($v['TranscodeInfo']['TranscodeSet'][1]['Definition']))continue;$size = (int)($v['TranscodeInfo']['TranscodeSet'][1]['Size']/1048576);if($size<$this->VIDEO_SIZE_LIMIT[0]||$size>$this->VIDEO_SIZE_LIMIT[1]){$save = ['is_use'=>2];}else{$save = ['video'=>$v['TranscodeInfo']['TranscodeSet'][1]['Url'],'size'=>$size];}Db::name('merchant_video')->where('fieldId',$v['FileId'])->save($save);}return ['code'=>200,'msg'=>'处理完成'];}/*** 宣传视频合成* @param int $merchant_id 商户id* @throws* @return array*/function VideoSynthesis(int $merchant_id){$return = $this->SynthesisJudgment($merchant_id);if($return['code']!=200)return $return;$num = $return['num'];for($i=0 ;$i<$num ;$i++){$rand_num = mt_rand($this->VIDEO_RAND_AREA[0],$this->VIDEO_RAND_AREA[1]);$video = Db::query('select id,fieldId,duration from backend_merchant_video where merchant_id = '.$merchant_id.' and type = 1 order by rand() limit '.$rand_num);//随机获取两条视频信息$data = $this->SynthesisDealWith($video);if($data['code']!=200)continue;$return = $this->Interface($data['data'],1);//合成视频if(empty($return['TaskId']))continue;$add[] = ['merchant_id'=>$merchant_id,'TaskId'=>$return['TaskId'],'name'=>'合成视频','type'=>2,'duration'=>$data['duration'],'out'=>$data['out'],'create_time'=>date('Y-m-d H:i:s')];}$return = Db::name('merchant_video')->insertAll($add);if($return<1)return ['code'=>400,'msg'=>'数据表更改失败'];Db::name('merchant')->where('merchant_id',$merchant_id)->inc('use_num',$num)->update();return ['code'=>200,'msg'=>'合成视频成功'];}/*** 合成视频判断 及 获取可用数据 合成数量* @param int $merchant_id 文件id* @throws* @return array*/private function SynthesisJudgment(int $merchant_id){$available_num = Db::name('merchant_video')->where(['merchant_id'=>$merchant_id,'type'=>2,'is_use'=>1])->count();//获取可用宣传视频数if($available_num>$this->QUANTITY['trigger_num'])return ['code'=>400,'msg'=>'可用视频还很充足'];$propaganda_num = Db::name('merchant_video')->where(['merchant_id'=>$merchant_id,'type'=>1])->count();if($propaganda_num<$this->QUANTITY['limit_num'])return ['code'=>400,'msg'=>'宣传视频不足'.$this->QUANTITY['limit_num'].'条'];$video_num = Db::name('merchant')->where('merchant_id',$merchant_id)->field('video_num,use_num')->find();//获取商户可合成视频的总数量以及使用数量$num = $video_num['video_num']-$video_num['use_num'];if($num<1)return ['code'=>400,'msg'=>'你合成视频的数量已达到上限,如还需合成视频请联系平台工作人员'];if($num>$this->QUANTITY['synthesis_num'])$num=$this->QUANTITY['synthesis_num'];return ['code'=>200,'num'=>$num];}/*** 获取合成视频网址* @param int $merchant_id 文件id* @throws* @return array*/function GetVideoUrl(int $merchant_id){$taskId = Db::name('merchant_video')->where(['merchant_id'=>$merchant_id,'type'=>2])->whereRaw('video is null and TaskId is not null')->field('TaskId,duration')->select();if(count($taskId)==0)return ['code'=>200,'msg'=>'网址已全'];foreach($taskId as $v){$return = $this->Interface(['TaskId'=>$v['TaskId']],3);//获取任务详情if(!empty($return['ComposeMediaTask']['Output']['FileUrl'])){$save = ['video'=>$return['ComposeMediaTask']['Output']['FileUrl'],'size'=>(int)($return['ComposeMediaTask']['MetaData']['Size']/1048576),'fieldId'=>$return['ComposeMediaTask']['Output']['FileId']];if($save['size']<=$this->VIDEO_SIZE_LIMIT[0]||$save['size']>=$this->VIDEO_SIZE_LIMIT[1]){switch(true) {case ($v['duration']>=50):$Definition = 1;break;case ($v['duration']<50&&$v['duration']>=35):$Definition = 2;break;case ($v['duration']<35&&$v['duration']>=20):$Definition = 3;break;default:$Definition = 5;}$this->Interface(['FileId' => $save['fieldId'], 'MediaProcessTask' => ['TranscodeTaskSet' => [['Definition' => $this->VIDEO_STENCIL_ID[$Definition]]]]],6);//视频转码}$return = Db::name('merchant_video')->where('TaskId',$v['TaskId'])->save($save);if($return<1)return ['code'=>400,'msg'=>'数据处理失败'];}}return ['code'=>200,'msg'=>'网址处理完成'];}/*** 合成视频数据处理* @param array $video_data 合成视频参数 包括 duration:时长 fieldId:文件id* @throws* @return array*/private function SynthesisDealWith(array $video_data){$data = ['Tracks'=>[['Type'=>'Video', 'TrackItems'=>[]]]];//创建数据集$duration = 0;//创建视频时长接收变量$val = 0;//创建自增值$out = ',';//创建混剪参数接收变量foreach($video_data as $v){$duration += $v['duration'];$out .= $v['id'].',';$data['Tracks'][0]['TrackItems'][$val] = $this->VIDEO_DATA;$data['Tracks'][0]['TrackItems'][$val]['VideoItem']['SourceMedia'] = $v['fieldId'];$rand = mt_rand(1,$this->VIDEO_RAND_VAL)/10;$duration -= $rand;$data['Tracks'][0]['TrackItems'][$val]['VideoItem']['SourceMediaStartTime'] = $rand;if($duration>=($this->QUANTITY['video_time']-$this->QUANTITY['give_up_time'])) {if($duration>$this->QUANTITY['video_time']){$data['Tracks'][0]['TrackItems'][$val]['VideoItem']['Duration'] = $v['duration']-$rand-($duration-$this->QUANTITY['video_time']);$duration = $this->QUANTITY['video_time'];}break;}$val++;if($v['id']!=$video_data[count($video_data)-1]['id']){$duration -= 0.1;//减去视频渐变时间$data['Tracks'][0]['TrackItems'][$val] = $this->TRANSITION;$data['Tracks'][0]['TrackItems'][$val]['TransitionItem']['Transitions']['Type'] = $this->GRADIENT_TYPE[rand(1,count($this->GRADIENT_TYPE)-1)];$val++;}}$data['Tracks'][1] = $this->AudioDealWith($duration);return ['code'=>200,'data'=>$data,'out'=>$out,'duration'=>$duration];}/*** 音频数据处理* @param float $duration 所需总时长* @throws* @return array*/private function AudioDealWith(float $duration){$audio = $this->AUDIO_BASIS[mt_rand(1,count($this->AUDIO_BASIS)-1)];$last_duration = $duration%$audio['duration'];//获取最后一轮音乐时长$len = (int)ceil($duration/$audio['duration']);//获取需要的背景音乐轮数$data = ['Type'=>'Audio', 'TrackItems'=>[]];//创建音频数据$val = 0;//创建自增值for($i=0 ;$i<$len ;$i++){$data['TrackItems'][$val] = $this->AUDIO_DATA;$data['TrackItems'][$val]['AudioItem']['SourceMedia'] = $audio['id'];if($i==$len-1){$data['TrackItems'][$val]['AudioItem']['Duration'] = $last_duration;}else{$val++;$data['TrackItems'][$val] = $this->EMPTY;$val++;}if($i==0)$data['TrackItems'][0]['AudioItem']['SourceMediaStartTime'] = 0;}return $data;}
}

我遇到的注意事项

  • 视频合成音频有很多杂音,是因为多加了这个参数 AudioOperations 这个参数是用来调整音量的但是不传其实也有声音的,把这个参数去掉就没有杂音了
  • 两个视频合成,视频与视频合成中间需要有 Transition 转场 Duration参数是转场时长 总视频时长会等于两个视频的时长减去这个参数值 同样的多音频也有转场参数 Empty
  • 合成的视频转码中Kbps只能转原视频的一半低一点,(Kbps是影响视频大小的重要因素,抖音上传的视频中需要 大于5M 就可以用到这个) 下面这段是腾讯云技术客服发我的,你需要找腾讯云的技术客服把你的 视频转码模版转成 ABR模式 你需要给你的模版id给他

云点播默认是按CRF模式(Constant Ratefactor )固定码率系数模式,即在不影响视觉体验的前提下,减少不必要帧的质量,不遵循特定的输出码率,达到减小码率的效果。RF的范围是
[0, 51]。其中0为无损模式,51质量最差。RF值加6,输出码率大概减少一半;减6,输出码率翻倍。从主观上讲,17~29是一个合理的范围,17往往被认为从视觉上看是无损的。
优点:减少存储和流量等资源的浪费
缺点:不能控制文件大小
【解决方案】
如果你们还是要固定转码码率,可以找我们配置ABR模式(Average Bitrate)平均目标码率模式。设置多少码率,就可以转出多少码率的文件。

  • 然后资源这块 那个存储资源一直显示了 但服务概况里有显示存储空间,客服说这块是没用完不显示资源占用 具体是不是 还不清楚

腾讯云,云点播,视频合成相关推荐

  1. getvod.php_php腾讯云点播视频加密

    php腾讯云点播视频加密,ProcessFile(案例为laravel) 路由: //视频详情 Route::get('video/info/{id}','Api\ProcessFileControl ...

  2. 腾讯云点播视频存储(Web端视频上传)

    官方文档 前言 所谓视频上传,是指开发者或其用户将视频文件上传到点播的视频存储中,以便进行视频处理.分发等. 一.简介 腾讯云点播支持如下几种视频上传方式: 控制台上传:在点播控制台上进行操作,将本地 ...

  3. 云点播视频-DRM-方案调研

    前段时间,朋友的一个公司网站视频点播接口被疯狂遍历请求,同时网上还出现了很多的针对这个网站视频的自动化视频下载工具.虽说是都是公开视频,但内容本身就是这个网站最大的价值,如果都通过工具下载视频观看,网 ...

  4. 李郁韬:短期爆发还是未来趋势?腾讯云海量音视频通信服务背后的技术发展

    面临特殊时期,无论远程办公.还是学校"停课不停学"都成为时下的必然选择,众多视频会议平台也在特殊环境下开启了短期免费开放及功能服务.但与此同时不可避免会带来突发的大规模在线视频与协 ...

  5. 揭秘腾讯云最新音视频及融合通信技术实践

    社交到视频会议,从金融到医疗,云端通信能力正在与传统的电话/IM.呼叫中心.企业通信融合,打通各个端与渠道的数据,实现实时互联与掌控.而音视频技术在其中扮演着重要的角色,如何为用户提供更低延迟.更佳体 ...

  6. “音”你而来,“视”而可见 腾讯云+社区音视频技术开发实战沙龙圆满结束...

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云技术沙龙团队发布于腾讯云云+社区 近年来,得益于移动互联网的普及和智能终端设备的广泛应用,短视频.直播.在线教学等音视频通信模式 ...

  7. php实现阿里云视频合成

    获取视频上传凭证,这个时候会产生一个"上传中"的空videoid,实际上是没有上传内容的: 通过获取到的uploadAuth/uploadAddress/videoId进行上传您本 ...

  8. “音”你而来,“视”而可见 腾讯云+社区音视频技术开发实战沙龙圆满结束... 1

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云技术沙龙团队发布于腾讯云云+社区 近年来,得益于移动互联网的普及和智能终端设备的广泛应用,短视频.直播.在线教学等音视频通信模式 ...

  9. 动态舞蹈舞动词云图跳跃舞蹈词云视频合成制作 自定义视频素材 自定义词组词频

    动态舞蹈舞动词云图跳跃舞蹈词云视频合成制作 自定义视频素材 制作代码自行记录日记(以防日久忘记): 篇一:下载视频素材 you-get  视频网址 篇二:解析视频并分割转化成图片 import cv2 ...

  10. uniapp对接腾讯云IM+音视频。音视频含UI集成

    uniapp对接腾讯云IM+音视频 文章目录 uniapp对接腾讯云IM+音视频 前言 一.准备工作 二.使用步骤 1.App.vue配置 2.登录时操作 login.vue 3.使用方法 一.音视频 ...

最新文章

  1. 基于Java的全文索引
  2. oracle 12c pl/sql语言,ORACLE 12C SQL语句中通过with 定义PL/SQL 函数
  3. react取消捕获_React学习笔记(三)
  4. 华为云企业级Redis评测第一期:稳定性与扩容表现
  5. eigrp与ospf的综合实验(还是要想想办法才做得出来哦)
  6. 【高德地图API】从零开始学高德JS API(四)搜索服务——POI搜索|自动完成|输入提示|行政区域|交叉路口|自有数据检索...
  7. Tomcat、Servlet、Servlet容器
  8. Nexus5 破解电信关键步骤
  9. 去伪、存真、打破、重塑……网贷业暴雷潮之下的敬畏与回归
  10. PS改变证件照片背景颜色
  11. tumblr_如何在您的Tumblr博客中添加论坛
  12. Unity网络——断线重连
  13. java java java java
  14. 梅捷计算机主板价格,梅捷H81亲民主板逆袭!新到货仅售499元
  15. c语言实数运算1,C语言设计实数四则运算运用MAKEFILE,急用
  16. matlab中拉式域转时间域,Bark域介绍和线性频率域转换到Bark域
  17. 从零在FPG上实现OFDM(一)
  18. orcle 删除表报正在使用_oracle删除正在连接的用户,解除锁定的表
  19. java-net-php-python-12ssm商家后台管理系统计算机毕业设计程序
  20. 【附源码】计算机毕业设计SSM小区停车计费管理系统

热门文章

  1. Android 手机QQ临时会话
  2. 海上风电运维船未来前景如何?甲板船之家帮你解开疑问
  3. 去吧!设计模式之桥接模式
  4. 打出“人工智能+物流”牌,旷视就能重拾资本信任?
  5. 探秘金山隐私保险箱 (解密出加密的数据)
  6. Laravel Eloquent 必备的实用技巧
  7. laravel的Eloquent模型
  8. iOS开发 手势密码解锁和指纹TouchID解锁
  9. github连接显示隐私设置错误的解决方案
  10. Linux 之父亮相,这个开源社区要“搞大事”