如何在PHP-FFMpeg中实现filter_complex?附FFmpeg命令示例
在PHP-FFMpeg中实现filter_complex拼接视频片段
嘿,我帮你把这条FFmpeg命令转换成PHP-FFMpeg里的filter_complex实现,直接就能用啦!先拆解下原命令的逻辑:它把视频里4个1秒的片段分成两组拼接,最后再把两组合并成最终输出。下面是对应的代码和细节说明:
require 'vendor/autoload.php'; use FFMpeg\FFMpeg; use FFMpeg\Filters\Video\ComplexFilter; // 初始化FFMpeg实例(根据你的服务器环境调整路径) $ffmpeg = FFMpeg::create([ 'ffmpeg.binaries' => '/usr/bin/ffmpeg', 'ffprobe.binaries' => '/usr/bin/ffprobe', ]); // 加载输入视频文件 $video = $ffmpeg->open('test.mp4'); // 创建复杂滤镜容器 $complexFilter = new ComplexFilter(); // 对应原命令:[0:v]trim=start=10:end=11,setpts=PTS-STARTPTS[a] $trim1 = $video->getStream('v')->addFilter('trim=start=10:end=11'); $trim1->addFilter('setpts=PTS-STARTPTS')->setAlias('a'); $complexFilter->addStream($trim1); // 对应原命令:[0:v]trim=start=20:end=21,setpts=PTS-STARTPTS[b] $trim2 = $video->getStream('v')->addFilter('trim=start=20:end=21'); $trim2->addFilter('setpts=PTS-STARTPTS')->setAlias('b'); $complexFilter->addStream($trim2); // 对应原命令:[a][b]concat[c] $concatGroup1 = $complexFilter->addFilter('concat=n=2:v=1:a=0')->setAlias('c'); $concatGroup1->addInput('a')->addInput('b'); // 对应原命令:[0:v]trim=start=30:end=31,setpts=PTS-STARTPTS[d] $trim3 = $video->getStream('v')->addFilter('trim=start=30:end=31'); $trim3->addFilter('setpts=PTS-STARTPTS')->setAlias('d'); $complexFilter->addStream($trim3); // 对应原命令:[0:v]trim=start=40:end=41,setpts=PTS-STARTPTS[f] $trim4 = $video->getStream('v')->addFilter('trim=start=40:end=41'); $trim4->addFilter('setpts=PTS-STARTPTS')->setAlias('f'); $complexFilter->addStream($trim4); // 对应原命令:[d][f]concat[g] $concatGroup2 = $complexFilter->addFilter('concat=n=2:v=1:a=0')->setAlias('g'); $concatGroup2->addInput('d')->addInput('f'); // 对应原命令:[c][g]concat[out1] $finalConcat = $complexFilter->addFilter('concat=n=2:v=1:a=0')->setAlias('out1'); $finalConcat->addInput('c')->addInput('g'); // 应用滤镜并输出结果 $video->addFilter($complexFilter); $video->save(new \FFMpeg\Format\Video\X264(), 'testout.mp4');
关键细节说明:
- 每个
trim+setpts组合对应原命令里的片段提取,用setAlias来标记原命令中的[a]、[b]等别名,确保滤镜链的输入输出能正确匹配; concat滤镜的参数n=2表示输入流数量,v=1表示只处理视频流,a=0表示忽略音频(如果需要保留音频,可改为a=1,并同步处理音频流的裁切和拼接);- 初始化FFMpeg时的路径要根据你的环境调整,Windows环境下路径类似
C:/ffmpeg/bin/ffmpeg.exe; - 如果运行报错,优先检查FFmpeg日志,大概率是滤镜参数或别名匹配的问题。
内容的提问来源于stack exchange,提问作者Sergey Kozlov
相关产品推荐
相关产品推荐

