如何使用ffmpeg 实现10种特效
相关特效的名字
特效id 特效名
1 向上移动
2 向左移动
3 向下移动
4 颤抖
5 摇摆
6 雨刷
7 弹入
8 弹簧
9 轻微跳动
10 跳动
特效展示(同时汇总相关命令)
pad背景显示
pad背景透明
相关命令(一会再讲这些命令,先往下看)
# 合成特效语音
ffmpeg -y -loglevel error -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/674c13b4b531438e8fa634b49ad058cf.mp3 \
-i https://file.youlai.cn/cnkfile1/M02/98/48/32150062579EF23DD585D11F069C9848.wav -i https://file.youlai.cn/cnkfile1/M02/24/39/9C49A3FAFA05F200246ECCF04A952439.wav \-filter_complex "[0]volume='1'[w0]; \[1]adelay=27391|27391,volume='1'[w1]; [2]adelay=27391|27391,volume='1'[w2]; \[w0][w1][w2]amix=inputs=3:duration=first:dropout_transition=120" -f mp3 /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/674c13b4b531438e8fa634b49ad058cf_end.mp3# 音量标准化
ffmpeg -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/674c13b4b531438e8fa634b49ad058cf_end.mp3 -af loudnorm=I=-16:LRA=11:tp=-1.5 -y /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/674c13b4b531438e8fa634b49ad058cf_stardard.mp3# 向上移动ffmpeg -y -loglevel fatal -loop 1 -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/a7e7a1a96941472fa86e37e5b9e3fecc.png -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/71ba432626a0467dbcb873a196cf6e4b.mp4 \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:652.22827081866[v5];\[v5]pad=1304.4565416373:1304.4565416373:326.11413540933:326.11413540933:0x00F8FF@0.2[v1];\[v1]rotate='0*PI/180':ow='max(iw,ih)':oh=ow:c=none[v2];\[1][v2]overlay=\y='if(gte(t,0.76), if(gte(t,3.02), NAN,393.88586459067-min((t-0.76),1.2778844489612)*600 ),NAN):\x=-391.79900352788:shortest=1'\[v3]" -map [v3] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/a7e7a1a96941472fa86e37e5b9e3fecc.mp4# 向左移动ffmpeg -y -loglevel fatal -loop 1 -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/6bd2ed3c2cde443285f0da12e9bf03d0.png -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/a7e7a1a96941472fa86e37e5b9e3fecc.mp4 \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:388.44636971329[v5];\[v5]pad=776.89273942658:776.89273942658:194.22318485664:194.22318485664:0x00F8FF@0.2[v1];\[v1]rotate='0*PI/180':ow='max(iw,ih)':oh=ow:c=none[v2];\[1][v2]overlay=\y='if(gte(t,0.76), if(gte(t,3.02), NAN,191.61497976525),NAN):\x=1085.7768151434-min((t-0.76),0.95835738885612)*600 :shortest=1'\[v3]" -map [v3] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/6bd2ed3c2cde443285f0da12e9bf03d0.mp4# 向下移动ffmpeg -y -loglevel fatal -loop 1 -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/65daf9804f3e4f8f84df53724fb28736.png -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/6bd2ed3c2cde443285f0da12e9bf03d0.mp4 \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:338.29541316981[v5];\[v5]pad=676.59082633962:676.59082633962:169.1477065849:169.1477065849:0x00F8FF@0.2[v1];\[v1]rotate='0*PI/180':ow='max(iw,ih)':oh=ow:c=none[v2];\[1][v2]overlay=\y='if(gte(t,3.08), if(gte(t,4.62), NAN,-507.44311975471+min((t-3.08),0.66766169547593)*600 ),NAN):\x=303.65743686545:shortest=1'\[v3]" -map [v3] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/65daf9804f3e4f8f84df53724fb28736.mp4# 颤抖ffmpeg -y -loglevel fatal -loop 1 -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/9460654724694bbf83ed6c3a1f0b0c19.png -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/65daf9804f3e4f8f84df53724fb28736.mp4 \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:240[v5];\[v5]pad=480:480:120:120:0x00F8FF@0.2[v1];\[v1]rotate='59.604151827379*PI/180':ow='max(iw,ih)':oh=ow:c=none[v2];\[1][v2]overlay=\x='if(gte(t,4.68), if(gte(t,6.22), NAN,713.71212050647+mod(floor(n/3),2)*10 ),NAN ):\y=126.53647572709+mod(floor(n/3),2)*10:shortest=1'\[v3]" -map [v3] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/9460654724694bbf83ed6c3a1f0b0c19.mp4# 摇摆ffmpeg -y -loglevel fatal -loop 1 -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/74eed745c6574938b62688ca81d0342a.png -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/9460654724694bbf83ed6c3a1f0b0c19.mp4 \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:240[v5];\[v5]pad=480:480:120:120:0x00F8FF@0.2[v1];\[v1]rotate='318.664866283*PI/180+(15*PI/180)*sin(2*PI/0.4*t)':ow='max(iw,ih)':oh=ow:c=none[v2];\[1][v2]overlay=\x='if(gte(t,8.76), if(gte(t,13.08), NAN,122.89560094216 ),NAN ):\y=80.78114563749:shortest=1'\[v3]" -map [v3] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/74eed745c6574938b62688ca81d0342a.mp4# 雨刷
ffmpeg -y -loglevel fatal -loop 1 -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/a94137275201459a9f46b4a92b377c97.png -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/74eed745c6574938b62688ca81d0342a.mp4 \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:240[v5];\[v5]pad=672:672:96:96:0x00F8FF@0.2[v1];\[v1]rotate='0*PI/180-0.4*sin(8*PI/5*(t-13.5))':ow='max(iw,ih)':oh=ow:c=none[v2];\[1][v2]overlay=\x='if(gte(t,13.5), if(gte(t,14.798), NAN,410.69190672549 ),NAN ):\y=340.09427181257:shortest=1'\[v3]" -map [v3] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/a94137275201459a9f46b4a92b377c97.mp4# 弹入ffmpeg -y -loop 1 -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/f2292b7ca74c4f0bb2916a5bf3260182.png -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/a94137275201459a9f46b4a92b377c97.mp4 \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:327.36985856972[v5];\[v5]pad=1964.2191514183:1964.2191514183:818.4246464243:818.4246464243:0x00F8FF@0.2[v6];\[v6]scale=-1:'785.68766056733+2357.062981702*min(t-15.94,0.5)':eval=frame[v7];\[v7]rotate='189.98532547032*PI/180':ow='max(iw,ih)':oh=ow:c=none[v1];\[1][v1]overlay=\x='if(gte(t,15.94), if(gte(t,17.08), NAN,-8.7762423758301 ),NAN ):\y=-622.10957570916:shortest=1'[v2]" \-map [v2] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/f2292b7ca74c4f0bb2916a5bf3260182.mp4# 弹簧
ffmpeg -y -loop 1 -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/7d4397aa08234931b17425611094ff35.png -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/f2292b7ca74c4f0bb2916a5bf3260182.mp4 \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:240[v5];\[v5]pad=1440:1440:600:600:0x00F8FF@0.2[v6];\[v6]scale=-1:'\if(lte(t-17.72,0.5),360+2160*(t-17.72),\if(lte(t-18.22,0.5),1440-1728*(t-18.22),\if(lte(t-18.72,0.5),576+1152*(t-18.72),\if(lte(t-19.22,0.3),1296-960*(t-19.22),\1008))))':eval=frame[v7];\[v7]rotate='0*PI/180':ow='max(iw,ih)':oh=ow:c=none[v1];\[1][v1]overlay=\x='if(gte(t,17.72), if(gte(t,20.48), NAN,253.33333333333 ),NAN ):\y=-360:shortest=1'[v2]" \-map [v2] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/7d4397aa08234931b17425611094ff35.mp4# 轻微跳动
ffmpeg -y -loglevel fatal -loop 1 -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/fca4bc617a244a1f9ec9cd8cb00ac20a.png -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/7d4397aa08234931b17425611094ff35.mp4 \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:240[v5];\[v5]pad=480:480:120:120:0x00F8FF@0.2[v1];\[v1]rotate='0*PI/180+sin(PI*(2*(t-17.72)))*0.15':ow='max(iw,ih)':oh=ow:c=none[v2];\[1][v2]overlay=x='if(gte(t,17.72), if(gte(t,20.48), NAN,24.78953680786),NAN ):y=128.71530096945:shortest=1'\[v3]" -map [v3] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/fca4bc617a244a1f9ec9cd8cb00ac20a.mp4# 跳动
ffmpeg -y -loglevel fatal -loop 1 -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/724bcc836fb14a81b151df910b81935c.png -i /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/fca4bc617a244a1f9ec9cd8cb00ac20a.mp4 \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:240[v5];\[v5]pad=480:480:120:120:0x00F8FF@0.2[v1];\[v1]rotate=0*PI/180:ow='max(iw,ih)':oh=ow:c=none[v2];\[1][v2]overlay=x='if(gte(t,20.481), if(gte(t,21.02), NAN,408.49325431089),NAN ):y=if(gte(t,21.019014538326),-15.08716502643,min(-15.08716502643-80.7021807489*sin((t-20.481)*3/0.269007269163),-15.08716502643)):shortest=1'\[v3]" -map [v3] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k /Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/724bcc836fb14a81b151df910b81935c.mp4单个特效命令讲解
如何实现运动轨迹(简单版本 向左移动,向上移动,向下移动,使用简单版本)
点击进入详情页面
代码中的实现和相关的问题
那么这个时候旋转角度会出现问题,把四个角给切除了,怎么办?使用pad图层的方法
ffmpeg -y -loop 1 -i rotate_test.png -i 0329_short.mp4 -filter_complex "[0]format=pix_fmts=rgba[v5];[v5]rotate=30*PI/180:ow='max(iw,ih)':oh=ow:c=none[v0];[v0]scale=140:140[v1];[1][v1]overlay=x='if(gte(t,3), if(gte(t,6), NAN,1000-(t-3)*40 ),NAN ):y=200:shortest=1'[v2]" -map [v2] -c:v libx264 move.mp4ffmpeg -y -loop 1 -i t002.png -i 0329_short.mp4 -filter_complex "[0]format=pix_fmts=rgba[v5];[v5]rotate=30*PI/180:ow='max(iw,ih)':oh=ow:c=none[v0];[v0]scale=140:140[v1];[1][v1]overlay=x='if(gte(t,3), if(gte(t,6), NAN,1000-(t-3)*40 ),NAN ):y=200:shortest=1'[v2]" -map [v2] -c:v libx264 move.mp4image.png
相关代码参考
<?phpnamespace App\Console\Commands;use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Monolog\Utils;
use PhpOffice\PhpSpreadsheet\Shared\PasswordHasher;/*** Notes:特效视频的的合成脚本* User: zhangguofu* Date: 2021/4/21* Time: 11:02* Class TxCommand*/
class TxCommand extends Command
{//素材分类 默认0 1:gif动图 2:png图片const TYPE_GIF = 1;const TYPE_PNG = 2;const B_LEFT = 1280;//向左侧滑入起点const B_UP = 720;//向上滑动的起点const TEST_ID=128;//dev测试
// const TEST_ID=3520;//无视频
// const TEST_ID=3521;25个视频const FILE = "https://file.youlai.cn/";const U_FILE = "https://youlaiugc.oss-cn-shanghai.aliyuncs.com/";const O_SIZE=70;//默认初始化大小是70const HEIGHT = 720;const WIDTH = 1280;/*** The name and signature of the console command.** @var string*/protected $signature = 'TxCommand';/*** The console command description.** @var string*/protected $description = 'Command description';/*** Create a new command instance.** @return void*/public function __construct(){parent::__construct();}/*** Execute the console command.** @return mixed*/public function handle(){$str= "开始处理一条视频的时间开始:".date("H:i:s",time());echo $str;echo PHP_EOL;$arr = $this->getTime();
// dd($arr);$obj= DB::connection("mysql_dev")->table('cnk_ugc_answer')->select(['subtitle_video_url'])->where("id",self::TEST_ID)->first();
// dd($obj);$base_dir = "/Users/zhangguofu/Downloads/ftest/pika_mov/testfodder/";
// $origin_video=$this->getUuid().".mp4";//TODO 线上打开$origin_video='0420_short.mp4';$d_video=$base_dir.$origin_video;$video=self::U_FILE.$obj->subtitle_video_url;$shell = "wget {$video} -O {$d_video}";
// exec($shell);//TODO 线上打开$wav_stardard=$this->mergeVoice($base_dir,$origin_video,$arr,app(TxCommand::class));foreach ($arr as &$v) {//这里面是,循环所有的贴纸,并一一合成,gif调整尺寸和角度,展示时间,//png 随机生成动效$v = $this->getFodderUrl($v);if ($v['type'] == self::TYPE_GIF) {//TODO 线上打开$new_viedo = $this->gifShell($v, $origin_video, $base_dir);$origin_video = $new_viedo;
// dd($origin_video);}if ($v['type'] == self::TYPE_PNG) {$new_viedo = $this->getRandomTx($v, $origin_video, $base_dir);$origin_video = $new_viedo;
// dd($origin_video);}}unset($v);$str= "----处理结束".date("H:i:s",time());echo $str;echo PHP_EOL;$voice = $base_dir . $wav_stardard;$str = 'ffmpeg -y -loglevel error -i %s -i %s -c:v copy -map 0:v:0 -map 1:a:0 %s';$video_end=$rand=$this->getUuid() ."_end.mp4";$des_video_end=$base_dir.$video_end;$voice_shell = sprintf($str, $base_dir . $origin_video, $voice, $des_video_end);echo $voice_shell;exec($voice_shell);dd($video_end);//}/*** Notes:根据动画id生成特效视频并返回* User: zhangguofu* Date: 2021/4/25* Time: 11:49* @param $v* @param $origin_video* @param $base_dir* @return string*/public function getRandomTx($v, $origin_video, $base_dir){$animation_id = $v['animation_id'];$video_name = '';switch ($animation_id) {case 1:$video_name = $this->move_up($v, $origin_video, $base_dir);break;case 2:$video_name = $this->move_left($v, $origin_video, $base_dir);break;case 3:$video_name = $this->move_down($v, $origin_video, $base_dir);break;case 4:$video_name = $this->chandou($v, $origin_video, $base_dir);break;case 5:$video_name = $this->yaobai($v, $origin_video, $base_dir);break;case 6:$video_name = $this->yushua($v, $origin_video, $base_dir);break;case 7:$video_name = $this->tanru($v, $origin_video, $base_dir);break;case 8:$video_name = $this->tanhuang($v, $origin_video, $base_dir);break;case 9:$video_name = $this->xiaotiao($v, $origin_video, $base_dir);break;case 10:$video_name = $this->tiaodong($v, $origin_video, $base_dir);break;}return $video_name;}/*** Notes:gif 图片调整在视频中的尺寸 和旋转角度* User: zhangguofu* Date: 2021/4/22* Time: 16:21* @param $data array 对应的相关参数* @param $video string 对应的要处理的视频* @param $base_dir string 文件所在的目录* @return string*/public function gifShell($data, $video, $base_dir){$video = $base_dir . $video;$uuid = $this->getUuid();$gif = $uuid;$gif = $gif . ".gif";$gif = $base_dir . $gif;//下载gif素材exec("wget -c {$data['pic_url']} -O {$gif}");$des_video_name = $uuid . ".mp4";$des_video = $base_dir . $des_video_name;$px=$data['size_x']*2;$py=$data['size_y']*2;$nx=$data['coord_x']-$data['size_x']/2;$ny=$data['coord_y']-$data['size_y']/2;
// dd($px);//最长展示6s,超过6s不显示$data['et']=$data['et']-$data['bt']<6?$data['et']:$data['bt']+6;
// dd($data['et']);//旋转角度 和 大小,位置$gif_shell = '
ffmpeg -y -loglevel fatal -ignore_loop 0 -itsoffset %s -i %s -i %s \
-filter_complex \
"[0]format=pix_fmts=rgba[v0];[v0]scale=-1:%s[v5];\
[v5]pad=%s:%s:%s:%s:0x00F8FF@0.2[v1];\
[v1]rotate=\'%s*PI/180\':ow=\'max(iw,ih)\':oh=ow:c=none[v2];\
[1][v2]overlay=\
x=\'if(gte(t,%s), if(gte(t,%s), NAN,%s),NAN ):\
y=%s:shortest=1\'[v3]"\-map [v3] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k %s';$gif_shell=sprintf($gif_shell,$data['bt'],$gif,$video,$data['size_x'],$px,$py,$data['size_x']/2, $data['size_y']/2,$data['angle'],$data['bt'],$data['et'],$nx,$ny,$des_video);echo $gif_shell;echo PHP_EOL;exec($gif_shell);
// unlink($gif);
// unlink($video);//TODO 暂时保留视频,后期删除return $des_video_name;}/*** Notes:向上移动* User: zhangguofu* Date: 2021/4/22* Time: 15:03* @param $data array 对应的相关参数* @param $video string 对应的要处理的视频* @param $base_dir string 文件所在的目录*/public function move_up($data, $video, $base_dir){$video = $base_dir . $video;$uuid = $this->getUuid();$png = $uuid;$png = $png . ".png";$png = $base_dir . $png;//下载gif素材exec("wget -c {$data['pic_url']} -O {$png}");$des_video_name = $uuid . ".mp4";$des_video = $base_dir . $des_video_name;$px=$data['size_x']*2;$py=$data['size_y']*2;$nx=$data['coord_x']-$data['size_x']/2;$ny=$data['coord_y']-$data['size_y']/2;//旋转角度 和 大小,位置$png_shell = 'ffmpeg -y -loglevel fatal -loop 1 -i %s -i %s \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:%s[v5];\[v5]pad=%s:%s:%s:%s:0x00F8FF@0.2[v1];\[v1]rotate=\'%s*PI/180\':ow=\'max(iw,ih)\':oh=ow:c=none[v2];\[1][v2]overlay=\y=\'if(gte(t,%s), if(gte(t,%s), NAN,%s-min((t-%s),%s)*%s ),NAN):\x=%s:shortest=1\'\[v3]" -map [v3] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k %s';//需要计算y的滑行速度,在规定时间内移动到终点$length = self::B_UP - $data['coord_y'];//需要滑动的距离$speed=600;//滑动的速度$time_move=$length/$speed;
// dd($time_move);$png_shell = sprintf($png_shell, $png, $video, $data['size_x'],$px,$py,$data['size_x']/2, $data['size_y']/2,$data['angle'], $data['bt'], $data['et'], self::B_UP-$data['size_y']/2, $data['bt'],$time_move, $speed, $nx, $des_video);echo $png_shell;echo PHP_EOL;exec($png_shell);
// unlink($png);// unlink($video);//TODO 暂时保留视频,后期删除return $des_video_name;}/*** Notes:向下移动* User: zhangguofu* Date: 2021/4/22* Time: 15:03* @param $data array 对应的相关参数* @param $video string 对应的要处理的视频* @param $base_dir string 文件所在的目录*/public function move_down($data, $video, $base_dir){$video = $base_dir . $video;$uuid = $this->getUuid();$png = $uuid;$png = $png . ".png";$png = $base_dir . $png;//下载gif素材exec("wget -c {$data['pic_url']} -O {$png}");$des_video_name = $uuid . ".mp4";$des_video = $base_dir . $des_video_name;$px=$data['size_x']*2;$py=$data['size_y']*2;$nx=$data['coord_x']-$data['size_x']/2;$ny=$data['coord_y']-$data['size_y']/2;//旋转角度 和 大小,位置$png_shell = 'ffmpeg -y -loglevel fatal -loop 1 -i %s -i %s \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:%s[v5];\[v5]pad=%s:%s:%s:%s:0x00F8FF@0.2[v1];\[v1]rotate=\'%s*PI/180\':ow=\'max(iw,ih)\':oh=ow:c=none[v2];\[1][v2]overlay=\y=\'if(gte(t,%s), if(gte(t,%s), NAN,%s+min((t-%s),%s)*%s ),NAN):\x=%s:shortest=1\'\[v3]" -map [v3] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k %s';//需要计算y的滑行速度,在规定时间内移动到终点$length =$data['coord_y']+$data['size_y'];$speed=600;//滑动的速度$time_move=$length/$speed;$png_shell = sprintf($png_shell, $png, $video, $data['size_x'],$px,$py,$data['size_x']/2, $data['size_y']/2,$data['angle'], $data['bt'], $data['et'], -$data['size_y']*1.5, $data['bt'],$time_move, $speed, $nx, $des_video);echo $png_shell;echo PHP_EOL;exec($png_shell);
// unlink($png);// unlink($video);//TODO 暂时保留视频,后期删除return $des_video_name;}/*** Notes:向左移动* User: zhangguofu* Date: 2021/4/22* Time: 15:03* @param $data array 对应的相关参数* @param $video string 对应的要处理的视频* @param $base_dir string 文件所在的目录*/public function move_left($data, $video, $base_dir){$video = $base_dir . $video;$uuid = $this->getUuid();$png = $uuid;$png = $png . ".png";$png = $base_dir . $png;//下载gif素材exec("wget -c {$data['pic_url']} -O {$png}");$des_video_name = $uuid . ".mp4";$des_video = $base_dir . $des_video_name;$px=$data['size_x']*2;$py=$data['size_y']*2;$nx=$data['coord_x']-$data['size_x']/2;$ny=$data['coord_y']-$data['size_y']/2;//旋转角度 和 大小,位置$png_shell = 'ffmpeg -y -loglevel fatal -loop 1 -i %s -i %s \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:%s[v5];\[v5]pad=%s:%s:%s:%s:0x00F8FF@0.2[v1];\[v1]rotate=\'%s*PI/180\':ow=\'max(iw,ih)\':oh=ow:c=none[v2];\[1][v2]overlay=\y=\'if(gte(t,%s), if(gte(t,%s), NAN,%s),NAN):\x=%s-min((t-%s),%s)*%s :shortest=1\'\[v3]" -map [v3] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k %s';//需要计算y的滑行速度,在规定时间内移动到终点$length=self::B_LEFT-$data['coord_x'];$speed=600;//滑动的速度$time_move=$length/$speed;$png_shell=sprintf($png_shell,$png,$video,$data['size_x'],$px,$py,$data['size_x']/2, $data['size_y']/2,$data['angle'],$data['bt'],$data['et'],$ny, self::B_LEFT-$data['size_x']/2, $data['bt'], $time_move,$speed, $des_video);echo $png_shell;echo PHP_EOL;exec($png_shell);
// unlink($png);// unlink($video);//TODO 暂时保留视频,后期删除return $des_video_name;}/*** Notes:颤抖* User: zhangguofu* Date: 2021/4/22* Time: 15:03* @param $data array 对应的相关参数* @param $video string 对应的要处理的视频* @param $base_dir string 文件所在的目录*/public function chandou($data, $video, $base_dir){$video = $base_dir . $video;$uuid = $this->getUuid();$png = $uuid;$png = $png . ".png";$png = $base_dir . $png;//下载gif素材exec("wget -c {$data['pic_url']} -O {$png}");$des_video_name = $uuid . ".mp4";$des_video = $base_dir . $des_video_name;$px=$data['size_x']*2;$py=$data['size_y']*2;$nx=$data['coord_x']-$data['size_x']/2;$ny=$data['coord_y']-$data['size_y']/2;//旋转角度 和 大小,位置$png_shell = 'ffmpeg -y -loglevel fatal -loop 1 -i %s -i %s \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:%s[v5];\[v5]pad=%s:%s:%s:%s:0x00F8FF@0.2[v1];\[v1]rotate=\'%s*PI/180\':ow=\'max(iw,ih)\':oh=ow:c=none[v2];\[1][v2]overlay=\x=\'if(gte(t,%s), if(gte(t,%s), NAN,%s+mod(floor(n/3),2)*10 ),NAN ):\y=%s+mod(floor(n/3),2)*10:shortest=1\'\[v3]" -map [v3] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k %s';//需要计算y的滑行速度,在规定时间内移动到终点$png_shell = sprintf($png_shell, $png, $video, $data['size_x'],$px,$py,$data['size_x']/2, $data['size_y']/2,$data['angle'], $data['bt'], $data['et'],$nx, $ny, $des_video);echo $png_shell;echo PHP_EOL;exec($png_shell);
// unlink($png);// unlink($video);//TODO 暂时保留视频,后期删除return $des_video_name;}/*** Notes:无动效* User: zhangguofu* Date: 2021/4/22* Time: 15:03* @param $data array 对应的相关参数* @param $video string 对应的要处理的视频* @param $base_dir string 文件所在的目录*/public function no_move($data, $video, $base_dir){$video = $base_dir . $video;$uuid = $this->getUuid();$png = $uuid;$png = $png . ".png";$png = $base_dir . $png;//下载gif素材exec("wget -c {$data['pic_url']} -O {$png}");$des_video_name = $uuid . ".mp4";$des_video = $base_dir . $des_video_name;//pad一个两倍的透明图像$px=$data['size_x']*2;$py=$data['size_y']*2;$nx=$data['coord_x']-$data['size_x']/2;$ny=$data['coord_y']-$data['size_y']/2;//旋转角度 和 大小,位置$png_shell = 'ffmpeg -y -loglevel fatal -loop 1 -i %s -i %s \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:%s[v5];\[v5]pad=%s:%s:%s:%s:0x00F8FF@0.2[v1];\[v1]rotate=\'%s*PI/180\':ow=\'max(iw,ih)\':oh=ow:c=none[v2];\[1][v2]overlay=\y=\'if(gte(t,%s), if(gte(t,%s), NAN,%s),NAN):\x=%s:shortest=1\'\[v3]" -map [v3] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k %s';$png_shell = sprintf($png_shell, $png, $video, $data['size_x'],$px,$py,$data['size_x']/2, $data['size_y']/2,$data['angle'], $data['bt'], $data['et'], $ny, $nx,$des_video);echo $png_shell;echo PHP_EOL;exec($png_shell);
// unlink($png);// unlink($video);//TODO 暂时保留视频,后期删除return $des_video_name;}/*** Notes:摇摆* User: zhangguofu* Date: 2021/4/22* Time: 15:03* @param $data array 对应的相关参数* @param $video string 对应的要处理的视频* @param $base_dir string 文件所在的目录*/public function yaobai($data, $video, $base_dir){$video = $base_dir . $video;$uuid = $this->getUuid();$png = $uuid;$png = $png . ".png";$png = $base_dir . $png;//下载gif素材exec("wget -c {$data['pic_url']} -O {$png}");$des_video_name = $uuid . ".mp4";$des_video = $base_dir . $des_video_name;//pad一个两倍的透明图像$px=$data['size_x']*2;$py=$data['size_y']*2;//计算pad后的坐标$nx=$data['coord_x']-$data['size_x']/2;$ny=$data['coord_y']-$data['size_y']/2;//旋转角度 和 大小,位置$png_shell = 'ffmpeg -y -loglevel fatal -loop 1 -i %s -i %s \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:%s[v5];\[v5]pad=%s:%s:%s:%s:0x00F8FF@0.2[v1];\[v1]rotate=\'%s*PI/180+(15*PI/180)*sin(2*PI/0.4*t)\':ow=\'max(iw,ih)\':oh=ow:c=none[v2];\[1][v2]overlay=\x=\'if(gte(t,%s), if(gte(t,%s), NAN,%s ),NAN ):\y=%s:shortest=1\'\[v3]" -map [v3] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k %s';//需要计算y的滑行速度,在规定时间内移动到终点$png_shell = sprintf($png_shell, $png, $video, $data['size_x'], $px,$py,$data['size_x']/2, $data['size_y']/2,$data['angle'],$data['bt'], $data['et'],$nx, $ny, $des_video);echo $png_shell;echo PHP_EOL;exec($png_shell);
// unlink($png);// unlink($video);//TODO 暂时保留视频,后期删除return $des_video_name;}/*** Notes:跳动* User: zhangguofu* Date: 2021/4/22* Time: 15:03* @param $data array 对应的相关参数* @param $video string 对应的要处理的视频* @param $base_dir string 文件所在的目录*/public function tiaodong($data, $video, $base_dir){$video = $base_dir . $video;$uuid = $this->getUuid();$png = $uuid;$png = $png . ".png";$png = $base_dir . $png;//下载gif素材exec("wget -c {$data['pic_url']} -O {$png}");$des_video_name = $uuid . ".mp4";$des_video = $base_dir . $des_video_name;//跳动的时间计算$speed=$data['et']-$data['bt'];//向上跳动距离,y点距离定点的一半距离$jump=$data['coord_y']/1.3;$time_dur=2*$jump/600;
// dd($time_dur);$px=$data['size_x']*2;$py=$data['size_y']*2;$nx=$data['coord_x']-$data['size_x']/2;$ny=$data['coord_y']-$data['size_y']/2;//旋转角度 和 大小,位置$png_shell = 'ffmpeg -y -loglevel fatal -loop 1 -i %s -i %s \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:%s[v5];\[v5]pad=%s:%s:%s:%s:0x00F8FF@0.2[v1];\[v1]rotate=%s*PI/180:ow=\'max(iw,ih)\':oh=ow:c=none[v2];\[1][v2]overlay=x=\'if(gte(t,%s), if(gte(t,%s), NAN,%s),NAN ):y=if(gte(t,%s),%s,min(%s-%s*sin((t-%s)*3/%s),%s)):shortest=1\'\[v3]" -map [v3] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k %s';//需要计算y的滑行速度,在规定时间内移动到终点$png_shell = sprintf($png_shell, $png, $video, $data['size_x'],$px,$py,$data['size_x']/2, $data['size_y']/2,$data['angle'],$data['bt'], $data['et'],$nx,$data['bt']+2*$time_dur,$ny,$ny,$jump,$data['bt'],$time_dur,$ny,$des_video);echo $png_shell;echo PHP_EOL;exec($png_shell);
// unlink($png);// unlink($video);//TODO 暂时保留视频,后期删除return $des_video_name;}public function tiaodong1($data, $video, $base_dir){$video = $base_dir . $video;$uuid = $this->getUuid();$png = $uuid;$png = $png . ".png";$png = $base_dir . $png;//下载gif素材exec("wget -c {$data['pic_url']} -O {$png}");$des_video_name = $uuid . ".mp4";$des_video = $base_dir . $des_video_name;//跳动的时间计算$speed=$data['et']-$data['bt'];//向上跳动距离,y点距离定点的一半距离$jump=$data['coord_y']/1.3;//旋转角度 和 大小,位置$png_shell = 'ffmpeg -y -loglevel fatal -loop 1 -i %s -i %s \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:%s[v1];\[v1]rotate=%s*PI/180:ow=\'max(iw,ih)\':oh=ow:c=none[v2];\[1][v2]overlay=x=\'if(gte(t,%s), if(gte(t,%s), NAN,%s),NAN ):y=%s-%s*sin((t-%s)*3/%s):shortest=1\'\[v3]" -map [v3] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k %s';//需要计算y的滑行速度,在规定时间内移动到终点$png_shell = sprintf($png_shell, $png, $video, $data['size_x'], $data['angle'],$data['bt'], $data['et'],$data['coord_x'],$data['coord_y'],$jump,$data['bt'],$speed,$des_video);echo $png_shell;echo PHP_EOL;exec($png_shell);
// unlink($png);// unlink($video);//TODO 暂时保留视频,后期删除return $des_video_name;}/*** Notes:雨刷* User: zhangguofu* Date: 2021/4/22* Time: 15:03* @param $data array 对应的相关参数* @param $video string 对应的要处理的视频* @param $base_dir string 文件所在的目录*/public function yushua($data, $video, $base_dir){$video = $base_dir . $video;$uuid = $this->getUuid();$png = $uuid;$png = $png . ".png";$png = $base_dir . $png;//下载gif素材exec("wget -c {$data['pic_url']} -O {$png}");$des_video_name = $uuid . ".mp4";$des_video = $base_dir . $des_video_name;//pad一个两倍的透明图像,为了防止边缘溢出,再扩大0.8倍,中心点对应 移动0.4$px=$data['size_x']*2.8;$py=$data['size_y']*2.8;//计算pad后的坐标$nx=$data['size_x']*0.4;$ny=$data['size_y']*0.4;//要根据旋转角度和边长计算出 补偿距离 中心点旋转的,但是 本特效会认为是 右下角旋转,导致中心点移动,所以需要转换$give_data=$this->getGiveData($data);
// dd($give_data);$give_nx=$give_data['x'];$give_ny=$give_data['y'];//旋转角度 和 大小,位置$png_shell = 'ffmpeg -y -loglevel fatal -loop 1 -i %s -i %s \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:%s[v5];\[v5]pad=%s:%s:%s:%s:0x00F8FF@0.2[v1];\[v1]rotate=\'%s*PI/180-0.4*sin(8*PI/5*(t-%s))\':ow=\'max(iw,ih)\':oh=ow:c=none[v2];\[1][v2]overlay=\x=\'if(gte(t,%s), if(gte(t,%s), NAN,%s ),NAN ):\y=%s:shortest=1\'\[v3]" -map [v3] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k %s';//需要计算y的滑行速度,在规定时间内移动到终点$png_shell = sprintf($png_shell, $png, $video, $data['size_x'], $px,$py,$nx,$ny,$data['angle'],$data['bt'],$data['bt'],$data['et'],$data['coord_x']-$nx-$give_nx,$data['coord_y']-$ny-$give_ny,$des_video);echo $png_shell;echo PHP_EOL;exec($png_shell);
// unlink($png);// unlink($video);//TODO 暂时保留视频,后期删除return $des_video_name;}/*** Notes:轻微跳动* User: zhangguofu* Date: 2021/4/22* Time: 15:03* @param $data array 对应的相关参数* @param $video string 对应的要处理的视频* @param $base_dir string 文件所在的目录*/public function xiaotiao($data, $video, $base_dir){$video = $base_dir . $video;$uuid = $this->getUuid();$png = $uuid;$png = $png . ".png";$png = $base_dir . $png;//下载gif素材exec("wget -c {$data['pic_url']} -O {$png}");$des_video_name = $uuid . ".mp4";$des_video = $base_dir . $des_video_name;//pad一个两倍的透明图像$px=$data['size_x']*2;$py=$data['size_y']*2;//计算pad后的坐标$nx=$data['coord_x']-$data['size_x']/2;$ny=$data['coord_y']-$data['size_y']/2;//旋转角度 和 大小,位置$png_shell = 'ffmpeg -y -loglevel fatal -loop 1 -i %s -i %s \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:%s[v5];\[v5]pad=%s:%s:%s:%s:0x00F8FF@0.2[v1];\[v1]rotate=\'%s*PI/180+sin(PI*(2*(t-%s)))*0.15\':ow=\'max(iw,ih)\':oh=ow:c=none[v2];\[1][v2]overlay=x=\'if(gte(t,%s), if(gte(t,%s), NAN,%s),NAN ):y=%s:shortest=1\'\[v3]" -map [v3] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k %s';//需要计算y的滑行速度,在规定时间内移动到终点$png_shell = sprintf($png_shell, $png, $video, $data['size_x'], $px,$py,$data['size_x']/2, $data['size_y']/2,$data['angle'],$data['bt'],$data['bt'] ,$data['et'],$nx, $ny,$des_video);echo $png_shell;echo PHP_EOL;exec($png_shell);
// unlink($png);// unlink($video);//TODO 暂时保留视频,后期删除return $des_video_name;}/*** Notes:弹入* User: zhangguofu* Date: 2021/4/22* Time: 15:03* @param $data array 对应的相关参数* @param $video string 对应的要处理的视频* @param $base_dir string 文件所在的目录*/public function tanru($data, $video, $base_dir){$video = $base_dir . $video;$uuid = $this->getUuid();$png = $uuid;$png = $png . ".png";$png = $base_dir . $png;//下载gif素材exec("wget -c {$data['pic_url']} -O {$png}");$des_video_name = $uuid . ".mp4";$des_video = $base_dir . $des_video_name;//pad一个两倍的透明图像$px=$data['size_x']*6;$py=$data['size_y']*6;//计算pad后的坐标$nx=$data['coord_x']-$data['size_x']*2.5;$ny=$data['coord_y']-$data['size_y']*2.5;//逻辑概述,先pad 一个比 最终尺寸大6倍的图层,然后让素材在图层居中;// 然后对于上述的图层 缩小 0.2倍,为什么是0.2 0.2*6=1.2 刚好可以盖住素材底,//然后对素材进行缩小放大的操作,最后执行 放大倍数,试的相乘等于1,还原到最终尺寸// [v6]scale=-1:'720+750*min(t-1,1)':eval=frame[v7];\//放大20%$speed=$px-0.4*$px;//旋转角度 和 大小,位置$png_shell = 'ffmpeg -y -loop 1 -i %s -i %s \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:%s[v5];\[v5]pad=%s:%s:%s:%s:0x00F8FF@0.2[v6];\[v6]scale=-1:\'%s+%s*min(t-%s,0.5)\':eval=frame[v7];\[v7]rotate=\'%s*PI/180\':ow=\'max(iw,ih)\':oh=ow:c=none[v1];\[1][v1]overlay=\x=\'if(gte(t,%s), if(gte(t,%s), NAN,%s ),NAN ):\y=%s:shortest=1\'[v2]" \-map [v2] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k %s';//需要计算y的滑行速度,在规定时间内移动到终点// ,$px*0.4*2 0.5s$png_shell = sprintf($png_shell, $png, $video,$data['size_x'],$px,$py,$data['size_x']*2.5,$data['size_y']*2.5,$px*0.4,2*$speed,$data['bt'],$data['angle'],$data['bt'],$data['et'],$nx,$ny,$des_video);echo $png_shell;echo PHP_EOL;exec($png_shell);
// unlink($png);// unlink($video);//TODO 暂时保留视频,后期删除return $des_video_name;}/*** Notes:弹入* User: zhangguofu* Date: 2021/4/22* Time: 15:03* @param $data array 对应的相关参数* @param $video string 对应的要处理的视频* @param $base_dir string 文件所在的目录*/public function tanru1($data, $video, $base_dir){$video = $base_dir . $video;$uuid = $this->getUuid();$png = $uuid;$png = $png . ".png";$png = $base_dir . $png;//下载gif素材exec("wget -c {$data['pic_url']} -O {$png}");$des_video_name = $uuid . ".mp4";$des_video = $base_dir . $des_video_name;//pad一个两倍的透明图像$px=$data['size_x']*2;$py=$data['size_y']*2;//计算pad后的坐标$nx=$data['coord_x']-$data['size_x']/2;$ny=$data['coord_y']-$data['size_y']/2;//放大20%$speed=$data['size_x']*0.2;//旋转角度 和 大小,位置$png_shell = 'ffmpeg -y -loop 1 -i %s -i %s \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:%s[v5];\[v5]pad=%s:%s:%s:%s:0x00F8FF@0.2[v6];\[v6]scale=-1:\'%s+%s*min(t-%s,1)\':eval=frame[v7];\[v7]rotate=\'%s*PI/180\':ow=\'max(iw,ih)\':oh=ow:c=none[v1];\[1][v1]overlay=\x=\'if(gte(t,%s), if(gte(t,%s), NAN,%s ),NAN ):\y=%s:shortest=1\'[v2]" \-map [v2] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k %s';//需要计算y的滑行速度,在规定时间内移动到终点$png_shell = sprintf($png_shell, $png, $video,$data['size_x'],$px,$py,$data['size_x']/2,$data['size_y']/2,$px,$speed,$data['bt'],$data['angle'],$data['bt'],$data['et'],$nx,$ny,$des_video );echo $png_shell;echo PHP_EOL;exec($png_shell);
// unlink($png);// unlink($video);//TODO 暂时保留视频,后期删除return $des_video_name;}/*** Notes:弹簧* User: zhangguofu* Date: 2021/4/22* Time: 15:03* @param $data array 对应的相关参数* @param $video string 对应的要处理的视频* @param $base_dir string 文件所在的目录*/public function tanhuang($data, $video, $base_dir){$video = $base_dir . $video;$uuid = $this->getUuid();$png = $uuid;$png = $png . ".png";$png = $base_dir . $png;//下载gif素材exec("wget -c {$data['pic_url']} -O {$png}");$des_video_name = $uuid . ".mp4";$des_video = $base_dir . $des_video_name;//pad一个两倍的透明图像$px = $data['size_x'] * 6;$py = $data['size_y'] * 6;//计算pad后的坐标$nx = $data['coord_x'] - $data['size_x'] * 2.5;$ny = $data['coord_y'] - $data['size_y'] * 2.5;//逻辑概述,先pad 一个比 最终尺寸大6倍的图层,然后让素材在图层居中;// 然后对于上述的图层 缩小 0.2倍,为什么是0.2 0.2*6=1.2 刚好可以盖住素材底,//然后对素材进行缩小放大的操作,最后执行 放大倍数,试的相乘等于1,还原到最终尺寸$dur = 2;$per_dur = $dur / 20;$time1 = $per_dur * 5;$speed1 = (4.5 * $data['size_x']) / $time1;//已经有一个默认的值了,需要再增加到6个值,显示正常尺寸$time_start2 = $data['bt'] + $time1;$time_start3 = $time_start2 + $time1;$time_start4 = $time_start3 + $time1;$time4=$per_dur*3;$time_start5 = $time_start4 + $time4;$size_2 = 6 * $data['size_x'];//第一次回复至默认大小$speed2 = (6 * $data['size_x'] * 0.6) / $time1;$size_3 = 6 * $data['size_x'] * 0.4;$speed3 = (6 * $data['size_x'] * 0.4) / $time1;$size_4 = 6 * $data['size_x'] * 0.9;$speed4 = (6 * $data['size_x'] * 0.2) / $time4;$size5= 6 * $data['size_x'] * 0.7;// dd($speed1);//旋转角度 和 大小,位置$png_shell = ' ffmpeg -y -loop 1 -i %s -i %s \-filter_complex "\[0]format=pix_fmts=rgba[v0];\[v0]scale=-1:%s[v5];\[v5]pad=%s:%s:%s:%s:0x00F8FF@0.2[v6];\[v6]scale=-1:\'\if(lte(t-%s,%s),%s+%s*(t-%s),\if(lte(t-%s,%s),%s-%s*(t-%s),\if(lte(t-%s,%s),%s+%s*(t-%s),\if(lte(t-%s,%s),%s-%s*(t-%s),\%s))))\':eval=frame[v7];\[v7]rotate=\'%s*PI/180\':ow=\'max(iw,ih)\':oh=ow:c=none[v1];\[1][v1]overlay=\x=\'if(gte(t,%s), if(gte(t,%s), NAN,%s ),NAN ):\y=%s:shortest=1\'[v2]" \-map [v2] -vcodec libx264 -ac 2 -ar 44100 -b:v 3000k %s';//需要计算y的滑行速度,在规定时间内移动到终点$png_shell = sprintf($png_shell, $png, $video, $data['size_x'],$px, $py, $data['size_x'] * 2.5, $data['size_y'] * 2.5,$data['bt'],$time1,1.5*$data['size_x'],//初始化 如果刚好是 1倍的情况,有时候会盖不上,所以增加0.5,速度 减少0.5,即4.5$speed1,$data['bt'],$time_start2,$time1,$size_2,$speed2,$time_start2,$time_start3,$time1,$size_3,$speed3,$time_start3,$time_start4,$time4,$size_4,$speed4,$time_start4,$size5,$data['angle'],$data['bt'],$data['et'],$nx, $ny,$des_video,);echo $png_shell;echo PHP_EOL;exec($png_shell);
// unlink($png);// unlink($video);//TODO 暂时保留视频,后期删除return $des_video_name;}/*** Notes:获取素材的完整地址* User: zhangguofu* Date: 2021/4/21* Time: 11:13* @param $data* @return mixed*/public function getFodderUrl($data){$res = DB::connection("mysql_dev")->table('cnk_ugc_fodder')->select(['wav_url','pic_url','type'])->where(['id'=>$data['f_id']])->first();$data['wav_url']=self::FILE.$res->wav_url;$data['pic_url']=self::FILE.$res->pic_url;$data['type']=$res->type;return $data;}/*** Notes:计算出 由于雨刷导致中心点偏移的宽和高* User: zhangguofu* Date: 2021/5/10* Time: 15:05* @param $data*/public function getGiveData($data){$l=$data['size_x'];//边长$angle=$data['angle'];//旋转角度$angle1=45+$angle;$angle1=deg2rad($angle1);//计算对角线长度$l1=sqrt(2*$l*$l);
// dd($l1);//对角线一半$l1=$l1/2;//根据sin和consin计算 两个直角边
// dd(sin(deg2rad(30)));$duibian=$l1*sin($angle1);$linbian=$l1*cos($angle1);//先计算出 右下角 点的位子$dx=$data['size_x']+$data['coord_x'];$dy=$data['size_y']+$data['coord_y'];//计算出移动后 中心点坐标(雨刷右下角固定不变)$nx=$dx-$linbian;$ny=$dy-$duibian;// 计算原来中心点的x和y$ox=$data['size_x']/2+$data['coord_x'];$oy=$data['size_y']/2+$data['coord_y'];$move_y=$ny-$oy;//y轴移动距离$move_x=$nx-$ox;//x轴移动距离$data['x']=$move_x;$data['y']=$move_y;
// dd($data);return $data;}/*** Notes:获取分组的时间* User: zhangguofu* Date: 2021/4/21* Time: 10:35*/public function getTime(){$obj= DB::connection("mysql_dev")->table('cnk_ugc_video_make')->where("aid",self::TEST_ID)->first();
// dd($obj);$str=$obj->real_content;$res=json_decode($str,1);
// dd($res);$data=[];foreach ($res as $v){if ($v['status'] !=="normal"){continue;}if (empty($v['texture'])){continue;}$bt=$v['bt_number'];$et=$v['et_number'];
// dd($v['texture']);foreach ($v['texture'] as $vv){$data1=$vv;$data2=['bt'=>$bt,'et'=>$et];$data_3=array_merge($data1,$data2);$data[]=$data_3;}
// dd($data);
// $data[]=$v;}
// dd($data);$group =array_column($data,"id");$group=array_unique($group);
// dd($group);$new_d=[];//得到id分组后的数组foreach ($group as $k=>$v){foreach ($data as $vv){if ($v===$vv['id']){$new_d[$k][]=$vv;}}}// dd($new_d);$end_datas=[];
// var_export($new_d);die;//找到分组内的最大值和最小值foreach ($new_d as $k=>$v){$e_max=0;//获取结束时间最大值$b_min = 99999999999999;//获取开始时间最小值foreach ($v as $vv) {
// dd($e_max,$vv['et']);
// var_export($vv);$e_max = max($e_max, $vv['et']);$b_min = min($b_min, $vv['bt']);//转化为数字
// dd($e_max);}
// dd($v);$end_data = $v[0];$end_data['bt'] = $b_min;//开始的最小值$end_data['et'] = $e_max;//结束的最大值$end_datas[$k] = $end_data;}
// dd($end_datas);return $end_datas;}/*** Notes:返回毫秒级时间戳格式* User: zhangguofu* Date: 2021/4/21* Time: 15:37* @param $str* @return float|int|mixed|string*/public function getNumTime($str){
// echo $str;
// echo PHP_EOL;$arr = explode(".", $str);$time_arr = explode(':', $arr[0]);
// dd($time_arr);//小时$h = $time_arr[0];//分钟$m = $time_arr[1];
// dd($m);//秒$s = $time_arr[2];$total = $h * 3600 + $m * 60 + $s;//毫秒计算if (isset($arr[1]) && !empty($arr[1])) {$total = $h * 3600 + $m * 60 + $s + $arr[1] / 1000;}return $total;}/*** Notes:语音特效合成* User: zhangguofu* Date: 2021/5/19* Time: 19:08* @param $base_dir string 文件公共目录* @param $origin_video string 视频文件名* @param $arr array 特效音频数据* @param $obj TxOnlineCommand 特效音频数据*/public function mergeVoice($base_dir,$origin_video,$arr,$obj){$rand=$this->getUuid();$d_video=$base_dir.$origin_video;$wav=$rand.".mp3";$des_wav=$base_dir.$wav;$wav_end=$rand."_end.mp3";$des_wav_end=$base_dir.$wav_end;$wav_stardard=$rand."_stardard.mp3";$des_wav_stardard=$base_dir.$wav_stardard;$shell="ffmpeg -y -loglevel error -i {$d_video} -b:a 192K -vn {$des_wav}";exec($shell);$shell="ffmpeg -y -loglevel error -i {$d_video} -b:a 192K -vn {$des_wav}";exec($shell);$input='';$vi=1;$filter='';$filter2='';foreach ($arr as $v) {//加入音效效,$v = $obj->getFodderUrl($v);if ($v['type'] == self::TYPE_GIF) {
// var_export($v);if (!empty($v['wav_url'])){$time=$v['bt']*1000;$input.="-i {$v['wav_url']} ";$filter.=" [{$vi}]adelay=$time|$time,volume='1'[w{$vi}];";$filter2.="[w{$vi}]";$vi++;}}}//开始合成音效$str='
ffmpeg -y -loglevel error -i %s \
%s \-filter_complex "[0]volume=\'1\'[w0]; \%s \[w0]%samix=inputs=%s:duration=first:dropout_transition=120" -f mp3 %s
';if (!empty($vi)){$wav_shell=sprintf($str,$base_dir.$wav,$input,$filter,$filter2,$vi,$des_wav_end);echo $wav_shell;exec($wav_shell);$stardard_shell="ffmpeg -i $des_wav_end -af loudnorm=I=-16:LRA=11:tp=-1.5 -y $des_wav_stardard ";echo $stardard_shell;exec($stardard_shell);}return $wav_stardard;}public function getUuid(){//生成自定义文件名
// $uuid=CnkHealthyCateService::uuid(5);
// $random=time().$uuid;
//$uuid = uuid4();return $uuid;}
}
相关问题总结和思考
旋转之后左上角的位置怎么确定?
声音加入,音量标准统一
KKView远程控制
2024远程控制领域的新晋黑马,安全连接,KKView远程控制,远程好帮手。其全功能免费不限设备数量政策,在办公一族迅速传播,争相使用。其一键看远程桌面,一键打开远程手机电脑摄像头,无限制急速文件传输,远程终端,远程关机重启等39项功能彻底打破办公居家时间空间限制,实现连接自由,深受用户好评。KKView官网或华为等各大应用市场可下载使用。

