利用ffmpeg实现图片生成视频,视频拼接,添加字幕等
<?php
namespace app\controller;
use app\BaseController;
use think\Exception;
class Index extends BaseController
{
/*
* OpenCV 和 ffmpeg 实现混剪
* */
public function index()
{
/*
* 生成视频流程
* 分段生成语音,比如一秒钟能读3个字,现有90字,可以分为30秒。分3段来生成语音:第一段5秒,10秒,15秒
* 分别为每段语音生成字幕,0-5秒:前15字;6-15秒:中间30字;后15秒:剩余的字
* 根据语音片段进行图片合并,以上实例需要准备3张图片,其合并的视频总时长也是30秒,转场时间分别为5,15,秒
*
*
* 遍历图片的数量
* 给每个图片生成一个视频,语音文件,字幕文件
* 最后把每个视频合并
*
* 合并后的视频添加标题
*
* */
$imgList = [
'img4.jpg',
// 'img5.jpg',
// 'img6.jpg',
// 'img7.jpg',
];
foreach ($imgList as $key => $img) {
//添加背景
// $returnImg = "backImg{$key}.jpg";
// $output = "output{$key}.mp4";
// $returnImg = $this->addBack($img,$returnImg);
$output = "output0.mp4";
$returnImg = "backImg0.jpg";
$time = ($key+1) * 3;
//图片生成视频
$output = $this->mergeSingleImages($returnImg, $time, $output);
dd(1);
//为视频添加音频
$audio = "peiyin.mp3";
$audioVideo = "mixed_video16.mp4";
$inFile = $this->addAudio($output,$audio, $audioVideo);
//单个视频添加字幕
$outFile = "output-swipe-custom102.mp4";
$subtitles = "subtitles.srt";
$this->addCap($audioVideo,$outFile,$subtitles);
}
//生成有背景的图片
//$this->createCompositeImage();
//多张图片合并为一个视频,并添加转场效果
// $this->mergeImages();
//视频合并
//$this->mergeVideo();
//视频添加背景图片 还不可用
//$this->addBackground();
//为视频添加音频
//$this->addAudioToVideo();
//单个视频添加标题
//$this->addSubtitles();
//单个视频添加字幕
//$this->addCaptions();
//视频分割
//$this->videoSegment();
//视频添加转场
// $this->addZhuanChang();
}
//添加字幕
public function addCap($inFile,$outFile,$subtitles)
{
$ffmpeg_command = "ffmpeg -i $inFile -i title.srt -filter_complex \"subtitles=$subtitles:force_style='Fontsize=10,PrimaryColour=0xFFFFFF,Alignment=2'\" -c:v libx264 -c:a copy $outFile";
// 执行 FFMpeg 命令
$output = exec($ffmpeg_command);
return $outFile;
}
//为视频添加音频
public function addAudio($video, $audio, $outVideo)
{
// 混剪后的视频文件路径
// 构建 FFMpeg 命令 -r 0.5 每秒显示0.5张图片,即一张图片显示两秒
//$ffmpeg_command = "ffmpeg -i $video1 -i $audio -c:v copy -c:a aac -strict experimental $mixed_video";
$ffmpeg_command = "ffmpeg -i $video -i $audio -c:v copy -c:a aac -strict experimental $outVideo";
// 执行 FFMpeg 命令
exec($ffmpeg_command);
return $outVideo;
}
public function mergeSingleImages($img, $time, $output)
{
//https://trac.ffmpeg.org/wiki/Xfade 所有的转场效果
// 构建 FFMpeg 命令 -r 0.5 每秒显示0.5张图片,即一张图片显示两秒
// $ffmpeg_command = "ffmpeg -loop 1 -i $img -r 1/$time -c:v libx264 $output";
$ffmpeg_command = "ffmpeg -loop 1 -t $time -i $img -y $output";
echo $ffmpeg_command;exit;
// 执行 FFMpeg 命令
exec($ffmpeg_command);
echo $ffmpeg_command;exit;
return $output;
}
public function addBack($img,$returnImg)
{
// 检查 GD 库是否已安装
if (!function_exists('imagecreatetruecolor')) {
die('GD Library is not installed.');
}
try {
// 生成底层图片
$baseImage = imagecreatetruecolor(654, 1000);
// 分配蓝色并设置为背景颜色
$blue = imagecolorallocate($baseImage, 36, 15, 32); // 纯蓝色 (R:0, G:0, B:255)
imagefill($baseImage, 0, 0, $blue);
// 保存图片为PNG格式
// 加载要覆盖的图片
$overlayImage = imagecreatefromjpeg($img); // 替换为你要覆盖的图片的实际路径
// 获取覆盖图片的宽度和高度
$overlayWidth = imagesx($overlayImage);
$overlayHeight = imagesy($overlayImage);
// 计算居中覆盖的坐标
$offsetX = (654 - $overlayWidth) / 2;
$offsetY = (1000 - $overlayHeight) / 2;
// 在底层图片上居中覆盖覆盖图片
imagecopy($baseImage, $overlayImage, $offsetX, $offsetY, 0, 0, $overlayWidth, $overlayHeight);
// 设置图像格式为 JPEG 并保存图片
imagejpeg($baseImage, $returnImg, 100);
// 释放图像资源
imagedestroy($baseImage);
imagedestroy($overlayImage);
return $returnImg;
}catch (Exception $exception) {
dd($exception->getMessage());
}
}
public function createCompositeImage()
{
// 检查 GD 库是否已安装
if (!function_exists('imagecreatetruecolor')) {
die('GD Library is not installed.');
}
try {
// 生成底层图片
$baseImage = imagecreatetruecolor(654, 1000);
// 分配蓝色并设置为背景颜色
$blue = imagecolorallocate($baseImage, 36, 15, 32); // 纯蓝色 (R:0, G:0, B:255)
imagefill($baseImage, 0, 0, $blue);
// 保存图片为PNG格式
// 加载要覆盖的图片
$overlayImage = imagecreatefromjpeg('img7.jpg'); // 替换为你要覆盖的图片的实际路径
// 获取覆盖图片的宽度和高度
$overlayWidth = imagesx($overlayImage);
$overlayHeight = imagesy($overlayImage);
// 计算居中覆盖的坐标
$offsetX = (654 - $overlayWidth) / 2;
$offsetY = (1000 - $overlayHeight) / 2;
// 在底层图片上居中覆盖覆盖图片
imagecopy($baseImage, $overlayImage, $offsetX, $offsetY, 0, 0, $overlayWidth, $overlayHeight);
// 设置图像格式为 JPEG 并保存图片
imagejpeg($baseImage, 'b4.jpg', 100);
// 释放图像资源
imagedestroy($baseImage);
imagedestroy($overlayImage);
}catch (Exception $exception) {
dd($exception->getMessage());
}
}
//为视频添加背景
public function addBackground()
{
$video1 = "output-swipe-custom3.mp4";
$audio = "peiyin.mp3";
// 混剪后的视频文件路径
$mixed_video = "mixed_video16.mp4";
// 构建 FFMpeg 命令 -r 0.5 每秒显示0.5张图片,即一张图片显示两秒
$ffmpeg_command = "ffmpeg -loop 1 -i img1.png -i output-swipe-custom3.mp4 -filter_complex \"[0:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2[vbg];[1:v]scale=trunc(iw/2)*2:trunc(ih/2)*2:force_original_aspect_ratio=decrease[vfg];[vbg][vfg]overlay=W-w-10:H-h-10\" -c:v libx264 -crf 25 -preset veryfast -c:a copy output_video.mp4";
// 执行 FFMpeg 命令
$output = exec($ffmpeg_command);
// 检查命令执行结果
if ($output === "") {
echo "为视频添加背景成功!";
} else {
echo "为视频添加背景失败:$output";
}
}
//为视频添加音频
public function addAudioToVideo()
{
$video1 = "output-swipe-custom102.mp4";
$audio = "peiyin.mp3";
// 混剪后的视频文件路径
$mixed_video = "mixed_video16.mp4";
// 构建 FFMpeg 命令 -r 0.5 每秒显示0.5张图片,即一张图片显示两秒
//$ffmpeg_command = "ffmpeg -i $video1 -i $audio -c:v copy -c:a aac -strict experimental $mixed_video";
$ffmpeg_command = "ffmpeg -i $video1 -i $audio -c:v copy -c:a aac -strict experimental $mixed_video";
// 执行 FFMpeg 命令
$output = exec($ffmpeg_command);
// 检查命令执行结果
if ($output === "") {
echo "为视频添加音频成功!";
} else {
echo "为视频添加音频失败:$output";
}
}
//多张图片合并为一个视频
public function mergeImages()
{
//https://trac.ffmpeg.org/wiki/Xfade 所有的转场效果
// 混剪后的视频文件路径
$mergeImages = "mergeImages4.mp4";
// 构建 FFMpeg 命令 -r 0.5 每秒显示0.5张图片,即一张图片显示两秒
$ffmpeg_command = "ffmpeg -loop 1 -t 3 -i b1.jpg -loop 1 -t 3 -i b2.jpg -loop 1 -t 3 -i b3.jpg -loop 1 -t 3 -i b4.jpg -loop 1 -t 3 -i b1.jpg -filter_complex \"[0:v]xfade=transition=wipeleft:duration=1:offset=1[v0];[1:v]xfade=transition=wiperight:duration=1:offset=1[v1];[2:v]xfade=transition=circlecrop:duration=1:offset=1[v2]; [3:v]xfade=transition=fadewhite:duration=1:offset=1[v3];[v0][v1][v2][v3]concat=n=4:v=1:a=0,format=yuv420p[v]\" -map \"[v]\" -y $mergeImages";
// 执行 FFMpeg 命令
$output = exec($ffmpeg_command);
// 检查命令执行结果
if ($output === "") {
echo "多张图片合并为一个视频成功!";
} else {
echo "多张图片合并为一个视频失败:$output";
}
}
// 命令行可执行
/*ffmpeg -i 1.mp4 -i img1.jpg -i img2.jpg -filter_complex [1:v]scale=100:100[img1];[2:v]scale=1280:720[img2];[0:v][img1]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2[bkg];[bkg][img2]overlay=0:0 -y output114.mp4*/
//图片合并,并添加转场效果
/*ffmpeg -loop 1 -t 3 -i img1.jpg -loop 1 -t 3 -i img1.jpg -loop 1 -t 3 -i img1.jpg -loop 1 -t 3 -i img1.jpg -loop 1 -t 3 -i img1.jpg -filter_complex "[0][1]xfade=transition=circlecrop:duration=2:offset=2.5[f0];[f0][2]xfade=transition=smoothleft:duration=2:offset=5[f1];[f1][3]xfade=transition=pixelize:duration=2:offset=7.5[f2];[f2][4]xfade=transition=hblur:duration=2:offset=10[f3]" -map "[f3]" -r 25 -pix_fmt yuv420p -vcodec libx264 output-swipe-custom4.mp4*/
/*ffmpeg -i 1.mp4 -i 1.mp4 -i 1.mp4 -i 1.mp4 -i 1.mp4 -filter_complex "[0][1:v]xfade=transition=fade:duration=1:offset=3[vfade1]; [vfade1][2:v]xfade=transition=fade:duration=1:offset=10[vfade2];[vfade2][3:v]xfade=transition=fade:duration=1:offset=21[vfade3]; [vfade3][4:v]xfade=transition=fade:duration=1:offset=25,format=yuv420p;[0:a][1:a]acrossfade=d=1[afade1];[afade1][2:a]acrossfade=d=1[afade2]; [afade2][3:a]acrossfade=d=1[afade3]; [afade3][4:a]acrossfade=d=1" -movflags +faststart output-swipe-custom5.mp4*/
/*ffmpeg -t 5 -i img1.jpg -t 5 -i img2.jpg -t 5 -i img3.jpg -t 5 -i img4.jpg -filter_complex "[0:v]zoompan=z='if(lte(zoom,1.0),1.5,max(1.001,zoom-0.0015))':d=125,fade=t=out:st=4:d=1[v0]; [1:v]zoompan=z='if(lte(zoom,1.0),1.5,max(1.001,zoom-0.0015))':d=125,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v1];[2:v]zoompan=z='if(lte(zoom,1.0),1.5,max(1.001,zoom-0.0015))':d=125,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2];[3:v]zoompan=z='if(lte(zoom,1.0),1.5,max(1.001,zoom-0.0015))':d=125,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; [v0][v1][v2][v3]concat=n=4:v=1:a=0,format=yuv420p[v]" -map "[v]" -s "800x450" -t 40 output-swipe-custom6.mp4*/
//多张图片合并转场
//ffmpeg -loop 1 -t 3 -i img4.jpg -loop 1 -t 3 -i img5.jpg -loop 1 -t 3 -i img6.jpg -loop 1 -t 3 -i img7.jpg -loop 1 -t 3 -i img5.jpg -filter_complex "[0:v]xfade=transition=wipeleft:duration=1:offset=1[v0];[1:v]xfade=transition=wiperight:duration=1:offset=1[v1];[2:v]xfade=transition=circlecrop:duration=1:offset=1[v2]; [3:v]xfade=transition=fadewhite:duration=1:offset=1[v3];[v0][v1][v2][v3]concat=n=4:v=1:a=0,format=yuv420p[v]" -map "[v]" -y output-swipe-custom3.mp4
//ffmpeg -loop 1 -t 5 -i img4.jpg -loop 1 -t 5 -i img5.jpg -filter_complex "[0][1]xfade=transition=fadeblack:duration=2:offset=3,format=yuv420p" output122.mp4
//ffmpeg -loop 1 -t 5 -i img4.jpg -loop 1 -t 5 -i img5.jpg -loop 1 -t 5 -i img4.jpg -filter_complex "[0][1]xfade=transition=fadeblack:duration=2:offset=3;[1][2]xfade=transition=fadeblack:duration=2:offset=3;" output131.mp4
//视频添加转场
public function addZhuanChang()
{
// 混剪后的视频文件路径
// 构建 FFMpeg 命令
//$ffmpeg_command = "ffmpeg -i $inFile -vf subtitles=$subtitles $outFile";
// -i 输入
// -i 输入
//$ffmpeg_command = "ffmpeg -i 1.mp4 -i 5.mp4 -filter_complex \"[0:v][1:v]blend=all_mode=1:all_opacity=0.5[transitions]\" -map \"[transitions]\" 1001.mp4";
//$ffmpeg_command = "ffmpeg -i 1.mp4 -i 5.mp4 -filter_complex \"[0:v][1:v]crossfade=d=1[transitions]\" -map \"[transitions]\" addZhuanChang1.mp4";
//$ffmpeg_command = "ffmpeg -i 1.mp4 -i 5.mp4 -filter_complex \"xfade=transition=rectcrop:duration=1:offset=1\" -y t1.mp4";
//$ffmpeg_command = "ffmpeg -i 1.mp4 -vf fade=t=in:s=0:d=1 -y out1.mp4";
//$ffmpeg_command = "ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex xfade=transition=fade:duration=2:offset=4 output11.mp4";//可行
//$ffmpeg_command = "ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex \"[0:v]setpts=PTS-STARTPTS[v1];[v1][1:v]setpts=PTS+STARTPTS[vt]\" -map \"[vt]\" output11.mp4";
//$ffmpeg_command = "ffmpeg -i 2.mp4 -vf \"hflip\" output14.mp4";//可行,视频水平翻转
//$ffmpeg_command = "ffmpeg -i 1.mp4 -vf \"vflip\" output15.mp4";//可行,视频垂直翻转
$ffmpeg_command = "ffmpeg -loop 1 -t 5 -i img4.jpg -loop 1 -t 5 -i img5.jpg -filter_complex \"[0][1]xfade=transition=circlecrop:duration=2:offset=3,format=yuv420p\" output126.mp4";//可行,视频垂直翻转
// ffmpeg -f lavfi -i "color=c=blue:s=180x136:r=15:d=2,format=rgb24,drawtext=text='fadeblack':x=(w-text_w)/2:y=(h-text_h)/2:box=1:boxborderw=4:boxcolor=white:fontfile=/usr/share/fonts/TTF/VeraMono.ttf:fontsize=20" -f lavfi -i "color=c=aqua:s=180x136:r=15:d=2,format=rgb24,drawtext=text='fadeblack':x=(w-text_w)/2:y=(h-text_h)/2:box=1:boxborderw=4:boxcolor=white:fontfile=/usr/share/fonts/TTF/VeraMono.ttf:fontsize=20" -filter_complex "[0][1]xfade=duration=1:offset=1:transition=fadeblack,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" fadeblack.gif
/* $ffmpeg_command = "ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex \\
\"[0:v]scale=640:360:force_original_aspect_ratio=decrease,pad=640:360:(ow-iw)/2:(oh-ih)/2,format=yuva444p,drawbox=enable='between(t,0,20)':x=(w-tw)/2:y=(h-th)/2:w=tw:h=th,format=yuva444p,overlay=W-w-10:H-h-10[v0]; \\
[1:v]scale=640:360:force_original_aspect_ratio=decrease,pad=640:360:(ow-iw)/2:(oh-ih)/2,format=yuva444p,drawbox=enable='between(t,0,20)':x=(w-tw)/2:y=(h-th)/2:w=tw:h=th,format=yuva444p,overlay=W-w-10:H-h-10[v1]; \\
[v0][v1]concat=n=2:v=1:a=0[outv]\" -map \"[outv]\" -c:v libx264 -preset veryfast output17.mp4";*/
try {
// 执行 FFMpeg 命令
$output = exec($ffmpeg_command);dd(8888);
}catch (Exception $e){
dd($e->getMessage());
}
// 检查命令执行结果
if ($output === "") {
echo "添加转场成功!199";
} else {
echo "添加转场失败:$output";
}
}
/*-vf 参数可选的值
-vf参数用于指定视频过滤器(Video Filters),它有很多可选的值,具体的值取决于你想要实现的视频处理效果。以下是一些常见的视频过滤器和它们的作用:
scale:用于调整视频的尺寸。
crop:裁剪视频画面。
rotate:旋转视频。
flip:水平或垂直翻转视频。
colorbalance:调整视频的色彩平衡。
brightness:调整视频的亮度。
contrast:调整视频的对比度。
saturation:调整视频的饱和度。
hue:调整视频的色调。
luma_waveform:应用亮度波形效果。
chrominance:调整视频的色度。
noise:添加噪声效果。
sharpen:使视频变得更加清晰。*/
//视频合并
public function mergeVideo()
{
$video1 = "1.MP4";
$video2 = "5.MP4";
$video3 = "output-swipe-custom11.mp4";
// 混剪后的视频文件路径
$mixed_video = "mixed_video17.mp4";
// 构建 FFMpeg 命令
// $ffmpeg_command = "ffmpeg -i $video1 -i $video3 -i $video2 -filter_complex \"[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=3:v=1:a=1[v][a]\" -map \"[v]\" -map \"[a]\" -c:a null $mixed_video";
//ffmpeg -loop 1 -t 3 -i img4.jpg -loop 1 -t 3 -i img5.jpg -loop 1 -t 3 -i img6.jpg -loop 1 -t 3 -i img7.jpg -loop 1 -t 3 -i img5.jpg -filter_complex "[0:v]xfade=transition=wipeleft:duration=1:offset=1[v0];[1:v]xfade=transition=wiperight:duration=1:offset=1[v1];[2:v]xfade=transition=circlecrop:duration=1:offset=1[v2]; [3:v]xfade=transition=fadewhite:duration=1:offset=1[v3];[v0][v1][v2][v3]concat=n=4:v=1:a=0,format=yuv420p[v]" -map "[v]" -y output-swipe-custom3.mp4
//多个视频合并,分辨率不同适配
$ffmpeg_command = "ffmpeg -i $video3 -i $video2 -i $video1 -filter_complex \"[0:v:0]scale=654:500:force_original_aspect_ratio=decrease,setsar=1,pad=654:500:(ow-iw)/2:(oh-ih)/2[v0];[1:v:0]scale=654:500:force_original_aspect_ratio=decrease,setsar=1,pad=654:500:(ow-iw)/2:(oh-ih)/2[v1];[2:v:0]scale=654:500:force_original_aspect_ratio=decrease,setsar=1,pad=654:500:(ow-iw)/2:(oh-ih)/2[v2];[v0][v1][v2]concat=n=3:v=1:a=0[outv]\" -map \"[outv]\" $mixed_video";
// 执行 FFMpeg 命令
$output = exec($ffmpeg_command);
// 检查命令执行结果
if ($output === "") {
echo "视频混剪成功!";
} else {
echo "视频混剪失败:$output";
}
}
// 添加标题
public function addSubtitles()
{
// 混剪后的视频文件路径
$inFile = "mergeImages4.mp4";
$outFile = "output-swipe-custom10.mp4";
$subtitles = "title.srt";
// 构建 FFMpeg 命令
//$ffmpeg_command = "ffmpeg -i $inFile -vf subtitles=$subtitles $outFile";
/* Alignment=1: 屏幕下方左对齐 (Bottom Left)
Alignment=2: 屏幕下方居中 (Bottom Center)
Alignment=3: 屏幕下方右对齐 (Bottom Right)
Alignment=5: 屏幕上间左对齐 (Top Left)
Alignment=6: 屏幕上间居中 (Top Center)
Alignment=7: 屏幕上间右对齐 (Top Right)
Alignment=9: 屏幕中间左对齐 (Middle Left)
Alignment=10: 屏幕中间居中 (Middle Center)
Alignment=11: 屏幕中间右对齐 (Middle Right)*/
$ffmpeg_command = "ffmpeg -i $inFile -i title.srt -filter_complex \"subtitles=$subtitles:force_style='Fontsize=20,PrimaryColour=0xFFFFFF,Alignment=6'\" -c:v libx264 -c:a copy $outFile";
//$ffmpeg_command = "ffmpeg -i $inFile -vcodec copy -acodec copy -metadata title=\"My Video Title\" $outFile";
// 执行 FFMpeg 命令
$output = exec($ffmpeg_command);
// 检查命令执行结果
if ($output === "") {
echo "添加标题成功!";
} else {
echo "添加标题失败:$output";
}
}
//添加字幕
public function addCaptions()
{
// 混剪后的视频文件路径
$inFile = "output-swipe-custom10.mp4";
$outFile = "output-swipe-custom102.mp4";
$subtitles = "subtitles.srt";
// 构建 FFMpeg 命令
//$ffmpeg_command = "ffmpeg -i $inFile -vf subtitles=$subtitles $outFile";
/* Alignment=1: 屏幕下方左对齐 (Bottom Left)
Alignment=2: 屏幕下方居中 (Bottom Center)
Alignment=3: 屏幕下方右对齐 (Bottom Right)
Alignment=5: 屏幕上间左对齐 (Top Left)
Alignment=6: 屏幕上间居中 (Top Center)
Alignment=7: 屏幕上间右对齐 (Top Right)
Alignment=9: 屏幕中间左对齐 (Middle Left)
Alignment=10: 屏幕中间居中 (Middle Center)
Alignment=11: 屏幕中间右对齐 (Middle Right)*/
$ffmpeg_command = "ffmpeg -i $inFile -i title.srt -filter_complex \"subtitles=$subtitles:force_style='Fontsize=10,PrimaryColour=0xFFFFFF,Alignment=2'\" -c:v libx264 -c:a copy $outFile";
//$ffmpeg_command = "ffmpeg -i $inFile -vcodec copy -acodec copy -metadata title=\"My Video Title\" $outFile";
// 执行 FFMpeg 命令
$output = exec($ffmpeg_command);
// 检查命令执行结果
if ($output === "") {
echo "添加字幕成功!";
} else {
echo "添加字幕失败:$output";
}
}
//视频切割
public function videoSegment()
{
// 混剪后的视频文件路径
// 构建 FFMpeg 命令
// $ffmpeg_command = "ffmpeg -i 3.mp4 -c copy -f segment -segment_time 00:00:06 segment_%03d.mp4";
$arr = [
"ffmpeg -i mergeImages1.mp4 -ss 00:00:00 -to 00:00:06 -c copy output5.mp4",
"ffmpeg -i mergeImages1.mp4 -ss 00:00:07 -to 00:00:13 -c copy output2.mp4",
"ffmpeg -i mergeImages1.mp4 -ss 00:00:14 -to 00:00:20 -c copy output3.mp4",
"ffmpeg -i mergeImages1.mp4 -ss 00:00:21 -to 00:00:27 -c copy output4.mp4",
];
foreach ($arr as $item) {
$output = exec($item);
}
// 执行 FFMpeg 命令
// 检查命令执行结果
if ($output === "") {
echo "切分成功!";
} else {
echo "切分失败:$output";
}
}
}