ffmpeg实现视频拼接,图片生成视频demo

利用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";
        }

    }


}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值