KKView远程控制一键远程控制,可无插件控制安卓手机、电脑
曲折历史
png展示行不行?gif展示行不行?运动行不行?旋转行不行?抖动行不行?
作者:张清柏
链接:https://www.jianshu.com/p/e21f9df6678b
相关文章:
如何使用ffmpeg 实现10种特效
相关特效的名字 特效id 特效名 1 向上移动 2 向左移动 3 向下移动 4 颤抖 5 摇摆 6 雨刷 7 弹入 8 弹簧 9 轻微跳动 10 跳动 特效展示(同时汇总相关命令) pad背景显示 pad背景透明 相关命令(一会再讲这些命令,先往下看) # 合成特效语音 ffmpeg -y -loglevel erro…...
C语言如果变量全部在全局内存空间会怎么样
结论先行 应该根据内存使用的生命周期,选择合适的内存空间应该尽量使用连续内存如果不想在设计封装性上付出太多代价,全部放入全局空间也比较可取 空间类型特点全局空间生命周期最久,空间连续,变量分配紧致,但存在浪…...
【YOLO改进】换遍MMPretrain主干网络之ConvNeXt-Tiny(基于MMYOLO)
ConvNeXt-Tiny ConvNeXt-Tiny 是一种改进的卷积神经网络架构,其设计目的是在保持传统卷积神经网络优势的同时,借鉴了一些Transformer架构的成功经验。 ConvNeXt-Tiny 的优点 架构优化: ConvNeXt-Tiny 对经典ResNet架构进行了多种优化&#…...
【数据库】MySQL
文章目录 概述DDL数据库操作查询使用创建删除 表操作创建约束MySqL数据类型数值类型字符串类型日期类型 查询修改删除 DMLinsertupdatedelete DQL基本查询条件查询分组查询分组查询排序查询分页查询 多表设计一对多一对一多对多设计步骤 多表查询概述内连接外连接 子查询标量子…...
JVM运行时内存:垃圾回收器(Serial ParNew Parallel )详解
文章目录 1. 查看默认GC2. Serial GC : 串行回收3. ParNew GC:并行回收4. Parallel GC:吞吐量优先 1. 查看默认GC -XX:PrintCommandLineFlags:查看命令行相关参数(包含使用的垃圾收集器)使用命令行指令:ji…...
The Missing Semester of Your CS Education(计算机教育中缺失的一课)
Shell 工具和脚本(Shell Tools and Scripting) 一、shell脚本 1.1、变量赋值 在bash中为变量赋值的语法是foobar,访问变量中存储的数值,其语法为 $foo。 需要注意的是,foo bar (使用空格隔开)是不能正确工作的&…...
如何为ChatGPT编写有效的提示词:软件开发者的指南
作为一名软件开发者,特别是使用Vue进行开发的开发者,与ChatGPT等AI助手高效互动,可以极大地提升你的开发效率。本文将深入探讨如何编写有效的提示词,以便从ChatGPT中获取有用的信息和帮助。 1. 明确目标 在编写提示词之前&#…...
angular插值语法与属性绑定
在 Angular 中,您提供的两种写法都是用来设置 HTML 元素的 title 属性,但它们的工作方式有所不同: 插值语法 (Interpolation) <h1 title"{{ name }}">我的名字</h1> 属性绑定 (Property Binding) <h1 [title]&q…...
Python ❀ 使用代码解决今天中午吃什么的重大生存问题
1. 环境安装 安装Python代码环境参考文档 2. 代码块 import random# 准备一下你想吃的东西 hot ["兰州拉面", "爆肚面", "黄焖鸡", "麻辣香锅", "米线", "麻食", "羊肉泡馍", "肚丝/羊血汤&qu…...
做抖音小店需要清楚的5个核心点!
大家好,我是喷火龙。 不管你是在做抖音小店,还是在做其他的电商平台,如果已经做了一段时间了,但还是没有拿到什么结果,我所指的结果不是什么大结果,而是连温饱都解决不了,甚至说还在亏钱。 有…...
文件流下载优化:由表单提交方式修改为Ajax请求
如果想直接看怎么写的可以跳转到 解决方法 节! 需求描述 目前我们系统导出文件时,都是通过表单提交后,接收文件流自动下载。但由于在表单提交时没有相关调用前和调用后的回调函数,所以我们存在的问题,假如导出数据需…...
基础3 探索JAVA图形编程桌面:逻辑图形组件实现
在一个宽敞明亮的培训教室里,阳光透过窗户柔和地洒在地上,教室里摆放着整齐的桌椅。卧龙站在讲台上,面带微笑,手里拿着激光笔,他的眼神中充满了热情和期待。他的声音清晰而洪亮,传遍了整个教室:…...
前后端部署笔记
windows版: 如果傻呗公司让用win电脑部署,类似于我们使用笔记本做局域网服务器,社内使用。 1.安装win版的nginx、mysql、node、jdk等 2.nginx开机自启参考Nginx配置及开机自启动(Windows环境)_nginx开机自启动 wind…...
设计模式9——适配器模式
写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 适配器模式(Adapte…...
一文了解基于ITIL的运维管理体系框架
本文来自腾讯蓝鲸智云社区用户:CanWay ITIL(Information Technology Infrastructure Library)是全球最广泛使用的 IT 服务管理方法,旨在帮助组织充分利用其技术基础设施和云服务来实现增长和转型。优化IT运维,作为企业…...
Web前端开发技术-格式化文本 Web页面初步设计
目录 Web页面初步设计 标题字标记 基本语法: 语法说明: 添加空格与特殊符号 基本语法: 语法说明: 特殊字符对应的代码: 代码解释: 格式化文本标记 文本修饰标记 计算机输出标记 字体font标记 基本语法: 属…...
Windows下部署Seata1.5.2,解决Seata无法启动问题
目录 1. 版本说明 2. Windows下部署Seata1.5.2 2.1 创建回滚日志表undo_log 2.2 创建Seata服务端需要的四张表 2.3 在nacos创建seata命名空间,添加seataServer.yml配置 2.4 修改本地D:/tool/seata-server-1.5.2/seata/conf/applicaltion.yml文件 2.5 启动Seat…...
我加入了C++交流社区
最近,我决定加入了一个C交流社区,这是一个专注于C编程语言的在线平台。加入这个社区的初衷是为了提升我的编程技能,与其他对C感兴趣的人交流经验和知识。 加入这个社区后,我发现了许多有趣的讨论和资源。每天都有各种各样的话题&…...
Vue从入门到实战Day11
一、为什么要学Vue3 Vue3官网:简介 | Vue.js 1. Vue3的优势 2. Vue2选项式API vs Vue3组合式API 示例: 二、create-vue搭建Vue3项目 1. 认识create-vue create-vue是Vue官方新的脚手架工具,底层切换到了vite(下一代构建工具),为…...
day15|各种遍历的应用
相关题目: 层次遍历会一打十 反转二叉树 对称二叉树 层次遍历会一打十 自底向上的层序遍历 实现思路:层次遍历二叉树,将遍历后的结果revers即可 public List<List<Integer>> levelOrderBottom(TreeNode root) {List<List&l…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
